Corso di Raku / Appendice 🆕 / Mettere tutto insieme / Mini-progetti misti / Exercises / Crivello di Eratostene
Soluzione: Crivello di Eratostene
Ecco una possibile soluzione del compito.
Codice
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{$_} });🦋 Trova il programma nel file sieve.raku.
Output
(2 3 5 7 11 13 17 19 23 29)Commenti
Invece di una lista di flag,
%compositericorda quali numeri sono stati cancellati. Un numero che quando arriva il suo turno non vi compare ancora è primo.Per ogni primo
$i, i suoi multipli vengono generati come sequenza$i², $i² + $i ... $limite segnati come composti. Cominciare da$i²salta i multipli già trattati dai primi più piccoli.Questa è un’unica sequenza, non un’intestazione
forin stile C. L’operatore...prende i primi due valori, ricava il passo fra di essi e prosegue fino al limite. Per$i=3questo significa cominciare da9, poi12, quindi il passo è3, e il ciclo percorre l’intera lista:my $i = 3; say ($i², $i² + $i ... 30); # (9 12 15 18 21 24 27 30)
Quindi
forriceve un’unica lista da percorrere —9, 12, 15, …— invece di tre clausole separate.$i²eleva il numero al quadrato usando un apice Unicode. Raku accetta tutte e tre le forme$i * $i,$i ** 2e$i²— calcolano esattamente lo stesso valore, quindi scegli quella che si legge meglio per te. Le cifre in apice (²,³, …) sono caratteri ordinari che puoi digitare o incollare direttamente nel sorgente.