在空白区域打高尔夫球的技巧


14

您在Whitespace打高尔夫球有哪些一般提示?我正在寻找可以应用于代码高尔夫球问题的想法,并且这些想法至少也特定于Whitespace(例如,“删除注释”不是答案)。

请为每个答案发布一个提示。


82
删除不必要的空格。
KSFT 2015年

1
s / [^ [:space:]] // g
Digital Trauma 2015年

Answers:


11

我不确定这是否是个玩笑的问题,所以我希望我不要因为认真对待它而受到嘲笑,但是...

提示1:不要结束程序

规范说,程序应以三个换行符结尾[LF][LF][LF],其中第一个是流控制IMP,第二个是quit命令,但是许多解释器只会在没有正确结尾的情况下运行您的代码。在任何程序中均可为您节省3个字符。


6

提示2:尽量少使用堆

我过去经常使用堆来计数我的循环之类的东西,但是意识到它实际上效率极低。首先推送一个地址,获取当前计数,增加/添加一个,重新推送地址,等等。

现在,我只是将一个值压入堆栈以充当循环计数器,然后[Space][LF][Tab]在需要时使用swap命令返回它。这需要大量的工作,但是当您获得它时,确实可以减少字符数。


5

使用任意堆地址

许多解释器允许您读取/写入任意堆地址,而不是从0或1开始并递增计数。您可以复制现有堆栈值(3个字节)以用作地址,而不必推送新值(至少4个字节)


+1。请注意,这仅适用于非负堆地址。因此,如果堆栈的顶部是负整数,则不能将其用作堆地址。
凯文·克鲁伊森

5

空序列是有效标签

[LF][Space][Space][LF](流控制-用标签“''标记”)将创建一个空标签,该标签是跳转或子例程调用的有效目标。这样可以在声明标签时节省一个字节,并在每次调用时节省一个字节。

在空格答案中观察到实现真机


5

将所有字符降低固定数量,并在循环打印之前立即添加

感谢@LukStorms,谁在使用类似的方法他的回答为你好世界的挑战

(分别STN用于空格,制表符和换行符。)

压入字母的值始终为11个字节(即,压入字符'A'的值65是SSSTSSSSSTN;压入字符'z'的值122是SSSTTTTSTSN)。当您要输出大量文本时,这可能会很昂贵。相反,您可以将要打印的所有字符的值降低固定量,然后在循环打印它们时将其添加此固定量。

这可以通过以下代码完成(在这种情况下,假设固定值为100):

  1. 以相反的顺序推送字符的所有值(减去固定值100)
  2. NSSN (创建Label_0;基本上开始循环)
    1. SSSTTSSTSSN (按固定金额100)
    2. TSSS (将堆栈的前两个值相加)
    3. TNSS (弹出并打印现在正确的值作为字符)
    4. NSNN (跳至Label_0;转到循环的下一个迭代)

尝试在堆栈上仅执行Add()操作时,它将以错误(根据meta允许)停止程序TSSS我用它来解决我的这个问题(请参阅我为降低字节数所做事情的项目5和6 )。

固定数量100是否是最短的方法,取决于您要打印的内容。例如,@ LukStorm在“ Hello World”答案中使用了107。

请注意,除此之外,仍然可以使用复制SNS两个相同相邻字符(如lin Hello)的最高值(),或从其他位置复制值来获取更多字节。


4

跳转到未定义的标签会结束程序(在某些解释器中)

这开始涉及特定于实现的行为,但是我相信这是允许的

尝试跳转到不存在的标签时,TIO(可能还有其他解释器?至少对ideone不起作用)将停止执行。如果需要进行比较以突破循环,则可以通过不声明中断标签来节省字节。(有关示例,请参见我对“打印不可见文本 ”的评论。)


4

可以将值0声明为没有二进制数字的数字

空白教程提到数字可以是任意数量的位/二进制数字宽。这意味着没有位的数字(超出所需的符号位)是值0的有效表示。[Space][Space][Space][LF]并且[Space][Space][Space][Space][LF]都将值0推入堆栈,但前者要短一个字节。


0

复制以前的整数可能比创建新的整数短

(分别STN用于空格,制表符和换行符。)

STS+数量参数可以被用来在复制 Ñ 个项堆栈(由给定参数)到堆栈的顶部上。在某些情况下,这可以用来节省字节。

例如,在我的答案中,我在《第四件事》中做了解释,我降低了字节计数,比复制第STSSTN12个(创建0索引)值()比按12创建字符'p'(SSSTTSSN)要短。在"pop"输出的一部分中。(注意:对于字符“ p”,我使用值12而不是112,因为我应用了另一种技巧,将所有值降低固定的数量,这是在循环中打印字符之前添加的。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.