洛达打高尔夫球的技巧


12

Rödafergusq创建的基于流的脚本语言。

您在Röda打高尔夫球有哪些一般秘诀?我正在寻找可以应用于代码高尔夫问题并且至少在某种程度上特定于Röda的想法(例如,“删除评论”不是答案)。

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


您是否想获得打高尔夫球的技巧?:P(我可能应该看看Python页面的提示)
HyperNeutrino

哇,来自PCG.SE的一个问题进入了“热网络问题”,它不是编程难题/挑战!:)
Pedro A

1
@HyperNeutrino Shhh .... :)
user41805 '17

Answers:


7

使用下划线

这可能是最重要的提示。几乎每个高尔夫Röda计划都使用下划线。

下划线语法是for循环的语法糖。以下代码行是等效的:

ls""|fileLength x for x|sort|pull
ls""|fileLength _|sort|pull

每个下划线for都会在语句周围的不可见循环中添加一个新变量。循环从流中为每个变量/下划线提取一个值,然后重复执行,直到没有剩余值为止。

下划线可以在语句中的任何位置使用:

a[x:y+1]=[1]*(1+y-x) /* Sets range x..y (inclusive) */
seq x,y|a[_]=1       /* 6 bytes less */

如果必须多次引用相同的下划线值,或者以相反的顺序使用这些值,则可以在下划线后放置一个数字:

a|[_^_1]  /* maps x to x^x */
a|[_2-_1] /* maps each pair (x,y) to y-x, eg. [1,2,4,8] -> [1, 4] */

3

一些分号/换行符是可选的

编写Röda代码时,通常建议使用换行符或分号分隔所有语句。但是,在打高尔夫球时,值得一提的是,并不是所有分号都需要。

这是分号/换行符可选的地方的不完整列表。他们中的大多数在下面的语句与运营商(开始不适用([+,等)。

  • 作业后
  • 函数调用后,至少有一个参数(例如f x使用括号时(例如f()
  • 每到一处,如果下一行/语句会首先|)]或者}

如果下一条语句以运算符开头,则分号/换行符是可选的,如果

  • 该语句是一个函数调用,并使用括号,例如{f(x)[y]}与相同{f(x);[y]}。这仅在语句上下文中有效,而在函数调用为表达式时无效。
  • 该语句是一个赋值,并使用括号,例如x=(y)[z]与相同x=(y);[z](与相同x=((y)[z]))。

这是在某些地方需要换行的地方:

  • 之后++--
  • 之后[...]

通常可以通过重新组织分配来节省字节。例如:

a=0;b=""c=[""]
b=""c=[b]a=0

x=f()y=i;z=a[0]
x=f()z=a[0]y=i

1

使用后缀控制结构

不使用后缀语句几乎绝不是最佳选择,因为您可以使用{...}代替do...end

一些例子:

x|unless[not(_ in y)]do[0]else[1]done
x|[0]unless[not(_ in y)]else[1]

if[p<0]do c+=p;a-=p done
{c+=p;a-=p}if[p<0]

你能if[_ in y]代替吗?
user41805

@KritixiLithos不,因为我希望条件为OR,而不是AND。当前,它会检查in 中是否也至少有一个值,但是您的条件将检查in中是否也有所有值。(示例是从此处复制的)。xyxy
fergusq

1

使用流输入

在输入是元素列表的情况下,从流中拉取值而不是将它们作为数组获取将是有益的。

在大多数情况下,通过将数组元素推送到流,然后使用for循环(或下划线)对其进行迭代,从而对数组元素进行迭代。无论如何,从流中迭代元素时,为什么不从一开始就定义它们应该存在?

例如,要计算输入中数字的平方和:

{|a|a|[_^2]|sum} /* Removing a redundant argument */
{[_^2]|sum}      /* saves 5 bytes */

1

括号在语句上下文中是可选的。即使自变量以运算符开头,这也适用。例如,[a()|sqrt-_]比短[a()|sqrt(-_)]。后面的括号a是必需的,就像a在表达式上下文中一样,而不是在语句上下文中。

但是,编写[a()|sqrt(_+1)*2]是不可能的,并且需要额外的括号来帮助解析器:[a()|sqrt((_+1)*2)]。通常可以重写这样的表达式,使它不以括号开头:[a()|sqrt 2*(_+1)]


是否也可以在不需要括号的情况下将多个参数传递给函数?
user41805 '17

@KritixiLithos是的。例如。[a()|atan2 _,_]将被允许​​。
fergusq

1

在/ 语句中使用,代替..[]push

相关:使用,代替and

push函数(以及该print函数)可以接受任意数量的参数,并输出每个参数而没有定界符。

所以这意味着这样

["a"..b]        /*8 bytes (string "a" concatenated with variable b)*/

可以缩短为

["a",b]         /*7 bytes*/

节省1个字节。


1

[]/ push>print

切勿使用print语句。[]推式语句始终是高尔夫球手。print和之间的区别在于,push前者输出尾随换行符,而后者则不尾随。但是,可以避免这种情况。

print"a"              /* 8 bytes */
["a                   /* 6 bytes; uses a literal newline */
"]

print"a",b            /* 10 bytes */
[`a$b                 /* 8 bytes; uses a literal newline and `` strings */
`]

1

使用``字符串

""字符串中,必须转义某些字符才能使用它们。例如,要打印反斜杠,您将必须具有类似的字符串"\\"。有一个增加的字节用于转义反斜杠。但是,如果使用``,则不必转义此字符,可以节省一个字节。

print"\\"     /* 9 bytes */
print`\`      /* 8 bytes */

不仅如此,您还可以``使用$variableName或(字符串中${expression}不存在的功能)对字符串内的变量和表达式进行编码""

在这些示例中,我们将输出"a"与变量值连接在一起的字符串,并在b结尾加上换行符。

["a",b,"      /* 11
"]               bytes   */
[`a$b         /* 8
`]               bytes; encodes b in the string using $b */

1

使用,代替and

Röda中的条件是流,并且可以包含多个值。这些值通过减少为一个布尔值and

这意味着您可以and使用,in条件替换多个值到流:

x if[a and b]
x if[a,b]

空条件是真实的

也有可能不包含任何值的条件,这是事实。

x while true
x while[]

1

用表格写替换清单 *"...;..."/";"

replace函数通常将字符串列表作为参数。但是,如果列表很长,则简单地将正则表达式/替换对存储在字符串中,然后拆分字符串并使用star运算符将是有益的:

replace"a","b","c","d"
replace*"a;b;c;d"/";"
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.