🎄 25/25. Raku Golf 代码的提示和想法
— 焉知非鱼欢迎来到第25天,这是Raku One-Liner Advent Calendar的最后一天!传统的 advent calendar 只有24个条目,我们今天的奖励帖子将专注于你可以在Raku高尔夫比赛中使用的一些提示和技巧。
有一个很棒的网站code-golf.io,你可以尝试解决一些问题,并将Raku移到最高分。我怀疑许多问题可以从这个One-Liner Advent Calendar 前几天所涵盖的技术中受益。
省略主题变量 #
如果在主题变量$_
上调用方法,那么 Raku 实际上不需要变量名来理解你在说什么,所以,避免显式命名主题变量:
$_.say for 1..10
使用范围进行循环 #
Perl 中的范围是表达循环细节的好东西:用几个字符,指定循环变量的初始和最终状态。倒装形式通常更短。
for 1..10 {.say}
.say for 1..10
想想你是否可以从0开始计数,在这种情况下,可以使用脱字符来获得从0开始的范围。以下代码打印数字0到9:
.say for ^10
在范围和序列之间进行选择 #
在循环中,序列可以与范围完全相同。选择可能取决于Golf软件是计数字节还是计数Unicode字符。在第一种情况下,两个点的范围优于三个点的范围。在第二种情况下,使用Unicode字符:
.say for 1..10
.say for 1...10
.say for 1…10
当你需要向下计数时,序列是你的朋友,因为他们可以推断出循环计数器更改的方向:
.say for 10…1
使用map而不是循环 #
在某些情况下,尤其是当你必须使用循环变量进行多个操作时,请尝试使用map
迭代所有值:
(^10).map: *.say
省略括号 #
与 Perl 5 不同,Raku 不会强制你在常规形式的条件检查中使用括号:
if ($x > 0) {say $x;exit}
if $x > 0 {say $x;exit}
有时,你也希望省略函数调用中的括号。
在声明数组或散列时,你都不需要括号。对于数组,使用引号构造:
my @a = ('alpha', 'beta')
my @b=<alpha beta>
使用链式比较 #
另一个有趣的功能是在单个表达式中使用多个条件:
say $z if $x < 10 < $y
在方法和函数之间进行选择 #
在许多情况下,你可以选择调用函数还是使用方法。方法调用可以相互链接,因此你可以节省大量括号或空格:
(^10).map({.sin}).grep: *>0
当同时存在方法和独立函数时,如果省略括号,则方法调用通常更短或至少相同。
abs($x)
abs $x
$x.abs
使用Unicode字符 #
Raku 运算符通常具有 Unicode 等价物,你可以在其中表达具有单个字符的罗嗦构造。对比:
if $x=~=$y
if $x≅$y
内置常量也在 Unicode 可用空间中,例如,pi
vs π
,或Inf
vs ∞
。
有很多的数字,有小有大,可以用单个 Unicode 符号来代替:1/3
vs ⅓
,或20
vs ⑳
,或100
vs Ⅽ
。
使用上标 #
上标非常适合计算幂。对比:
say $x**2
$x².say
使用 \ 制作无符号变量 #
不要忘记以下绑定容器的方式并创建一种符号的变量:
my \a=42;say a
使用默认参数 #
使用函数或类方法时,请检查其签名中是否存在默认值。还要检查是否存在具有位置参数的备选变体。例如,比较三种创建日期对象的方法。
Date.new(year=>2019,month=>1,day=>1)
Date.new(year=>2019)
Date.new(2019,1,1)
使用 && 而不是 if #
布尔表达式可以节省几个字符,因为如果第一个给出结果,Perl 将不计算第二个条件。例如:
.say if $x>0
$x>0&&.say
选择 put vs say #
最后,有时最好使用put
代替say
。例如,在某些情况下,打印数组时输出中会没有括号。在其他一些情况下,使用范围时,你将获得所有值而不是简洁输出,例如:
> say 1..10
1..10
> put 1..10
1 2 3 4 5 6 7 8 9 10
直到明年! #
你也可以在Aleks-Daniel Jakimenko-Aleksejev 去年发布的帖子中找到许多有趣的想法。
但这时,这个 Raku One-Line Advent Calendar 已经完全结束了。还会有一篇文章概述过去25天内发布的所有内容。
我祝你在进一步的 Raku 冒险中一切顺利,无论是单行程序还是工业规模的应用。我们明年在另一个 advent calendar 中见,但不要忘记, raku.online 会继续其工作,更多的帖子将在 下一年的 2019 年发布!