Wait the light to fall

🎄 23/25. 用 Raku 计算总数

焉知非鱼

欢迎来到Raku One-Liner Advent Calendar的23天!今年年底是人们计算年度结果的时间,Raku 也可以帮助解决这个问题。

今天,我们将看到一个单行程序,用于计算表格列的总数。

这是文件中的一些示例数据:

100.20 303.50 150.25 
130.44 1505.12 36.41 
200.12 305.60 78.12

这里是为每列打印三个数字总和的代码:

put [Z+] lines.map: *.words

该程序打印我们需要的数字:

430.76 2114.22 264.78

昨天的帖子的更新中,我们知道,裸lines$*IN.lines 是一样的,所以lines.map在输入流中迭代所有行。然后将每一行拆分成由空格分隔的单词子串。

解析输入数据的作业部分已完成。我们得到了许多与输入数据行相对应的序列。对于我们的示例文件,有如下内容:

(("100.20", "303.50", "150.25").Seq, ("130.44", "1505.12", "36.41").Seq, ("200.12", "305.60", "78.12").Seq).Seq

现在,将每个序列的第一个元素,每个序列的第二个元素等相加起来。化简运算符zip元运算符的组合只需要四个代码字符即可完成所有工作:[Z+]

此时,我们有一个化简后的序列:

(430.76,2114.22,264.78).Seq

最后一个简单的步骤是使用 put 例程打印值。如果你昨天做了功课,你会知道say使用gist方法(在序列周围添加括号)来显示结果,而put只是使用Str方法打印值。

还有 #

让我们在脚本中添加一些字符来演示如何跳过第一列,例如,跳过包含月份名称的列:

Jan 100.20 303.50 150.25 
Feb 130.44 1505.12 36.41 
Mar 200.12 305.60 78.12

您只需要创建一个切片并选择除第一列之外的所有列:

put 'Total ', [Z+] lines.map: *.words[1..*]

如您所见,我们甚至不需要自己计算列数。1..* 范围可以完成这样的工作。

这就是今天的 advent 文章的结尾,所以明天再来吧!