Giới thiệu
Kíp là một ngôn ngữ lập trình bí truyền dựa trên ngăn xếp được phát minh bởi Rune Berg vào tháng 3 năm 2003.
Kíp có 27 ngăn xếp, 4 toán tử và cấu trúc điều khiển.
Ngăn xếp
Các ngăn xếp được đặt tên a
- z
và chứa các số nguyên có chữ ký 32 bit. Ngoài ra còn có một ngăn xếp đặc biệt @
, để làm cho đầu ra số thuận tiện hơn. Khi một số được đẩy lên @
, các giá trị ASCII của các chữ số đó thực tế được đẩy thay thế. (Ví dụ: nếu bạn đẩy 12 đến @
, nó sẽ đẩy 49 và sau đó 50 để @
thay thế.)
Đầu vào được đẩy lên ngăn xếp đầu vào i
trước khi chương trình được thực thi. Trình thông dịch sẽ yêu cầu các giá trị để lưu trữ i
trước khi thực hiện. Sau khi thực hiện kết thúc, mọi thứ trên ngăn xếp đầu ra o
sẽ được bật thành đầu ra dưới dạng ký tự ASCII. Vì đây là cơ chế IO duy nhất của Kíp, nên việc tương tác với chương trình Kíp là không thể.
Người vận hành
Một toán hạng là một định danh ngăn xếp hoặc một số nguyên 32 bit đã ký.
Đẩy: >
hoặc<
Cú pháp: Operand>StackIndentifier
hoặcStackIndentifier<Operand
Toán tử Push đưa toán hạng sang trái và đẩy nó vào ngăn xếp đã chỉ định. Ví dụ, 12>a
sẽ đẩy giá trị 12 lên ngăn xếp a
. a>b
sẽ bật giá trị trên cùng từ ngăn xếp a
và đẩy nó lên ngăn xếp b
. Popping một ngăn xếp trống luôn trả về 0. a<b
tương đương với b>a
. a<b>c
bật giá trị cao nhất từ b
và đẩy đến cả hai c
và a
.
Thêm vào: +
Cú pháp: StackIndentifier+Operand
Toán tử Add đẩy tổng của mục trên cùng trên ngăn xếp và toán hạng lên ngăn xếp. Nếu toán hạng là một ngăn xếp, thì giá trị được bật ra từ nó. Ví dụ: nếu giá trị trên cùng của ngăn xếp a
là 1, thì a+2
sẽ đẩy 3 lên trên nó. Nếu a
trống, sau đó a+2
sẽ đẩy 2 lên nó. Nếu các giá trị trên cùng của ngăn xếp a
và b
là 1 và 2, thì a+b
sẽ bật giá trị 2 từ ngăn xếp b
và đẩy 3 lên ngăn xếp a
.
Trừ đi: -
Cú pháp: StackIndentifier-Operand
Toán tử Subtract hoạt động chính xác như toán tử Add, ngoại trừ việc nó trừ thay vì thêm.
Thông thoáng: ?
Cú pháp: StackIndentifier?
Toán tử Clear làm trống ngăn xếp nếu mục trên cùng của nó là 0.
Trình thông dịch sẽ bỏ qua mọi thứ không nằm cạnh toán tử, vì vậy chương trình sau sẽ hoạt động : a+2 this will be ignored c<i
. Tuy nhiên, cách thích hợp để thêm nhận xét là sử dụng #
ký tự. Bất cứ điều gì giữa một #
và một ký tự cuối dòng được loại bỏ trước khi thực hiện. Ký tự ASCII # 10 được định nghĩa là dòng cuối trong Kíp.
Toán tử có thể được chia sẻ bởi hai toán tử, ví dụ a>b c>b c?
có thể được viết là a>b<c?
.
Chương trình 1>a<2 a+a
sẽ dẫn đến việc a
chứa các giá trị [1 4]
(từ dưới lên trên) và không [1 3]
. Tương tự như vậy cho các -
nhà điều hành.
Cấu trúc điều khiển
Chỉ có một cấu trúc điều khiển trong Kíp: vòng lặp.
Cú pháp: (StackIndentifier code )
Miễn là ngăn xếp được chỉ định không trống, mã trong ngoặc đơn phù hợp sẽ được lặp lại. Vòng lặp có thể chứa các vòng lặp khác. Ví dụ, (a a>b)
sẽ di chuyển tất cả các giá trị của ngăn xếp a
lên ngăn xếp b
, mặc dù thứ tự sẽ bị đảo ngược . Một chức năng giống hệt nhau, nhưng thanh lịch hơn để làm điều này là (a>b)
.
Ví dụ
100>@ (@>o)
Điều này sẽ xuất 100
33>o 100>o 108>o 114>o 111>o 87>o 32>o 111>o 108>o 108>o 101>o 72>o
Điều này sẽ in "Hello World!"
. Khi o
ngăn xếp đang được xuất ra, nó bắt đầu bật các ký tự từ đầu ngăn xếp xuống dưới cùng.
#prime.k by Jannis Harder
u<200
#change 200
k<2>m
u-2
(u-1 u>t u>z u<t
(k>e e+0 e>r)
(e>k)
m+1
m>t
m>z
m<t
t<0>z? t?
1>g
(r>b
m+0 m>a
b+0 b>w
(a-1
b+0 b>j
j?
1>s
(j<0>s j?)
s?
(s<0 w+0 w>b s?)
a>t
a>z
t>a
b-1
b>t
b>z
t>b
z<0>t? z?
a?)
b?
1>p
(b<0 b? 0>p)
p?
(p 0>r? 0>p? 0>g)
)
g?
(g m+0 m>k 0>g?)
u?)
(k>@
10>o
(@>o)
)
Đây là một trình tạo số nguyên tố, nhưng tôi không chắc nó hoạt động như thế nào.
Quy tắc
Bạn phải viết một chương trình / chức năng diễn giải Kíp. Chương trình / chức năng này có thể nhận được chương trình Kíp thông qua tệp nguồn hoặc lấy trực tiếp qua STDIN từ người dùng. Nếu STDIN không có sẵn, nó phải lấy nó từ đầu vào bàn phím và tiếp tục nhận đầu vào cho đến khi nhập một ký tự không thể in cụ thể. Ví dụ: nếu trình thông dịch của bạn được viết bằng mã máy x86, nó sẽ lấy ký tự chương trình Kíp theo ký tự từ bàn phím và tiếp tục làm như vậy cho đến khi esc(hoặc bất kỳ phím nào khác không phát ra ký tự có thể in) được nhấn.
Nếu có lỗi, ví dụ như lỗi cú pháp hoặc lỗi tràn ngăn xếp, nó phải thừa nhận theo một cách nào đó, ví dụ bằng cách trả về 10 thay vì 0 hoặc thông báo lỗi do trình thông dịch / trình biên dịch tạo ra, NHƯNG KHÔNG IN THÔNG ĐIỆP LRI .
Bất kỳ quy tắc thông thường khác cho mã golf áp dụng cho thử thách này.
Mã của bạn sẽ được kiểm tra với một số ví dụ trong kho lưu trữ mẫu của Kíp
Đây là một mã golf . Mã ngắn nhất tính bằng byte sẽ giành chiến thắng. Chúc may mắn!
Lưu ý rằng có một toán tử tùy chọn trong Kíp, "
nhưng nó không phải là một phần của đặc tả và chỉ là một tính năng bổ sung trong trình thông dịch chính thức. Tôi đã không đề cập đến nó ở đây vì vậy nó không cần phải được hỗ trợ trong trình của bạn.
Nếu bạn có bất kỳ nghi ngờ nào về bất kỳ phần nào của đặc tả, bạn có thể kiểm tra nó với trình thông dịch chính thức được viết bằng Java . Điều này sẽ tải xuống một tệp zip chứa chương trình biên dịch và mã nguồn. Nó được cấp phép theo GPL.
i
nếu tôi lấy chương trình nguồn từ stdin?