Wait the light to fall

🎄 17/25. 在 Raku 中使用素数

焉知非鱼

欢迎来到 Raku One-Liner Advent Calendar 的第17天!今天,我们将有两个单行程序,它们都产生一些素数。

第1部分 #

首先,让我们解决欧拉项目的问题7,你需要打印第 10001 个素数(第一个素数是2)。

Raku 擅长素数,因为它有一个 Int 类的内置方法,is-prime

有几种方法可以生成素数。对于单行程序,最简单的就是最好的, 效率也最低, 方法就是测试每个数字。

say ((1..*).grep: *.is-prime)[10000]

计算结果大约需要半分钟,但代码很短。总有一天,我们将使用所谓的埃拉托色尼筛来解决这个问题,它应该更快,但可能需要更多的代码。

第2部分 #

在这个 advent 文章的第二部分,让我们娱乐一下并解决 code-golf.io 网站上的相应问题。我们需要打印100以下的所有素数。

我的答案需要22个字符,如下所示:

.is-prime&&.say for ^

在 Raku 中没有更短答案了,而在J中,他们做到了只使用11个字符。在 Raku 中,方法名已经消耗了八个字符。我相信,要赢得所有的高尔夫比赛,你需要一种名称很短的特殊语言(J就是)和一组内置例程来生成素数,或斐波那契或任何其他数字序列的列表。它还应该强烈利用Unicode字符空间。

在我们的 Raku 示例中,还有一个 Unicode 字符,。这不是简单的 C,拉丁字母的第三个字母,而是 Unicode 字符 ROMAN NUMERAL ONE HUNDRED(原本是拉丁字母的第三个字母,当然)。使用此符号,我们可以在答案中节省两个字符。

&& 技巧是可能的,因为如果第一个操作数是 False,Perl 不会执行布尔表达式的第二部分。请注意,您不能在此处使用单个 。完整的非优化版本的代码需要额外的空格,如下所示:

.say if .is-prime for ^100

这就是今天 Raku 之旅的终点,明天见!