介绍
Kipple是Rune Berg于2003年3月发明的基于堆栈的深奥编程语言。
Kipple有27个堆栈,4个运算符和一个控制结构。
堆栈
堆栈被命名为a
- z
并包含32位带符号整数。还有一个特殊的堆栈,@
使输出数字更加方便。当将数字压入时@
,实际上将压入该数字的ASCII值。(例如,如果您将12推到@
,它将推49,然后推50。@
)
i
在执行程序之前,将输入压入输入堆栈。解释器将i
在执行之前要求存储值。执行完成后,输出堆栈上的所有内容o
都会弹出以ASCII字符形式输出。由于这是Kipple唯一的IO机制,因此无法与Kipple程序进行交互。
经营者
操作数可以是堆栈标识符或带符号的32位整数。
推送:>
或<
语法:Operand>StackIndentifier
或StackIndentifier<Operand
Push运算符将操作数向左移并将其推入指定的堆栈。例如,12>a
将值12推入stack a
。a>b
将从堆栈中弹出最高值a
并将其推入堆栈b
。弹出空堆栈总是返回0 a<b
相当于b>a
。a<b>c
从弹出最高值,b
并同时推入c
和a
。
加: +
句法: StackIndentifier+Operand
Add运算符将堆栈上最顶层项目和操作数之和压入堆栈。如果操作数是堆栈,则从中弹出值。例如,如果堆栈的最高值为a
1,a+2
则将3压入堆栈。如果a
为空,a+2
则将2推入。如果堆叠的最值a
和b
是1和2,然后a+b
将从栈中弹出的值2 b
和3推入堆栈a
。
减去: -
句法: StackIndentifier-Operand
减法运算符的工作方式与加法运算符完全相同,只是它减去而不是加法。
明确: ?
句法: StackIndentifier?
如果最上面的项目为0,则Clear运算符将清空堆栈。
解释器将忽略操作符旁边不存在的所有内容,因此以下程序将起作用:a+2 this will be ignored c<i
。但是,添加注释的正确方法是使用#
字符。#
执行前,a 和行尾字符之间的所有内容都将被删除。ASCII字符#10在Kipple中定义为行尾。
操作数可以由两个运算符共享,例如a>b c>b c?
可以写为a>b<c?
。
该程序1>a<2 a+a
将导致a
包含值[1 4]
(从下到上),而不是[1 3]
。对于-
操作员也是如此。
控制结构
Kipple中只有一种控制结构:循环。
句法: (StackIndentifier code )
只要指定的堆栈不为空,匹配括号内的代码就会重复。循环可能包含其他循环。例如,(a a>b)
将顺序的所有值都移到stack a
上b
,尽管顺序相反。在功能上相同但更优雅的方法是(a>b)
。
例子
100>@ (@>o)
这将输出 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
这将打印"Hello World!"
。当o
堆栈被输出,它开始从堆栈底部的顶部弹出字符。
#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)
)
这是一个质数生成器,但是我不确定它是如何工作的。
规则
您必须编写一个解释Kipple的程序/函数。该程序/功能可以通过源文件获得Kipple程序,也可以直接从用户通过STDIN获得。如果STDIN不可用,则必须从键盘输入中获取它,然后继续获取输入,直到输入了特定的不可打印字符。例如,如果您的解释器是用x86机器代码编写的,它将从键盘逐个字符地获取Kipple程序字符,并继续这样做直到esc按下(或其他任何不发出可打印字符的键)。
如果存在错误,例如语法错误或堆栈溢出,它必须以某种方式进行确认,例如返回10而不是0或解释器/编译器产生的错误消息,但不打印错误消息。
高尔夫规则的任何其他常规规则都适用于此挑战。
您的代码将通过Kipple样本存档中的一些示例进行测试
这是一个代码高尔夫球。以字节为单位的最短代码将获胜。祝好运!
请注意,Kipple中有一个可选的运算符"
,但它不是规范的一部分,而只是官方解释器的一项附加功能。我在这里没有提到它,因此您的提交中不需要它的支持。
如果对规范的任何部分有疑问,可以使用Java编写的官方解释器进行检查。这将下载一个包含已编译程序和源代码的zip文件。它是根据GPL许可的。
i
如果我从stdin中获取源程序,如何请求输入?