99(读作“九十九”)是一种全新的Esoteric编程语言(请不要与99混淆,请注意斜体)。您在此挑战中的任务是为99写一个尽可能短的解释器。字节最少的提交将获胜。Tiebreaker转到第一个发布的提交。
由于这个问题比平时更深入,而且我渴望看到好的答案,因此,我将奖励我最喜欢的答案250 rep赏金(不一定是获胜者)。
99规格
99是命令式语言。99程序中的每一行都是一条语句,并且在执行过程中,指令指针从第一行开始,依次遍历每行后续的行,并一路执行。当执行了最后一行时,程序结束。Goto语句可能会重新路由指令指针的路径。
换行符,空格和9
是在99程序中唯一重要的三个字符。所有其他字符将被完全忽略。此外,每行上的尾随空格都将被忽略,并且一行中的多个空格将被视为一个空格。(“换行符”是指任何常见的换行编码。您的解释器使用哪种都没有关系。)
所以这个程序:
9 BLAH 99 9a9bb9c9
9 this line and the next have 6 trailing spaces 9
与此程序相同:
9 99 9999
9 9
变数
99中的变量都具有一个或多个9
串在一起的名称(9+
在正则表达式中)。例如9
,99
和9999999999
是完全不同的变量。自然地,存在无限多个(除非存在内存限制)。
每个变量的值是一个有符号的任意精度整数。默认情况下,每个变量都分配给自己的数字表示形式。因此,除非已将其重新分配,否则变量的值9
是数字9,变量的值99
是数字99,依此类推。您可以将其视为在将变量明确分配之前将其视为纯数字。
我将V
在下面用于指代任意变量名称。
的每个实例V
可以替换为9
,99
,999
,9999
,等。
陈述
99中有五种不同的语句类型。每行99个程序中的包含一个语句。
此处描述的语法假定所有多余字符均已删除,所有尾随空格均已删除,多个空格的所有序列均已替换为单个空格。
1.无操作
空行是无操作。它什么都不做(除了增加指令指针)。
2.输出
V
V
一行上的单个变量会将其打印到stdout。
如果V
具有的奇数9
(9
,999
等)V
,则将打印除以9 的整数(十进制)。
如果V
具有偶数9
(99
,9999
等),则将打印代码除以9 的ASCII字符V
mod 128。(即(V / 9) % 128
介于0到127之间的值。)
示例:程序
9
9999
将打印1W
。第一行打印1
是因为9/9是1。第二行打印W
是因为9999/9是1111,而1111 mod 128是87,而87是的字符代码W
。
请注意,在输出令牌之间不打印换行符。\n
需要明确打印以换行。
3.输入
V
带有前导空格V
的行上的单个变量从stdin获取输入并将其存储在该变量中。
如果V
具有的奇数,9
则用户可以键入任何带符号的整数,V
并将其设置为该值的9倍。
如果V
偶数为,9
则用户可以键入任何ASCII字符,V
并将其设置为其字符代码的9倍。
示例:给定-57
并A
作为输入,此程序
9
9
99
99
将输出-57A
。在内部,该变量9
的值将为-513,而99
其值将为585。
您的口译员可能会假设输入在语法上始终是有效的。
4.作业
该语句可以任意长。它是一行上的两个或多个变量,以空格分隔:
V1 V2 V3 V4 V5 ...
这会将所有具有偶数索引的的总和减去具有奇数索引的的总和(不包括)。分配是按值而不是参考。V1
V
V
V1
它可以翻译成大多数语言 V1 = V2 - V3 + V4 - V5 + ...
。
因此,如果只有两个变量,则为正常分配:
V1 V2
→ V1 = V2
如果有三个,则减去:
V1 V2 V3
→ V1 = V2 - V3
和+
/ -
迹象保持与每个额外的变量来回切换:
V1 V2 V3 V4
→ V1 = V2 - V3 + V4
示例:该程序将输出1110123
:
999 Prints triple-nine divided by nine (111).
999 9 9 Assigns triple-nine to zero (nine minus nine).
999 Prints triple-nine divided by nine (0)
9 999 9 Assigns single-nine to negative nine (zero minus nine).
999 999 9 Adds nine to triple-nine (really subtracts negative nine).
999 Prints triple-nine divided by nine (1).
999 999 9 Adds nine to triple-nine (really subtracts negative nine).
999 Prints triple-nine divided by nine (2).
999 999 9 Adds nine to triple-nine (really subtracts negative nine).
999 Prints triple-nine divided by nine (3).
5.转到(如果全为零则跳转)
该语句也可以任意长。它是一行中的两个或多个变量,以空格隔开,并带有前导空格:
V1 V2 V3 V4 V5 ...
如果某些值不是零,则其行为就像无操作。指令指针照常移至下一行。V1
如果除此之外的所有值均为零,则指令指针将移至行号。这些行的索引为零,因此如果为零,则指针将移至第一行。如果为负或大于最大可能索引(行数减一),程序将终止(通常无错误)。V1
V1
V1
V1
请注意,此处未除以9。并且由于不可能使变量的值不是9的倍数,因此只能跳到9的倍数的行号。V1
例子:
该程序将1
永久打印:
9 Prints single-nine divided by nine (always 1).
99 9 9 Assigns double-nine to zero.
99 99 Jumps to line zero (top line) if double-nine is zero.
这个程序
99999999 Print G.
999 99 Set triple-nine to ninety-nine.
9999999999 9999999999 9999999999 99 99 9 9 999 999 Set 10-nine to zero.
99999999999 9999999999 Set 11-nine to zero.
999 Print triple-nine's value divided by nine. (This is the ninth line.)
99999999 Print G.
999 999 9 Subtract nine from triple-nine.
99999 999 Jump to line 5-nines if triple-nine is zero (ends program).
9 99999999999 9999999999 Jump to line nine if 10-nine and 11-nine are zero (always jumps).
会以降序输出数字11到1,并用括起来G
:
G11G10G9G8G7G6G5G4G3G2G1G
额外细节
理想的解释器将与99一起从命令行运行程序文件名作为参数。I / O也将在命令行中即时完成。
但是,您可能只编写了一个解释器函数,该函数将程序作为字符串以及输入标记(例如["-57", "A"]
)的列表接收。该函数应打印或返回输出字符串。
如果您的语言无法使用这些选项,则运行解释器和处理I / O的方式略有不同。
奖励:在99中写一些很酷的东西,我很乐意将其作为示例。
希望您喜欢我的第99个挑战!:D