Курс Raku / Додаток 🆕 / Збираємо все разом / Мішані міні-проєкти / Вправи / Решето Ератосфена
Розв’язання: Решето Ератосфена
Ось одне з можливих розв’язань задачі.
Код
my $limit = 30;
my %composite;
for 2 .. $limit -> $i {
next if %composite{$i};
for ($i², $i² + $i ... $limit) -> $multiple {
%composite{$multiple} = True;
}
}
say (2..$limit).grep({ !%composite{$_} });🦋 Знайдіть програму у файлі sieve.raku.
Вивід
(2 3 5 7 11 13 17 19 23 29)Коментарі
Замість списку прапорців
%compositeпам’ятає, які числа вже викреслено. Число, якого там досі немає, коли надходить його черга, є простим.Для кожного простого
$iйого кратні породжуються як послідовність$i², $i² + $i ... $limitі позначаються складеними. Початок з$i²пропускає кратні, уже оброблені меншими простими числами.Це єдина послідовність, а не заголовок циклу
forу стилі C. Оператор...бере два перші значення, з’ясовує крок між ними й іде далі аж до межі. Для$i=3це означає початок із9, потім12, тож крок дорівнює3, і цикл обходить увесь список:my $i = 3; say ($i², $i² + $i ... 30); # (9 12 15 18 21 24 27 30)
Тож
forотримує один список для обходу —9, 12, 15, …, — а не три окремі речення.$i²підносить число до квадрата за допомогою верхнього індексу Unicode. Raku приймає всі три записи —$i * $i,$i ** 2та$i²: вони обчислюють точнісінько те саме значення, тож обирайте той, який вам краще читається. Цифри верхнього індексу (²,³, …) є звичайними символами, які можна набрати чи вставити просто у вихідний код.