Pytanie
Zofia Germain Prime jest podstawowym P w taki sposób, 2p + 1 jest liczbą pierwszą, jak również. Na przykład 11 jest liczbą pierwszą Sophie Germain, ponieważ 23 jest również liczbą pierwszą. Napisz najkrótszy program do obliczania liczb pierwszych Sophie Germain w porządku rosnącym
Zasady
- Liczby główne Sophie Germain muszą być generowane przez twój program, a nie z zewnętrznego źródła.
- Twój program musi obliczyć wszystkie liczby pierwsze Sophie Germain poniżej 2³²-1
- Musisz wydrukować każdą odrębną liczbę pierwszą Sophie Germain, którą znajdzie Twój program.
- Osoba z najniższym wynikiem wygrywa
Punktacja
- 2 punkty za bajt twojego kodu
- -10, jeśli możesz pokazać liczbę pierwszą wygenerowaną przez twój program większą niż 2³²-1
code-challenge
primes
Meow Mix
źródło
źródło
Odpowiedzi:
CJam
Dla 17 znaków otrzymujemy pełne wyliczenie do 2 ^ 32:
Dla 4 znaków więcej otrzymujemy zasięg wystarczająco duży, aby uwzględnić liczbę pierwszą SG większą niż 2 ^ 32:
od 4294967681 = 2 ^ 32 + 385 <2 ^ 32 + 400.
Oczywiście możemy równie dobrze rozszerzyć zakres za darmo, jak
źródło
I,
traktujeI
jako 32-bitową liczbę całkowitą ze znakiem, więc maksymalna wartośćI
to2 ** 31 - 1
.Pyth, 19 bajtów * 2 - 10 = 28
Zauważ, że kompilator / executor online nie wyświetla danych wyjściowych, ponieważ jest to nieskończona pętla.
Wyjaśnione:
źródło
PZ
nie zwraca wartości prawda lub fałsz. Zwraca pierwszą faktoryzacjęZ
. Testowanie liczby pierwszej polega na!tPZ
sprawdzeniu, czy faktoryzacja liczby pierwszej zawiera tylko jeden czynnik.!tP
błędów0
i1
być głównym, ponieważ ich pierwsza faktoryzacja zawiera tylko 1 czynnik. Easy Fix jest zastąpienie wszystkichZ
przezK
i przypisaćK2
na początku.K1
pola golfowe: przypisz zamiastK2
i zamień if oraz przyrost. W ten sposób możesz usunąć)
. I+1*K2
to to samo, cohyK
.Pyth - 2 * 16 bajtów - 10 = 22
Używa zwyczajowej metody sprawdzania liczby pierwszych w Pythu za pomocą
!tP
i stosuje ją zarówno do liczby, jak i jej liczby bezpiecznej, z małą sztuczką, aby sprawdzić oba jednocześnie. Idzie do10^10
, więc idę po bonus.Wyjaśnienie już wkrótce.Wypróbuj poniżej 1000 online .
źródło
źródło
CJam, 34 (2 * 22-10)
Drukuje wszystkie liczby pierwsze Sophie Germain poniżej
12 ** 9
, w tym4294967681 > 2 ** 32
.Szacuję, że na moim komputerze zajmie to około 8 godzin. Uruchomię to dziś wieczorem.
źródło
Haskell, 2 * 54-10 = 98
132i
to pierwsza kontrola.p
bierze wszystkie liczbyn
tam, gdzie jednon
i drugie2*x+1
jest liczbą pierwszą.p
jest nieskończoną listą.Edycja: lepszy sposób sprawdzania, czy
2*n+1
jest liczbą pierwszą.źródło
Julia, 2 * 49–10 = 88
Drukuje je w formacie listy,
[2,3,5,11,...]
. Jeśli ten format, użycieprimes
funkcji lub oczekiwanie na wykonanie wszystkich obliczeń w celu wydrukowania jest niedopuszczalne, spowoduje to wydrukowanie jednego z nich w wierszu podczas działania.To trochę dłużej, 52 znaki. Obaj obliczają wszystkie liczby pierwsze Sophie Germain do
2^33
, więc powinni otrzymać 10 punktów zniżki.źródło
Python 3,
124123 bajtyJak to działa?
Wypróbuj online tutaj .
Mój komputer twierdzi, że wygenerował 0,023283% wszystkich liczb pierwszych Sophie Germain poniżej 2 ^ 32.
Po zakończeniu opublikuję go na pastebin, jeśli jest wystarczająca liczba wierszy. Możesz go użyć, aby sprawdzić, czy masz je wszystkie.
źródło
.5
jest krótszy niż0.5
Perl, 2 * 57-10 = 104
42 sekundy do 2 ^ 32, 1m26s do 2 ^ 33. Działa o 50% szybciej, jeśli
2*$_+1
jest napisane jako,1+$_<<1
ale to jeszcze jeden bajt.Moduł instaluje również,
primes.pl
który ma wiele filtrów, w tym jeden dla liczb pierwszych Sophie-Germain. Więc:primes.pl --so 2**33
(20 bajtów)źródło
Ruby, 61 * 2 - 10 = 112
Wydrukowanie wszystkich wartości do 2 ** 32 zajęłoby wieczność
Edytować
Ogolono kilka bajtów podstawiając Float :: INFINITY na 1.0 / 0
źródło
PARI / GP, 46 * 2–10 = 82
źródło