🎄 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 文章的结尾,所以明天再来吧!