Starry是一种有趣的深奥编程语言,其中的代码仅+*.,`'
由每个字符所代表的实际命令由其前面的空格数确定。即使对于高尔夫球的固定输出挑战,这也使它变得棘手,因为不同的命令可以占用非常不同的字节数。特别是,数字文字具有一元表示形式,因此有必要通过对较小的数字进行运算来建立较大的数字。
因此,这个挑战是关于编写可以打高尔夫球这样的Starry程序的程序。
星空如何运作?
(在esolangs上未指定一些细节,因此我将继续使用Ruby解释器的行为。)
Starry是一种基于堆栈的语言,具有一堆任意精度的整数值(最初为空)。
唯一有意义的字符是:
+*.,`'
和空格。所有其他字符将被忽略。每个空格序列后跟那些非空格字符之一代表一条指令。类型指令的依赖于非空格字符和数字的空格。
这些说明是:
Spaces Symbol Meaning
0 + Invalid opcode.
1 + Duplicate top of stack.
2 + Swap top 2 stack elements.
3 + Rotate top 3 stack elements. That is, send the top stack element
two positions down. [... 1 2 3] becomes [... 3 1 2].
4 + Pop and discard top of stack.
n ≥ 5 + Push n − 5 to stack.
0 mod 5 * Pop y, pop x, push x + y.
1 mod 5 * Pop y, pop x, push x − y.
2 mod 5 * Pop y, pop x, push x * y.
3 mod 5 * Pop y, pop x, push x / y, rounded towards -∞.
4 mod 5 * Pop y, pop x, push x % y. The sign of the result matches the sign of y.
0 mod 2 . Pop a value and print it as a decimal number.
1 mod 2 . Pop a value and print it as an ASCII character. This throws an error
if the value is not in the range [0, 255].
n ` Mark label n.
n ' Pop a value; if non-zero, jump to label n.
请注意,解释器在执行开始之前先扫描源代码中的标签,因此可以向前和向后跳转。
当然,Starry也具有输入命令(,
与相似使用.
),但是这些命令与此挑战无关。
挑战
给定一个字符串,生成一个无需输入的Starry程序,并将该字符串精确打印到STDOUT。
您可以编写程序或函数,通过STDIN(或最接近的替代方案),命令行参数或函数自变量获取输入,并通过STDOUT(或最接近的替代方案),函数返回值或函数(out)参数输出结果。
您可以假定该字符串的长度不超过128个字符,并且仅由可打印的ASCII字符(代码点0x20至0x7E)组成。
您的解决方案应在合理的台式机上在不到5分钟的时间内处理任何此类输入(这还有一些余地;如果我的笔记本电脑上花了几分钟,我不介意,但如果花了15分钟,我将失去资格它)。
您的解决方案将在下面列出的许多不同字符串上进行测试。您的分数是相应Starry程序的总字节数。在平局的情况下,最短的metagolfer获胜。也就是说,除非打成平手,否则不要打扰您自己的代码(我认为只有在有最佳解决方案的情况下,这种情况才会发生)。
您不得针对下面列出的特定测试用例优化代码。具体来说,您不应该为它们手工编写解决方案。对结构类似于给定字符串的字符串类进行优化是可以的。如果我怀疑有人使用硬编码解决方案,我保留用部分可比较的结构替换部分或全部测试用例的权利。
测试用例
每行是一个单独的测试用例:
Hello, World!
pneumonoultramicroscopicsilicovolcanoconiosis
.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.
Hickory, dickory, dock. The mouse ran up the clock. The clock struck 1. The mouse ran down. Hickory, dickory, dock.
36912059868043514648560046917066768694455682545071266675083273015450033938555319356951628735735013250100789433961153496780296165
bVZ48121347GLtpYnt76CZSxTpMDs6791EJE808077eySXldY162424ddTB90707UupwlWGb63618542VhA252989453TXrWgqGm85899uHOAY2oAKE198GOVUttvW63
7MYxoWBNt180CDHS5xBGvU70HHVB17bh8jYzIIiU6n6g98Rose1nOe8Svcg56nax20q30kT3Ttb2jHl5q2Iuf1vPbjPxm9cyKXwxc0OUK8pr13b2n7U9Y7RwQTc26A1I
n9}unwxVa}[rj+5em6K#-H@= p^X/:DS]b*Jv/_x4.a5vT/So2R`yKy=in7-15B=g _BD`Bw=Z`Br;UwwF[{q]cS|&i;Gn4)q=`!G]8"eFP`Mn:zt-#mfCV2AL2^fL"A
第二个测试用例的功劳归于Dennis。第四个测试用例的功劳归于Sp3000。
参考解决方案
这是CJam中一个非常基本的参考解决方案:
q{S5*\iS*'+S'.}%
1233
5240
4223
11110
7735
10497
11524
11392
Total: 62954
这是最简单的方法:将每个字符的代码点作为文字输入,然后打印出来。它不使用连续字符,整数打印,字符串的重复部分等之间的微小差异。我将这些东西留给您。
我相信还有很多改进的余地。供参考,最短的手工制作的“ Hello,World!” 只有169个字节长。