Курс 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)

Коментарі

  1. Замість списку прапорців %composite пам’ятає, які числа вже викреслено. Число, якого там досі немає, коли надходить його черга, є простим.

  2. Для кожного простого $i його кратні породжуються як послідовність $i², $i² + $i ... $limit і позначаються складеними. Початок з $i² пропускає кратні, уже оброблені меншими простими числами.

  3. Це єдина послідовність, а не заголовок циклу 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, …, — а не три окремі речення.

  4. $i² підносить число до квадрата за допомогою верхнього індексу Unicode. Raku приймає всі три записи — $i * $i, $i ** 2 та $i²: вони обчислюють точнісінько те саме значення, тож обирайте той, який вам краще читається. Цифри верхнього індексу (², ³, …) є звичайними символами, які можна набрати чи вставити просто у вихідний код.

Навігація курсом

Решето Ератосфена   |   Оцінки з рядків CSV