Liczba jest liczbą pierwszą Chen, jeśli spełnia dwa warunki:
- Jest sam w sobie liczbą pierwszą
- Sama plus dwa jest liczbą pierwszą lub półpierwszą.
Liczba pierwsza jest liczbą, w której ma dokładnie dwa dzielniki, a te dzielniki składają się z siebie i jednego.
Półpierwsza to liczba, która jest iloczynem dwóch liczb pierwszych. (Zauważ, że 12 = 2 * 2 * 3 nie jest półpierwsze, ale 25 = 5 * 5 to).
Twoim zadaniem jest ustalenie, czy liczba jest liczbą pierwszą Chena. Powinieneś wypisać dowolną prawdziwą wartość tak i każdą wartość fałszowania dla nie
Wejście będzie dowolną liczbą całkowitą większą lub równą jeden. Może być również traktowany jako ciąg znaków, tablica znaków lub tablica lub cyfry.
Przykłady:
101 -> truthy
223 -> falsy
233 -> truthy
1 -> falsy
To jest OEIS A109611 .
Jest to częściowo zainspirowane tym, czy Am I a Sophie Germain prime? który niestety został zamknięty jako duplikat, więc stawiam nieco powiązane wyzwanie, które nie jest duplikatem.
True
po prawdę i /2
lubFalse
fałsz (niespójne wartości fałszu)?2 * 2 * 2 * 3 * 3
półpierwszy? Co5 * 5
?5*5
jest półpierwszy ,2*2*2*3*3
nie jest. Powiedziałem dokładnie dwa.2*2*2*3*3
ma dokładnie dwóch czynników, a mianowicie2
a3
, i5*5
ma jeden czynnik pierwszy, to znaczy5
). Być może można edytować, że na pytanie?Odpowiedzi:
Brachylog , 7 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
05AB1E , 8 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
ArnoldC , 1339 bajtów
Wypróbuj online!
(To jest mój pierwszy post na codegolf.SE, proszę dać mi znać, jeśli jest źle sformatowany. Zdaję sobie sprawę, że ta liczba bajtów nie jest konkurencyjna, to tylko dla zabawy).
źródło
Galaretka , 10 bajtów
Wypróbuj online!
źródło
Pyth, 10 bajtów
Wypróbuj online!
W jaki sposób?
źródło
Python z sympy ,
6956 bajtów-13 bajtów dzięki alephalpha (poprzez uaktualnienie do sympy 1.1 i użycie
primeomega(n+2)
do zamianysum(factorint(n+2).values())
)... przejmując usunięte zgłoszenie Gryphona.
Nienazwana funkcja powracająca
True
dla liczb pierwszych Chen iFalse
innych.Liczy czynniki
n+2
, sumując krotności jego współczynnika głównego.Należy pamiętać, że
3
jest mnożona przezisprime(n)
zanim<
dokonano porównania, więc dla non-primen
testów kodu, jeślin+2
ma mniej niż0
czynników (zawsze przynoszącychFalse
), natomiast dla najlepszychn
Sprawdza czyn+2
jest pierwsza lub semi-prime.źródło
3*isprime(n)
Sztuką jest to, czego szukałem w sprzątanie instrukcji warunkowej.Pari / GP , 29 bajtów
3*isprime(n)
Trik został skradziony z odpowiedzią Jonathan Allan „s .Wypróbuj online!
źródło
Java 8,
858483 bajtów-1 bajty dzięki @ OlivierGrégoire przy użyciu iteracyjnego podejścia zamiast rekurencyjnego.
Wyjaśnienie:
Wypróbuj tutaj.
źródło
n->{int N=n+2,f=0,F=0,d=1;for(;d++<n;f+=n%d<1?1:0)F+=N%d<1?1:0;return n>1&f<2&F<3;}
.Mathematica, 28 bajtów
źródło
JavaScript (ES6),
6361 bajtówDefiniuje funkcję,
f
która przyjmujen
jako argument i zwraca wynik. Jestem bardzo zadowolony z tego, jak sięg
okazało; zlicza liczbę czynników pierwszych w liczbie.Oszczędność 2 bajtów dzięki sztuczce Kevina Cruijssena
&
.Nie golfił
źródło
&&
na&
? Ponieważ 0/1 są również wartościami prawda / falsey w JS?|
i&
nie powoduje zwarcia, co może zaoszczędzić jeszcze więcej bajtówg
.Japt ,
2220191312 bajtówSprawdź to
źródło
PHP, 64 bajty
drukuje
0
dla prawdy, inne liczby całkowite dla fałszu. Uruchom jako potok z-nR
lub spróbuj online .awaria
spójna wartość falsy, 65 bajtów:
odciski
1
dla prawdy i0
fałszu.źródło
Python 3 z SymPy,
7371 bajtówWypróbuj online!
To jest bardziej golfowa wersja odpowiedzi opublikowanej tutaj wcześniej, ale wygląda na to, że została usunięta.
Dzięki @JonathanAllan za zapisanie 2 bajtów!
źródło
f=
, tworzenie nienazwanej funkcji jest dobre dla golfa kodowego.PHP , 87 bajtów
Wypróbuj online!
PHP , 87 bajtów
Wypróbuj online!
źródło
APL NARS, 23 znaki
Tutaj π⍵ zwraca tablicę czynników ⍵ różnych od 1; jakiś test:
źródło
Regex (ECMAScript), 31 bajtów
Wypróbuj online! (pokazuje wszystkie liczby pierwsze Chen ≤ 1000)
Biorąc pod uwagę ciąg n
x
s To wyrażenie regularne dopasuje tylko wtedy, gdy n jest liczbą pierwszą Chen.Zapewnia, że n jest większe niż 2 i że łańcuch nie ma postaci.
((xx+)(\2(xx))*)(\1\4)+
Wyrażenie regularne ma dwa znaczenia, w zależności od tego, ile razy
(\2(xx))
się powtarza.Gdy powtórzy się 0 razy, wyrażenie regularne można uprościć
(xx+)\1+
, co odpowiada liczbom złożonym.Kiedy powtórzy się dodatnią liczbę razy, wyrażenie regularne jest równoważne z
((xx+)(\2xx)+)(\1xx)+
To wyrażenie regularne wymaga pewnych wyjaśnień, jednak nie zapewniam wglądu.
Jeśli przejdziesz przez algebrę, okazuje się, że
((xx+)(\2xx)+)(\1xx)+
pasuje do liczb formularzaa*b*c-2
gdziea≥4,b≥2,c≥2
.Będzie więc pasował (prawie), gdy n +2 ma więcej niż 2 czynniki pierwsze. (tzn. ani pierwsza, ani półpierwsza)
Zauważ, że nie pasuje do 6, 16 lub 25, ale to nie ma znaczenia, ponieważ wszystkie są złożone.
(?!((xx+)(\2(xx))*)(\1\4)+$)
Będzie więc pasować, dopóki n nie jest złożone, a n +2 jest liczbą pierwszą lub półpierwszą.Niestety obejmuje to 1 (i 0), więc sprawdzamy, czy n wynosi co najmniej 2 z
xx
Kilka różnych „31 bajtów” to:
źródło
Rubinowy ,
4941 bajtówWypróbuj online!
Dzięki H.PWiz za -8 bajtów
W jaki sposób?
Po pierwsze, uzyskaj ciąg
'l'
powtarzanych n + 2 razy. Następnie zastosuj wyrażenie regularne, aby sprawdzić, czy:(.?)(..)
((..+)\1)(..)
((..+)\2)\1+
Dwie części wyrażenia regularnego generują czwarty przypadek, który nie ma sensu i można go bezpiecznie zignorować
(.?)\2+
:, który rozwiązuje puste ciąg lub pojedynczy znak, ponieważ\2
jest pusty.źródło
|
bliżej siebie:^((..+)\2+)(\1+|..)$
. Zgrabny zbieg okoliczności, że próbowałeś tego problemu z wyrażeniem regularnym w podobnym czasie do mnie :).
zamiast,.?
ponieważ dane wejściowe wynoszą zawsze co najmniej 1Julia, 59 bajtów
źródło
Pyt , 11 bajtów
3 * isprime (x) skradziony z odpowiedzi Jonathana Allana
źródło
Haskell , 163 bajty
Wypróbuj online!
źródło