Napisz program, który monituje użytkownika o parzystą liczbę całkowitą większą niż 2.
Biorąc pod uwagę hipotezę Goldbacha, że każdą parzystą liczbę całkowitą większą niż 2 można wyrazić jako sumę dwóch liczb pierwszych, wydrukuj dwie liczby pierwsze, które po zsumowaniu dają żądaną liczbę parzystą. Edycja: program musi tylko wydrukować PARĘ liczb pierwszych, nie wszystkie. Na przykład:
4: 2 + 2
6: 3 + 3
8: 3 + 5
10: 5 + 5 lub 3 + 7
Odpowiedzi:
APL, 34 lub 44 bajty
Pierwsza wersja ma 34 znaki i jest ograniczona do znaków z oryginalnych jednobajtowych zestawów znaków APL, takich jak ten nadal obsługiwany w Dyalog APL:
Wyjaśnienie:
Druga wersja ma tylko 22 symbole, ponieważ wykorzystuje
π
funkcję do sprawdzania liczb pierwszych, ale jest dostępna tylko w NARS2000, który używa Unicode, więc liczba bajtów wynosi 44 w UCS-2:Wyjaśnienie:
Przykłady
(⎕: jest pytaniem o numer)
źródło
¯2π⍳2πn
działałby jako główny generator?π
dokładnie robi operator?π
przełączniki⍺
:¯2πx
oblicza Prime XTH,¯1πx
to pierwsze zasadnicze mniejsza niż X,0πx
X Próby na pierwszości,1πx
jest najpierw pierwsza większa niż x,2πx
to liczba bodźców poniżej X10πx
oznacza liczbę dzielników X11πx
jest sumą wszystkich dzielników x,12πx
i13πx
są odpowiednio funkcją Möbius i totient. Wreszcie monadycznyπx
zwraca pierwszą faktoryzację x.Python 2,
7571 bajtówPrzetestuj na Ideone .
Jak to działa
Używamy następstwa twierdzenia Wilsona :
Przez cały czas zmienna m jest równa kwadratowi silni k - 1 ; k zaczyna się od wartości 1, a m od wartości 0! ² = 1 . Zbiór p będzie się składał z 0 i wszystkich liczb pierwszych aż do bieżącej wartości k .
W każdej iteracji, musimy najpierw sprawdzić, czy zarówno NK i K należą do p , co jest prawdziwe wtedy i tylko wtedy, gdy zbiór różnica {nk, k} i p jest pusty. Jeśli tak, warunek jest fałszywy, a pętla trwa.
Zauważ, że k> 0 i {n - k, k} spełnią warunek pewnej dodatniej wartości n - k (zakładając, że hipoteza Goldbacha jest prawdziwa), więc 0 w p nie będzie prowadzić do fałszywie dodatnich.
W pętli aktualizujemy k i m . Nowa wartość m to m × k² = (k - 1)! ² × k² = k! ² , a nowa wartość k to k + 1 , więc m = (k - 1)! ² nadal obowiązuje przed i po aktualizacja.
Następnie wykonujemy set union, aby dodać wartość m% k × k do p . Zgodnie z twierdzeniem Wilsona doda to 1 × k = k, jeśli k jest liczbą pierwszą, i 0 × k = 0, jeśli nie.
Po zakończeniu pętli wypisujemy ostatnie wartości n - k i k , które będą liczbami pierwszymi o sumie n .
źródło
Ruby 2.0 (65)
źródło
PHP - 73 bajty
Dane wejściowe są traktowane jako argument wiersza poleceń.
Przykładowe użycie:
źródło
GolfScript
413332Akceptuje argument wiersza poleceń, np
Znajduje wszystkie odpowiednie partycje numeru wejściowego za pomocą:
a następnie znajduje pierwszą partycję, na której NIE ma liczb pierwszych:
gdzie blok sprawdzający kompozyt
np
jest:blok ten filtruje do wszystkich liczb, które dzielą równomiernie daną liczbę. Jeśli nie ma takich liczb (więc liczba jest liczbą pierwszą), wynikiem jest
[]
, co jest falsey w GolfScript.źródło
perl 6: 69
źródło
R,
17011283 znakówZębaty:
Stosowanie:
Stare rozwiązanie zawierające 112 znaków dla potomności
Zębaty:
źródło
Python - 107
Zasadniczo poprawa w drugiej części odpowiedzi nutrii (uruchomiłem to w wersji 2.7, ale myślę, że powinno to również działać w wersji 3.x)
źródło
:
obowiązkowe?JavaScript (ES6) (Regex), 105
Teraz masz regex, który testuje hipotezę Goldbacha, która ma niskie wymagania dotyczące specjalnych funkcji (podstawowe wsparcie referencyjne, pozytywne i negatywne spojrzenie w przyszłość).
To wykorzystuje
String.prototype.repeat()
, który jest częścią propozycji EcmaScript 6. edycji. Obecnie ten kod działa tylko w przeglądarce Firefox.Naprawdę potrzebuję lepszego języka, który ma krótkie polecenia podczas pracy z regex ...
źródło
Scala,
286192172148 znakówNie najszybszy, ale działa. Zadzwoń do g (10), aby uzyskać listę par Goldbacha za 10.
Konwersja do C ++ jest prosta.
źródło
C -
139129 znakówźródło
int
deklaracje w swojej funkcjii
. Możesz zapisać kolejne 2 znaki, usuwającif
i dodając kolejne podwójne znaki handlowe:i(b,2)&&i(a-b,2)&&printf(...)
&&
. (Nigdy nie przyzwyczaję się do wyciszania argumentów ...)nowośćLISP -
169148 znakówzawiera kod do uruchomienia. Rezultaty są zbyt hojne ...
źródło
Szałwia, 60 lat
Podobny wynik i rozwiązanie res , ale myślę, że jest wystarczająco inny do opublikowania.
źródło
Sage ,
6562Z powyższym plikiem
goldbach.sage
, uruchom go z Sage uruchomionym w terminalu:Dzięki @boothby za
p=is_prime
pomysł.źródło
p=is_prime
.Haskell, 97 ° C
Wyjaśnienie:
g
jest funkcją „goldbach”. Wywołanieg n
daje parę liczb pierwszych, które się sumująn
.p
to funkcja generująca listę liczb pierwszych mniejszych niżn
.c
to funkcja sprawdzania liczby głównej używana do definiowaniap
.Przykładowe przebiegi:
źródło
Mathematica 56
Zwraca wszystkie rozwiązania dla wejściowej liczby całkowitej.
Na przykład, gdy wprowadzono 1298…
Jak napisano, każde rozwiązanie zwraca dwa razy.
źródło
Julia, 62 znaki (85 z pytaniem)
źródło
g(int(readline(STDIN)))
GTB , 31
Do kalkulatora TI-84
Brak najlepszych wbudowanych.
Przykład działa
źródło
JavaScript,
139137136źródło
return;
zamiastreturn 0;
Python 3 -
150143 znakiStara wersja (150 znaków):
Nowa wersja (dzięki ProgramFOX):
Drukuje każdą kombinację, na przykład:
4 2 + 2
10 7 + 3 5 + 5 3 + 7
źródło
|
można bezpiecznie używać z typem logicznym, więc(a+b!=n)|p(a)|p(b)
print([(a,b)for b in range(2,n)for a in range(2,n)if not((a+b!=n)|p(a)|p(b))])
(drukuje listę krotek, których suma wynosi n). Oszczędza 8 bajtów.r=range(2,n)
i odniesienier
oszczędza kilka innych.q [116 znaków]
Brak wbudowanej funkcji znajdowania liczby pierwszej.
Wejście
Wynik
źródło
Python - 206
Trochę późno na imprezę, ale ćwiczę swoje umiejętności gry w golfa.
Właściwie to zakodowałem, zanim znalazłem to pytanie! Więc mój nie zawiera pięknej lambda, której używają inne rozwiązania Python.
źródło
J -
3532 znaków„Monituj użytkownika” to zmora każdego golfisty J. Oto wszystkie moje ciężko zarobione postacie!
Wyjaśniono:
".1!:1]1
- Przeczytaj ciąg znaków (1!:1
) z wejścia (uchwyt pliku1
) i przekonwertuj go na liczbę (".
).p:i.n=:
- Przypisz tę liczbę do zmiennejn
, a następnie weź pierwszen
liczby pierwsze.+/~
- Zrób stół dodatkowy,n
szeroki in
wysoki.i.&n,
- Zamień tabelę w pojedynczą listę, a następnie znajdź indeks pierwszego wystąpienian
, który istnieje, jeśli hipoteza Goldbacha jest prawdziwa.p:(n,n)#:
- Pobierz wiersz i kolumnę z indeksu i pobierz odpowiednie liczby pierwsze.Stosowanie:
Gdyby monit nie był wymagany, oto czasownik składający się z 25 znaków:
źródło
Galaretka , 8 bajtów (niekonkurencyjna)
Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .
Jak to działa
źródło
Julia,
5049 bajtówWypróbuj online!
Jeśli funkcja jest akceptowalna, kod można skrócić do 32 bajtów :
Jak to działa
~=primes
tworzy alias dla wbudowanej funkcji liczb pierwszych, która zwraca listę wszystkich liczb pierwszych aż do argumentu.n=ARGS[]|>int
analizuje pierwszy argument wiersza polecenia, ponieważ zapisuje go w n .Aby znaleźć odpowiednią parę liczb pierwszych, najpierw obliczamy wyżej wspomniany zakres liczb pierwszych
~n
. Następnien-~n
otrzymuje się wszelkie różnice te bodźce i n .Przecinając (
∩
) wynik z samym zakresem liczby pierwszej, upewniamy się, że pozostałe liczby pierwsze p są takie, że n - p jest również liczbą pierwszą.W końcu
extrema
przyjmuje najniższą i najwyższą liczbę pierwszą na skrzyżowaniu, więc ich suma musi wynosić n .źródło
SQL,
295284W postgresql:
Powinien być w stanie to zrobić w połowie przestrzeni, gdyby nie takie rzeczy jak: „brak lewych połączeń zewnętrznych w rekurencji”, „brak podkwerend w rekurencji” ...
Oto wynik:
źródło
Partia - 266
Starannie przedstawione -
źródło
Perl 5, 58 bajtów
57, plus 1 dla
-nE
Wejścia i wyjścia są jednostkowe. Przykład:
Czapka z daszkiem.
źródło
Oracle SQL 11.2, 202 bajty
Nie grał w golfa
źródło
Python 3, 107 bajtów
b (x) jest testem pierwszeństwa dla x, a g (x) przechodzi przez liczby w celu znalezienia dwóch liczb pierwszych, które pasują.
źródło