Wyzwanie
Zaimplementuj sito Sundaram, aby znaleźć liczby pierwsze poniżej n
. Weź liczbę całkowitą wejściową n
i wyślij liczby pierwsze poniżej n
. Możesz założyć, że n
zawsze będzie mniejszy lub równy milionowi.
Sito
Zacznij od listy liczb całkowitych od
1
don
.Usuń wszystkie liczby, które mają postać
i + j + 2ij
:i
ij
są mniejsze niżn
.j
jest zawsze większa lub równai
, która jest większa lub równa1
.i + j + 2ij
jest mniejsza lub równan
Pomnóż pozostałe liczby przez
2
i dodaj1
.
Spowoduje to, że wszystkie liczby pierwsze (oprócz 2
, które powinny być uwzględnione w wynikach) będą mniejsze niż 2n + 2
.
Oto animacja sita wykorzystywanego do znajdowania liczb pierwszych poniżej 202
.
Wynik
Wynikiem powinna być każda liczba całkowita pierwsza ≤ n
(w porządku rosnącym), po której następuje nowa linia:
2
3
5
Gdzie n
jest 5
.
Przykłady
> 10
2
3
5
7
> 30
2
3
5
7
11
13
17
19
23
29
Wejścia są oznaczone symbolem >
.
n=30
brakuje 29 na wyjściu.(i,j)
pomocąi<=j
, ale wynik nie zmienia się, jeśli zignorujemy to wymaganie. Czy możemy to zrobić, aby zaoszczędzić bajty?i <= j
. To tylko część działania sita. Tak, możesz pominąći <= j
kod. @xnor2n+1
), które nie są w formie2(i + j + 2ij)+1
- czy możemy przetestować tę właściwość bezpośrednio na potencjalnych liczbach pierwszych, czy też nasz kod musi w pewnym momencie wykonać czasy 2 plus 1 ?n
jest w całości. W opisie metody napisano, że wygeneruje wszystkie liczby pierwsze do2 * n + 2
. Ale w opisie wejścia / wyjścia napisano, że dane wejściowe sąn
, a dane wyjściowe są zawsze pierwszen
. Czy więc powinniśmy zastosować tę metodę, aby wygenerować wszystkie liczby pierwsze do2 * n + 2
, a następnie upuścić te większe niżn
dla wyniku? Czy też powinniśmy obliczyćn
w opisie metody na podstawie danych wejściowychn
?Odpowiedzi:
Pyth, 23 bajty
Demonstracja
Naprawdę po prostu implementuje podany algorytm.
źródło
Haskell,
9390 bajtówJak to działa:
[i+j+2*i*j|j<-r,i<-r]
czy wszystkiei+j+2ij
są usuwane (\\
) z[1..n]
. Skaluj2x+1
i zamień je w string (show
). Dołącz za pomocą NL (unlines
).źródło
Scala,
115 124 122 115114 bajtówAnonimowa funkcja; bierze n jako argument i wypisuje wynik na standardowe wyjście.
źródło
JavaScript (ES7),
107105 bajtówRozumienia tablic są niesamowite! Ale zastanawiam się, dlaczego JS nie ma składni zakresu (np.
[1..n]
) ...Zostało to pomyślnie przetestowane w przeglądarce Firefox 40. Podział:
Alternatywne rozwiązanie przyjazne dla ES6 (111 bajtów):
Sugestie mile widziane!
źródło
MATLAB, 98
I w czytelnej formie
źródło
Java8:
168165 bajtówAby uzyskać większą liczbę, można użyć typu danych o szerokim zakresie. Nie musimy iterować, ponieważ całe
N
indeksyN/2
są wystarczające.Aby właściwie zrozumieć, należy zastosować równoważną metodę.
źródło
N>=2
->N>1
?A[i]==0
->A[i]<1
?CJam, 35 bajtów
Wypróbuj online
Wydaje się to dość długie w stosunku do rozwiązania Pyth firmy isaacg, ale to ... to, co mam.
Wyjaśnienie:
źródło
Perl 6 , 96 bajtów
Jeśli ściśle przestrzegam opisu, najkrótszy, jaki udało mi się uzyskać, to 96 bajtów.
Gdybym mógł wykonać
2n + 1
inicjalizację tablicy, wstępne wstawienie2
i ograniczenie tego tylko do wartości mniejszych lub równychn
; można go zmniejszyć do 84 bajtów.Jeśli zignoruję
j
to, co najmniej tak powinno byći
, mogę zmniejszyć to do 82 bajtów.Przykładowe użycie:
źródło
PHP, 126 bajtów
Wersja online
źródło
Julia 0.6 , 65 bajtów
Wypróbuj online!
Nie jest to duże wyzwanie pod względem golfa, ale musiałem to zrobić dla tej nazwy. :)
źródło