视网膜高尔夫技巧


10

您在视网膜上打高尔夫球有哪些一般提示?我正在寻找可以应用于编码高尔夫问题的想法,这些想法至少在某种程度上是针对视网膜的(例如,“删除评论”不是答案)。请为每个答案发布一个提示。

供参考,在线编译器在此处

@ Sp3000指出了Regex Golf的技巧。这里的答案应专门针对Retina功能,而不是一般的regex高尔夫技巧。



嗯,我一直推迟发布此消息,因为Retina仍处于开发阶段,我担心大多数答案最终将成为纯正则表达式高尔夫技巧,而不是Retina特有的。但我想我们还是可以试试吧... :)
Martin Ender

@MartinBüttner自从我开始研究Retina以来,您和其他一些人给了我很多很好的提示和提示,所以我认为大概是时候了。我添加了一个澄清,即常规正则表达式技巧应转到链接的问题。
Digital Trauma

1
@MartinBüttner这是一个好问的地方-我一直想知道-出于好奇,“视网膜”这个名字的灵感是什么?我假设“ Re”部分用于正则表达式,但是“ tina”呢?
Digital Trauma

3
@DigitalTrauma我试图提出一个不错的词来作为首字母缩写词,但失败了。“视网膜”一词与某些尝试非常接近,我喜欢这个词。但我从未设法将其重新缩写为首字母缩写词,此后就放弃了。所以是的,“ re”是“正则表达式”的意思,也许是“ .NET”的“ n”,但最终这只是一个听起来不错的词。
马丁·恩德

Answers:


3

尽可能合并循环

在非平凡的计算中,您经常会发现使用多个循环来处理数据:

+`stage1
+`stage2
+`stage3

因此,此过程stage1一直进行到输出收敛stage2为止,然后直到输出收敛为止,然后直到输出收敛stage3为止。

但是,始终值得详细检查各个阶段。有时可以以交错方式运行循环stage1, stage2, stage3, stage1, stage2, stage3, ...(这在很大程度上取决于阶段的实际工作,但有时它们会进行完全正交的更改或作为管道正常工作)。在这种情况下,您可以通过将字节包装在一个循环中来保存字节:

{`stage1
stage2
}`stage3

如果stage1是程序的第一阶段或stage3最后阶段,则甚至可以省略这些括号(这意味着已经可以为两个阶段的循环节省字节)。

在此答案中可以看到该技术的最新用途。


2

将字符串分成相等长度的块 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 = 2n = 3。同样,请注意,您可以省略M如果这是代码的最后阶段,则。

如果您确实要在此处添加换行符,则可以通过附加 |$到正则表达式中。

奖励:重叠的块

请记住,M&选项具有返回重叠匹配项的功能(使用正则表达式通常无法实现)。这使您可以获取给定长度的字符串的所有重叠块(子字符串):

M!&`.{n}

是否可以以可变的长度将字符串精确地一分为二?因此123456变得123\n456123456789012345\n67890
凯文·克鲁伊森

1
@KevinCruijssen我认为我没有为此添加任何特定功能。您可能必须使用平衡组:tio.run / ## K0otycxLNPyvquGe8D / YIEHD3sZWQ09TW1PD3hbI1jW0A3JUNP // ...如果您不介意尾随换行,则可以省略?=
马丁·恩德

我以自己认为需要的方式完成了挑战,但是平衡组确实非常有用!我知道必须遵循这些原则,但是我的正则表达式/视网膜技能还不够好。谢谢回答!:)
Kevin Cruijssen
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.