Liczba jest liczbą de Polignaca wtedy i tylko wtedy, gdy jest nieparzysta i nie może być reprezentowana w postaci p + 2 n, gdzie n jest liczbą całkowitą nieujemną, a p jest liczbą całkowitą pierwszą.
Zadanie
Napisz kod, który przyjmuje dodatnią liczbę całkowitą i określa, czy jest to liczba de Polignaca. Możesz wyprowadzić dwie różne wartości: jedną dla wartości true i jedną dla wartości false. Powinieneś dążyć do zminimalizowania liczby bajtów.
Przypadki testowe
Dla pozytywnych przypadków oto OEIS
1, 127, 149, 251, 331, 337, 373, 509, 599, 701, 757, 809, 877, 905, 907, 959, 977, 997, 1019, 1087, 1199, 1207, 1211, 1243, 1259, 1271, 1477, 1529, 1541, 1549, 1589, 1597, 1619, 1649, 1657, 1719, 1759, 1777, 1783, 1807, 1829, 1859, 1867, 1927, 1969, 1973, ...
Oto kilka negatywnych przypadków:
22, 57
code-golf
number
number-theory
decision-problem
Kreator pszenicy
źródło
źródło
Odpowiedzi:
Japt ,
91413 bajtówPrzetestuj online! lub Znajdź wszystkie liczby całkowite de Polignac poniżej 1000 .
Wyjścia
1
dla danych wejściowych0
dla fałszowania i dla prawdy.Wyjaśnienie
źródło
false
ale nie są to liczby de Polignaca.3
jest naprawiony, ale na początku nie musieliśmy obsługiwać nawet spraw. Ustalenie.3
nie kosztowała żadnych bajtów, potem zobaczyłam poprawkę dla2
- Ojej!Galaretka ,
1110 bajtówZapisano 1 bajt dzięki @Dennis
Wypróbuj online!
Jak to działa
źródło
Ḷ2*⁸_ÆPS<Ḃ
zapisuje bajt. tio.run/##ASQA2/9qZWxsef//4bi2Mirigbhfw4ZQUzzhuIL/…¬;ḂẠ
.S<Ḃ
jest jednak nieszablonowy, przynajmniej dla mnie :-)JavaScript (ES6),
56 5453 bajtówZwraca0 lub 1 .
Wypróbuj online!
W jaki sposób?
Zaczynamy odp=1 . Sprawdzamy, czy y= n - p jest złożone i daje odpowiednio wartość logiczną. Następny test przeprowadzany jest przy p × 2 .
Gdy tylkop jest większe niż n , zatrzymujemy rekurencję i zwracamy n .
Wyniki wszystkich iteracji są AND połączone razem, co zmusza wartości boolowskie do0 lub 1 .
Pod warunkiem, że wszystkie wyniki pośrednie były zgodne z prawdą, kończymy testem bitowym, takim jak:
1 & 1 & 1 & n
Daje to1 wtedy i tylko wtedy, gdy n jest nieparzysty, co jest ostatnim warunkiem wymaganym do zatwierdzenia danych wejściowych jako liczby de Polignaca.
źródło
n%2
ani nie jest podobna: PPython 2 ,
605756 bajtówWypróbuj online!
źródło
&n&
. Liczba 5 byłaby fałszywie ujemna, gdyby była liczbą de Polignaca, ponieważ 1 + 4 = 5, ale to nie jest problem, ponieważ 2 + 3 = 5 i tak.Galaretka , 10 bajtów
Alternatywne 10-bajtowe przesłanie galaretki do już opublikowanego.
Łącze monadyczne zwracające 1 dla liczb de Polignac i 0 w przeciwnym razie.
Wypróbuj online! lub zobacz te poniżej 1000 .
W jaki sposób?
źródło
05AB1E ,
98 bajtów-1 bajt dzięki Emignie
Wyjścia
0
dla prawdziwych danych wejściowych i1
dla fałszywych danych wejściowych.Wypróbuj online!
źródło
1å
może byćZ
.Python 2 , 99 bajtów
Wypróbuj online!
-4 bajty dzięki Dziurawej Zakonnicy
-2 bajty dzięki Wondercricket
+8 bajtów, aby naprawić błąd
-1 bajt dzięki Mr. Xcoder
-3 bajty dzięki Einkorn Enchanter
+12 bajtów, aby naprawić błąd
źródło
Regex (ECMAScript), 97 bajtów
Problem ten stanowił interesujący przypadek do obejścia problemu braku nieatomowej perspektywy. I to jak dotąd jedyny raz, kiedy miałem dobry powód, aby przetestować obie wersje potęgi 2,
((x+)(?=\2$))*x$
i(?!(x(xx)+)\1*$)
, w tym samym wyrażeniu regularnym, i jak dotąd jedyny potrzebny mi czas, aby zabezpieczyć test główny przed dopasowaniem 1, ponieważ(?!(xx+)\1+$)xx
w przypadku użycia w większym wyrażeniu regularnym.^(?!(xx)*$|(x+)((?!(xx+)\4+$).*(?=\2$)((x+)(?=\6$))*x$|(?!(x(xx)+)\7*$).*(?=\2$)(?!(xx+)\9+$)xx))
Wypróbuj online!
Regex (ECMAScript + przegląd molekularny),
5352 bajty^(?!(xx)*$|(?*xx+(((x+)(?=\4$))*x$))\2(?!(xx+)\5+$))
Ta wersja jest nie tylko o wiele czystsza, ale także znacznie szybsza, ponieważ zamiast cyklicznie przewijać wszystkie możliwe sposoby, że N jest sumą dwóch liczb, może po prostu cyklicznie odejmować każdą potęgę 2 od N i sprawdzać różnicę pod względem bycia liczbą pierwszą .
Molekularny lookahead można łatwo przekształcić w look-look o zmiennej długości:
Regex (.NET lub ECMAScript 2018),
5554 bajtów^(?!(xx)*$|xx+(((x+)(?=\4$))*x$)(?<=(?<!^\5+(x+x))\2))
Wypróbuj online! (.NET)
Wypróbuj online! (ECMAScript 2018)
źródło
^(?!(x+)((?!(xx+)\3+$)x*(?!(x(xx)+)\4*$)|x(?!(x(xx)+)\6*$)x*(?!(xx+)\8+$)x)?\1$)
bez większych trudności. Następnie, po dokładnym przemyśleniu, można grać w golfa dalej^(?!(x+)((x?)(?!(x(x\3)+)\4+$)x*(?!(x(xx)+|\3\3+)\6+$)\3)?\1$)
. Krótszy może być jeszcze możliwy(x(xx)+|\3\3+)
->(x\3?(xx)+)
Mathematica, 41 bajtów
źródło
PrimeQ[#-2^Range[0,Log2@#]]
zPrimeQ[#-2^Range[0,#]]
, a następnie przezPrimeQ[#-2^Range@#/2]
.PHP , 75 bajtów
drukuje 1 dla prawdy i 0 dla fałszu
Wypróbuj online!
Wypróbuj online! Liczby całkowite Polignac poniżej 10000
źródło
Pari / GP , 34 bajty
Wypróbuj online!
źródło
Brachylog ,
1513 bajtówWypróbuj online!
Dane wyjściowe liczb Polignaca do 1000.
Zwraca
false.
numery de Polignac itrue.
inne.Na podstawie usuniętej odpowiedzi @ LeakyNun, z kilkoma poprawkami błędów (opublikowanymi za ich zgodą).
(-2 bajty za pomocą metody @Jonathan Allan, aby sprawdzić, czy liczba jest potęgą dwóch).
Podany numer nie jest liczbą de Polignac, jeśli:
źródło
=h2
byłby 1 bajt krótszy, ale nie działa dla3
żadnego z nich.Galaretka , 13 bajtów
Wypróbuj online!
Dane wyjściowe
1
dla false i0
true.źródło
Ḷ2*ạfÆRṆ
następnie sprawdź parzystośćḶ2*ạfÆRṆo‘Ḃ
zwraca1
oba127
i22
; to nie tak. Chyba że nie to zasugerowałeś.0
149.ạ
aby_@
to naprawić.Perl 6 , 55 bajtów
Wypróbuj online!
(1, 2, 4 ... * > $_)
jest sekwencją potęg dwóch do momentu argumentu wejściowego (Perl wyprowadza szereg geometryczny z podanych elementów).grep &is-prime, ^$_
jest listą liczb pierwszych aż do argumentu wejściowego.[X+]
ocenia sumę wszystkich elementów iloczynu krzyżowego dwóch serii.Mógłbym zrobić bez
so
dwóch bajtów mniej, ale wtedy zwraca dwie różne wartości fałszowania (0
iFalse
).źródło
Aksjomat, 86 bajtów
test i wyniki
źródło
Haskell,
104102 bajtówWyjaśnienie
(+)
zastosowanej do funkcji cząstkowej 2 ^, która zostanie zastosowana do listy [0..input]AKTUALIZACJA: Krzycz do Einkorn Enchanter za grę w golfa dwa bajty!
źródło
p x=[x]==[i|i<-[2..x],x`mod`i<1]
jest krótszym testem pierwotności.filter p[1..k]
zamiastfilter(p)[1..k]
Common Lisp, 134 bajty
Zwraca,
NIL
gdy argument jest liczbą Polignac, wT
przeciwnym razie.Wypróbuj online!
Nie golfowany:
źródło
APL (Dyalog Extended) , 12 bajtów
Wypróbuj online!
Anonimowa funkcja ukrytego przedrostka. Zwraca 1 za prawdę, 0 za fałsz.
W dużej mierze na podstawie odpowiedzi Japt ETHProductions .
Dzięki @ Adám za pomoc w grze w golfa moją oryginalną odpowiedź i za zrobienie Dyalog Extended w tym zakresie.
W jaki sposób:
źródło
Python 2 , 98 bajtów
Wypróbuj online!
źródło
Pyth , 14 bajtów
Spróbuj!
źródło
Julia 0.4 , 31 bajtów
Wypróbuj online!
źródło
APL (NARS) 80 znaków, 160 bajtów
Funkcja 0π jest funkcją, która zwraca argument, że jest liczbą pierwszą lub nie. Dla mnie ta funkcja nie jest rekurencyjna, więc jest trochę dłuższa ... Test:
dla wejścia <= 0 lub wejścia> = 9E9 zwraca ¯1 (błąd)
źródło
C # (interaktywny kompilator Visual C #) , 107 bajtów
Wypróbuj online!
Nie jest to najbardziej wydajny kod, ale wydaje się działać. Moje oryginalne rozwiązanie filtrowało liczby pierwsze przed przetestowaniem ich w formule i działało znacznie lepiej. Obecna wersja jest o 11 bajtów krótsza.
źródło