🎄 25/25. Perl 6 Golf 代码的提示和想法

欢迎来到第25天,这是Perl 6 One-Liner Advent Calendar的最后一天!传统的 advent calendar 只有24个条目,我们今天的奖励帖子将专注于你可以在Perl 6高尔夫比赛中使用的一些提示和技巧。

有一个很棒的网站code-golf.io,你可以尝试解决一些问题,并将Perl 6移到最高分。我怀疑许多问题可以从这个One-Liner Advent Calendar 前几天所涵盖的技术中受益。

省略主题变量

如果在主题变量$_上调用方法,那么 Perl 6 实际上不需要变量名来理解你在说什么,所以,避免显式命名主题变量:

1
$_.say for 1..10

使用范围进行循环

Perl 中的范围是表达循环细节的好东西:用几个字符,指定循环变量的初始和最终状态。倒装形式通常更短。

1
2
for 1..10 {.say}
.say for 1..10

想想你是否可以从0开始计数,在这种情况下,可以使用脱字符来获得从0开始的范围。以下代码打印数字0到9:

1
.say for ^10

在范围和序列之间进行选择

在循环中,序列可以与范围完全相同。选择可能取决于Golf软件是计数字节还是计数Unicode字符。在第一种情况下,两个点的范围优于三个点的范围。在第二种情况下,使用Unicode字符:

1
2
3
.say for 1..10
.say for 1...10
.say for 110

当你需要向下计数时,序列是你的朋友,因为他们可以推断出循环计数器更改的方向:

1
.say for 101

使用map而不是循环

在某些情况下,尤其是当你必须使用循环变量进行多个操作时,请尝试使用map迭代所有值:

1
(^10).map: *.say

省略括号

与 Perl 5 不同,Perl 6 不会强制你在常规形式的条件检查中使用括号:

1
2
if ($x > 0) {say $x;exit}
if $x > 0 {say $x;exit}

有时,你也希望省略函数调用中的括号。

在声明数组或散列时,你都不需要括号。对于数组,使用引号构造:

1
2
my @a = ('alpha', 'beta')
my @b=<alpha beta>

使用链式比较

另一个有趣的功能是在单个表达式中使用多个条件:

1
say $z if $x < 10 < $y

在方法和函数之间进行选择

在许多情况下,你可以选择调用函数还是使用方法。方法调用可以相互链接,因此你可以节省大量括号或空格:

1
(^10).map({.sin}).grep: *>0

当同时存在方法和独立函数时,如果省略括号,则方法调用通常更短或至少相同。

1
2
3
abs($x)
abs $x
$x.abs

使用Unicode字符

Perl 6 运算符通常具有 Unicode 等价物,你可以在其中表达具有单个字符的罗嗦构造。对比:

1
2
if $x=~=$y
if $x≅$y

内置常量也在 Unicode 可用空间中,例如,pi vs π,或Inf vs

有很多的数字,有小有大,可以用单个 Unicode 符号来代替:1/3 vs ,或20 vs ,或100 vs

使用上标

上标非常适合计算幂。对比:

1
2
say $x**2
$x².say

使用 \ 制作无符号变量

不要忘记以下绑定容器的方式并创建一种符号的变量:

1
my \a=42;say a

使用默认参数

使用函数或类方法时,请检查其签名中是否存在默认值。还要检查是否存在具有位置参数的备选变体。例如,比较三种创建日期对象的方法。

1
2
3
Date.new(year=>2019,month=>1,day=>1)
Date.new(year=>2019)
Date.new(2019,1,1)

使用 && 而不是 if

布尔表达式可以节省几个字符,因为如果第一个给出结果,Perl 将不计算第二个条件。例如:

1
2
.say if $x>0   
$x>0&&.say

选择 put vs say

最后,有时最好使用put代替say。例如,在某些情况下,打印数组时输出中会没有括号。在其他一些情况下,使用范围时,你将获得所有值而不是简洁输出,例如:

1
2
> say 1..10
1..10
1
2
> put 1..10
1 2 3 4 5 6 7 8 9 10

直到明年!

你也可以在Aleks-Daniel Jakimenko-Aleksejev 去年发布的帖子中找到许多有趣的想法。

但这时,这个 Perl 6 One-Line Advent Calendar 已经完全结束了。还会有一篇文章概述过去25天内发布的所有内容。

我祝你在进一步的 Perl 6 冒险中一切顺利,无论是单行程序还是工业规模的应用。我们明年在另一个 advent calendar 中见,但不要忘记, perl6.online 会继续其工作,更多的帖子将在 下一年的 2019 年发布!