Kurso de Raku / Aldono 🆕 / Ĉio kune / Miksitaj mini-projektoj / Exercises / Kribrilo de Eratosteno
Solvo: Kribrilo de Eratosteno
Jen ebla solvo de la tasko.
Kodo
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{$_} });🦋 Vi povas trovi la fontkodon en la dosiero sieve.raku.
Eligo
(2 3 5 7 11 13 17 19 23 29)Komentoj
Anstataŭ listo de flagoj,
%compositememoras, kiuj nombroj estis forstrekitaj. Nombro ankoraŭ mankanta en ĝi, kiam venas ĝia vico, estas prima.Por ĉiu primo
$i, ĝiaj obloj estas generataj kiel la sekvenco$i², $i² + $i ... $limitkaj markataj kiel kunmetitaj. Komenci ĉe$i²preterpasas oblojn jam traktitajn de pli malgrandaj primoj.Ĉi tio estas unu sola sekvenco, ne C-stila kapo de
for. La operatoro...prenas la unuajn du valorojn, eltrovas la paŝon inter ili kaj daŭrigas ĝis la limo. Por$i=3tio signifas komenci ĉe9, poste12, do la paŝo estas3, kaj la buklo trairas la tutan liston:my $i = 3; say ($i², $i² + $i ... 30); # (9 12 15 18 21 24 27 30)
Do
forricevas unu liston por trairi —9, 12, 15, …— prefere ol tri apartajn klaŭzojn.$i²kvadratigas la nombron per Unikoda superskribo. Raku akceptas ĉiujn tri el$i * $i,$i ** 2kaj$i²— ili kalkulas precize la saman valoron, do elektu tiun, kiu legiĝas plej bone por vi. La superskribaj ciferoj (²,³, …) estas ordinaraj signoj, kiujn vi povas tajpi aŭ alglui rekte en la fontkodon.