Brachylog打高尔夫的秘诀


19

Brachylog是一种最近开始在代码高尔夫中崭露头角的语言(并且刚刚获得了Terser语法的重大更新)。像Prolog一样,它的优点是通常仅通过对问题的外观进行足够准确的描述即可解决问题(通常通过蛮力),该功能意味着在正确的挑战下,它通常可与挑战相提并论。顶级高尔夫语言(众所周知,它有时会打败Jelly)。

您对Brachylog打高尔夫球有什么秘诀(即编写最短的程序)?这主要是在寻找特定于Brachylog的建议,而不是适用于多种语言的建议。(有关声明性语言打高尔夫球的小技巧,在这里可能更合适,这取决于他们对Brachylog以外的其他语言有多少应用程序,尽管另请参阅Prolog中的打高尔夫球技巧。)

Answers:


4

利用嵌套谓词创建新变量

Brachylog具有许多特殊的语法情况,以使其两个特殊变量?(输入/左参数)和.(输出/右参数)更方便使用。这意味着,如果您不需要访问谓词的?and .,但确实需要使用变量,则通常可以通过创建嵌套谓词以使用 ? and 来节省字节.

作为一个简单的示例,请考虑一个如下所示的程序:

… A … ∧A … B … B …

对于较长的程序,这是很常见的形状。毕竟,有很多空白可能包含任何内容。假设我们不需要?.在中心没有三个间隙。然后我们可以这样重写它:

… { … & … . … } …

在此,嵌套谓词?充当的角色A,而.充当的角色B。我们可以看到这比原始代码短一个字节。更改AABB{?.},字节数没有变化,但这使我们可以简化∧?为缩写&

一个相关的技巧是改变

∧. … ?∧

~{ … }

(短一字节),但请注意,让调用者交换参数几乎总是便宜的(除非从程序的至少三个不同位置调用谓词,这在Brachylog中很少见)。


3

在元谓词中拆分长度为2的谓词

最好通过示例来解释。要删除列表的第一个和最后一个元素,我们将其斩首并切成小刀:

bk

如果要对列表的每个元素执行此操作,则可以使用map操作:

{bk}ᵐ

但是,将谓词分为两个并分别映射每个部分要短一个字节:

bᵐkᵐ

相同的技巧可以用于很多元谓词:

{bk}ᵐ  →  bᵐkᵐ
{bk}ˢ  →  bˢkˢ
{bk}ᶠ  →  bᶠkˢ
~{bk}  →  ~k~b

请注意,对于某些元谓词,例如,没有通用的方法将其分为两部分,但是仍然有可能找到适合您正在执行的特定任务的分解。


3

将空列表转换为空字符串

有时,当使用字符串时,我们使用的算法可能会与空列表统一,而我们希望使用[]空字符串""

我们可以使用将空列表转换为空字符串,Ẹ,它将空字符串附加到其左变量(这,是实现方式的一种利用)。

这还具有以下好处:如果left变量是字符串,则它不执行任何操作。因此,如果您的程序是

{  
   some predicate that should always output a string, 
   but actually outputs [] instead of "" in specific cases
}

然后

{
  some predicate that should always output a string, 
  but actually outputs [] instead of "" in specific cases
},Ẹ

将以您想要的方式工作。


2

单元素在列表中运行

请考虑以下代码段:

ḅ∋≠

如果输入是列表或字符串,则输出将与长度为1的子列表/子字符串统一,该子列表/子字符串不是较长等号元素的一部分。它将列表分成相等元素的块,并找到元素不同的块。要获取元素本身而不是单例列表,请添加h到最后。我用这个结构在这里o地发现,只发生一次输入字符串的字符。

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.