您在视网膜上打高尔夫球有哪些一般提示?我正在寻找可以应用于编码高尔夫问题的想法,这些想法至少在某种程度上是针对视网膜的(例如,“删除评论”不是答案)。请为每个答案发布一个提示。
供参考,在线编译器在此处。
@ Sp3000指出了Regex Golf的技巧。这里的答案应专门针对Retina功能,而不是一般的regex高尔夫技巧。
您在视网膜上打高尔夫球有哪些一般提示?我正在寻找可以应用于编码高尔夫问题的想法,这些想法至少在某种程度上是针对视网膜的(例如,“删除评论”不是答案)。请为每个答案发布一个提示。
供参考,在线编译器在此处。
@ Sp3000指出了Regex Golf的技巧。这里的答案应专门针对Retina功能,而不是一般的regex高尔夫技巧。
Answers:
在非平凡的计算中,您经常会发现使用多个循环来处理数据:
+`stage1
+`stage2
+`stage3
因此,此过程stage1
一直进行到输出收敛stage2
为止,然后直到输出收敛为止,然后直到输出收敛stage3
为止。
但是,始终值得详细检查各个阶段。有时可以以交错方式运行循环stage1, stage2, stage3, stage1, stage2, stage3, ...
(这在很大程度上取决于阶段的实际工作,但有时它们会进行完全正交的更改或作为管道正常工作)。在这种情况下,您可以通过将字节包装在一个循环中来保存字节:
{`stage1
stage2
}`stage3
如果stage1
是程序的第一阶段或stage3
最后阶段,则甚至可以省略这些括号(这意味着已经可以为两个阶段的循环节省字节)。
在此答案中可以看到该技术的最新用途。
n
就像大多数“普通”语言一样,TMTOWTDI(有多种方法可以做到)。我在这里假设输入不包含换行符,并且“拆分”意味着将其拆分为行。但是有两个完全不同的目标:如果字符串的长度不是块长度的倍数,您是否要保留不完整的尾随块还是要舍弃它?
通常,在视网膜中进行拆分的方法有三种。我在这里介绍这三种方法,因为当您尝试使它们适应相关问题时,它们可能会产生更大的影响。您可以使用替换并将换行符附加到每个匹配项:
.{n}
$&¶
这是8个字节(如果n = 2
可以n = 3
,则分别使用..
或,或者少一些...
)。但是,这有一个问题:如果字符串长度是块长度的倍数,它将附加一个换行符。
您还可以使用split阶段,并利用捕获保留在split中的事实:
S_`(.{n})
该_
选项将删除空行,否则这些空行将因匹配项覆盖整个字符串而导致。这是9个字节,但没有添加尾随换行符。因为n = 3
是8个字节,n = 2
所以是7个字节。请注意,如果空行无关紧要,您可以总共节省一个字节(例如,因为您将只处理非空行,并且以后无论如何都要换行):那么您可以删除_
。
第三种选择是使用匹配项。使用该!
选项,我们可以打印所有匹配项。但是,要包括尾随的块,我们需要允许可变的匹配长度:
M!`.{1,n}
这也是9个字节,也不包含尾随换行符。这也成为8个字节用于n = 3
做..?.?
。但是请注意,它减少到6个字节,n = 2
因为现在我们只需要..?
。另请注意M
如果这是程序的最后阶段可以将其删除,无论如何都将节省一个字节。
如果您尝试用替换来完成,这将花费很长的时间,因为您需要用尾随的块替换任何内容(如果有的话)并且也使用拆分。因此,我们可以放心地忽略这些。有趣的是,对于匹配方法,情况恰恰相反:它变得更短:
M!`.{n}
这是7个字节,或更少n = 2
,n = 3
。同样,请注意,您可以省略M
如果这是代码的最后阶段,则。
如果您确实要在此处添加换行符,则可以通过附加 |$
到正则表达式中。
请记住,M
该&
选项具有返回重叠匹配项的功能(使用正则表达式通常无法实现)。这使您可以获取给定长度的字符串的所有重叠块(子字符串):
M!&`.{n}
123456
变得123\n456
和1234567890
变12345\n67890
?
?=
。