您在Whitespace打高尔夫球有哪些一般提示?我正在寻找可以应用于代码高尔夫球问题的想法,并且这些想法至少也特定于Whitespace(例如,“删除注释”不是答案)。
请为每个答案发布一个提示。
您在Whitespace打高尔夫球有哪些一般提示?我正在寻找可以应用于代码高尔夫球问题的想法,并且这些想法至少也特定于Whitespace(例如,“删除注释”不是答案)。
请为每个答案发布一个提示。
Answers:
我不确定这是否是个玩笑的问题,所以我希望我不要因为认真对待它而受到嘲笑,但是...
规范说,程序应以三个换行符结尾[LF][LF][LF]
,其中第一个是流控制IMP,第二个是quit命令,但是许多解释器只会在没有正确结尾的情况下运行您的代码。在任何程序中均可为您节省3个字符。
我过去经常使用堆来计数我的循环之类的东西,但是意识到它实际上效率极低。首先推送一个地址,获取当前计数,增加/添加一个,重新推送地址,等等。
现在,我只是将一个值压入堆栈以充当循环计数器,然后[Space][LF][Tab]
在需要时使用swap命令返回它。这需要大量的工作,但是当您获得它时,确实可以减少字符数。
[LF][Space][Space][LF]
(流控制-用标签“''标记”)将创建一个空标签,该标签是跳转或子例程调用的有效目标。这样可以在声明标签时节省一个字节,并在每次调用时节省一个字节。
感谢@LukStorms,谁在使用类似的方法他的回答为你好世界的挑战。
(分别STN
用于空格,制表符和换行符。)
压入字母的值始终为11个字节(即,压入字符'A'的值65是SSSTSSSSSTN
;压入字符'z'的值122是SSSTTTTSTSN
)。当您要输出大量文本时,这可能会很昂贵。相反,您可以将要打印的所有字符的值降低固定量,然后在循环打印它们时将其添加此固定量。
这可以通过以下代码完成(在这种情况下,假设固定值为100):
NSSN
(创建Label_0;基本上开始循环)
SSSTTSSTSSN
(按固定金额100)TSSS
(将堆栈的前两个值相加)TNSS
(弹出并打印现在正确的值作为字符)NSNN
(跳至Label_0;转到循环的下一个迭代)尝试在堆栈上仅执行Add()操作时,它将以错误(根据meta允许)停止程序TSSS
。我用它来解决我的这个问题(请参阅我为降低字节数所做的事情的项目5和6 )。
固定数量100是否是最短的方法,取决于您要打印的内容。例如,@ LukStorm在“ Hello World”答案中使用了107。
请注意,除此之外,仍然可以使用复制SNS
两个相同相邻字符(如l
in Hello
)的最高值(),或从其他位置复制值来获取更多字节。
这开始涉及特定于实现的行为,但是我相信这是允许的。
尝试跳转到不存在的标签时,TIO(可能还有其他解释器?至少对ideone不起作用)将停止执行。如果需要进行比较以突破循环,则可以通过不声明中断标签来节省字节。(有关示例,请参见我对“打印不可见文本 ”的评论。)
(分别STN
用于空格,制表符和换行符。)
STS
+数量参数可以被用来在复制 Ñ 个项堆栈(由给定参数)到堆栈的顶部上。在某些情况下,这可以用来节省字节。
例如,在我的答案中,我在《第四件事》中做了解释,我降低了字节计数,比复制第STSSTN
12个(创建0索引)值()比按12创建字符'p'(SSSTTSSN
)要短。在"pop"
输出的一部分中。(注意:对于字符“ p”,我使用值12而不是112,因为我应用了另一种技巧,将所有值降低固定的数量,这是在循环中打印字符之前添加的。)