Jakiś czas temu rzuciłem okiem na pierwszą faktoryzację 27000:
27000 = 2 3 × 3 3 × 5 3
Są w tym dwie szczególne rzeczy:
- kolejna liczba pierwsza : liczby pierwsze są następujące po sobie: 2 to pierwsza liczba pierwsza, 3 to druga liczba pierwsza, 5 to trzecia liczba pierwsza.
- wykładnik stały : wykładnik jest taki sam dla każdej liczby pierwszej (zawsze 3)
Wyrażony matematycznie:
Liczba całkowita x jest liczbą pierwszą / stałą wykładnika, jeśli istnieją ściśle dodatnie liczby całkowite n , k , m takie, że x = p n m × p n +1 m × ... × p n + k m , gdzie p j jest j-tą pierwszą liczbą pierwszą
Twoim zadaniem jest sprawdzenie, czy dodatnia liczba całkowita spełnia te warunki.
Wkład:
Dodatnia liczba całkowita> 1, w dowolnej rozsądnej formie.
Wydajność:
Jedna z dwóch wartości, z których co najmniej jedna musi być stała, wskazująca, czy dane wejściowe są liczbą pierwszą / stałą-wykładnikiem.
Obudowy krawędzi:
- liczby pierwsze są prawdą, ponieważ rozkład na czynniki pierwsze p wynosi p 1
- inne liczby, które można zapisać jako p m, gdzie p jest liczbą pierwszą, są również prawdziwe.
Zasady:
- Obowiązują standardowe luki.
- Nie martw się przepełnieniem liczb całkowitych, ale liczby do 255 muszą działać.
- Najkrótszy kod w bajtach wygrywa.
Przypadki testowe:
Prawda:
2
3
4
5
6
7
8
9
11
13
15
27000
456533
Falsy:
10
12
14
72
10000000
Oto skrypt Pythona generujący niektóre przypadki testowe.
Fakt, że zaakceptowałem odpowiedź, nie oznacza, że wyzwanie się skończyło; zwycięzca może się jeszcze zmienić!
code-golf
decision-problem
number-theory
primes
pustkowie
źródło
źródło
x = Pn^m
części. Zakładam, że miałeś na myśli, że Pn jest n-tą liczbą pierwsząOdpowiedzi:
05AB1E , 4 bajty
Wypróbuj online!
Wyjaśnienie
źródło
ÎÓKË
to wszystko, co mogę wymyślić poza tym, miłym ... Myślałem,ß
ale robi to odwrotnie niż myślałem.Regex (ECMAScript),
276205201193189 bajtówPorównywanie wielokrotności (wykładników) różnych czynników pierwszych jest interesującym problemem do rozwiązania za pomocą wyrażenia regularnego ECMAScript - brak odniesień wstecznych, które utrzymują się przez iteracje pętli, sprawia, że liczenie wszystkiego jest trudne. Nawet jeśli policzenie omawianej cechy numerycznej jest możliwe, często bardziej pośrednie podejście zapewnia lepsze golfa.
Podobnie jak w przypadku moich innych wpisów regularnych ECMA, dam ostrzeżenie spoilerowe: Gorąco zalecam nauczenie się rozwiązywania pojedynczych problemów matematycznych w wyrażeniu regularnym ECMAScript. To była dla mnie fascynująca podróż i nie chcę zepsuć jej nikomu, kto mógłby potencjalnie chcieć spróbować samemu, szczególnie tym, którzy interesują się teorią liczb. W tym wcześniejszym poście znajduje się lista zalecanych problemów oznaczonych spoilerem do rozwiązania jeden po drugim.
Więc nie czytaj dalej, jeśli nie chcesz, aby zepsuła Ci się jakaś zaawansowana magia wyrażeń regularnych . Jeśli chcesz spróbować samodzielnie odkryć tę magię, zdecydowanie polecam zacząć od rozwiązania niektórych problemów z wyrażeniem regularnym ECMAScript, jak opisano w linku powyżej.
Główny ładunek z regexu, który wcześniej opracowałem, okazał się bardzo odpowiedni do tego wyzwania. To jest wyrażenie regularne, które znajduje liczbę pierwszą o największej krotności . Moje pierwsze rozwiązanie tego problemu było bardzo długie, a później grałem w golfa etapami, najpierw przepisując go, aby użyć molekularnego spojrzenia , a następnie przenosząc go z powrotem do zwykłego ECMAScript za pomocą zaawansowanej techniki, aby obejść brak molekularnej perspektywy , a następnie gra w golfa jest znacznie mniejsza niż oryginalne proste rozwiązanie ECMAScript.
Część tego wyrażenia regularnego, która dotyczy tego problemu, jest pierwszym krokiem, w którym znajduje się Q, najmniejszy czynnik N, który dzieli wszystkie swoje czynniki pierwsze. Gdy już otrzymamy tę liczbę, wszystko, co musimy zrobić, aby pokazać, że N jest „liczbą o stałym wykładniku”, dzieli N przez Q, dopóki nie możemy dłużej; jeśli wynik wynosi 1, wszystkie liczby pierwsze są równe wielokrotności.
Po przesłaniu odpowiedzi przy użyciu mojego wcześniej opracowanego algorytmu znajdowania Q, zdałem sobie sprawę, że można go obliczyć w zupełnie inny sposób: Znajdź największy współczynnik kwadratowy N (używając tego samego algorytmu jak mój regex liczby Carmichaela ). Jak się okazuje, nie stanowi to żadnego problemu * pod względem obejścia braku molekularnego spojrzenia przed siebie i spojrzenia o zmiennej długości (nie trzeba wciągać wcześniej stosowanej techniki zaawansowanej) i jest o 64 bajty krótszy! Dodatkowo eliminuje to złożoność traktowania bezkwadratowego N i pierwszej N jako różnych specjalnych przypadków, usuwając kolejne 7 bajtów z tego rozwiązania.
(Nadal istnieją inne problemy, które wymagają zaawansowanej techniki używanej wcześniej do obliczania Q, ale obecnie żaden z nich nie jest reprezentowany przez moje posty PPCG).
Test wielokrotności stawiam przed testem kolejnych liczb pierwszych, ponieważ ten drugi jest znacznie wolniejszy; umieszczenie testów, które mogą szybciej zakończyć się niepowodzeniem, sprawia, że wyrażenie regularne jest szybsze dla równomiernie rozłożonego wejścia. Lepiej jest też postawić golfa na pierwszym miejscu, ponieważ wykorzystuje on więcej odwołań wstecznych (co kosztowałoby więcej, gdyby były dwucyfrowe).
Byłem w stanie usunąć 4 bajty z tego wyrażenia regularnego (193 → 189), używając sztuczki znalezionej przez Grimy'ego, która może dalej skracać podział w przypadku, gdy iloraz gwarantowany jest większy lub równy dzielnikowi.
^(?=(|(x+)\2*(?=\2$))((?=(xx+?)\4*$)(?=(x+)(\5+$))\6(?!\4*$))*x$)(?=.*$\2|((?=((x*)(?=\2\9+$)x)(\8*$))\10)*x$)(?!(((x+)(?=\13+$)(x+))(?!\12+$)(x+))\11*(?=\11$)(?!(\15\14?)?((xx+)\18+|x?)$))
Wypróbuj online!
* Jest jeszcze czystszy z molekularnym spojrzeniem w przód, bez specjalnego przypadku, w którym N nie ma kwadratu. To zrzuca 6 bajtów, co daje
195187183 bajtów :^(?=(?*(x+))\1*(?=\1$)((?=(xx+?)\3*$)(?=(x+)(\4+$))\5(?!\3*$))*x$)(?=((?=((x*)(?=\1\8+$)x)(\7*$))\9)*x$)(?!(((x+)(?=\12+$)(x+))(?!\11+$)(x+))\10*(?=\10$)(?!(\14\13?)?((xx+)\17+|x?)$))
Tutaj jest przeniesiony do look-look za zmienną długością:
Regex (ECMAScript 2018),
198195194186182 bajtów^(?=(x+)(?=\1*$)(?<=^x((?<!^\5*)\3(?<=(^\4+)(x+))(?<=^\5*(x+?x)))*))((?=((x*)(?=\1\8+$)x)(\7*$))\9)*x$(?<!(?!(\14\16?)?((xx+)\12+|x?)$)(?<=^\13+)((x+)(?<!^\15+)((x+)(?<=^\17+)(x+))))
Wypróbuj online!
źródło
.*$\2
z\2^
^(?=(|(x+)\2*(?=\2$))(((?=(xx+?)\5*$)(?=(x+)(\6+$))\7(?!\5*$))*x$))(?!(((xx+)(?=\10+$)(x+))(?!\9+$)(x+))\8*(?=\8$)(?!(\12\11?)?(xx+)\14+$))((?=((x*)(?=\2\17+$)x)(\16*$))\19)*\3$
Galaretka ,
1365 bajtówWypróbuj online!
Nadal zalesiony ... (dzięki Erik za -1 bajt)
Wyjaśnienie
źródło
œl
->t
. Nie ma powodu, aby końcowe zera były obecne w wyjściu ÆE.JavaScript (ES6), 87 bajtów
Zwraca 0 dla wartości true lub niezerową liczbę całkowitą dla falsy.
Wypróbuj online!
Skomentował
źródło
j||i
nai
. Teraz daje wiele fałszywych trafień.CJam ,
3029 bajtówWypróbuj online!
Moja pierwsza odpowiedź po prawie 2 (!) - letniej przerwie, więc prawdopodobnie można więcej grać w golfa. Jest to blok, który przyjmuje dane wejściowe jako liczbę całkowitą (można je również odwzorować dla tablic liczb całkowitych).
Wyjaśnienie
źródło
Stax ,
56 bajtówUruchom i debuguj
Rozpakowane, niepolowane i skomentowane, wygląda to tak.
Edycja:
To nie działaTeraz działa.512
. Zastanowię się i mam nadzieję, że później.źródło
Stax , 9 bajtów
1 to prawda, 0 to fałsz
Uruchom i debuguj
Wyjaśnienie
Prawdopodobnie można grać w golfa więcej, ale obejmuje przypadki, których brakowało mi w ostatnim rozwiązaniu.
źródło
MATL ,
12 1110 bajtówWypróbuj w MATL Online!
Podziękowania dla Luisa Mendo za część usuwania wiodących zer. Zwrócił także uwagę, że zamiana wartości prawdy jest dozwolona, więc to powraca 0 dla liczb, które spełniają wymagania wyzwania, i wszelkich wartości dodatnich w przeciwnym razie.
Grosso Modo, to generuje wykładniki sekwencyjnego rozkładania na czynniki pierwsze, usuwa zera wiodące i oblicza odchylenie standardowe.
źródło
0iYFhdz
działa na 7 bajtów: dodaj 0 do wykładników sekwencjonowania, kolejnych różnic, liczby niezerowych. Rezultatem jest1
wejście iff spełnia ten wymógJava 10,
223191178176168 bajtówZwraca
1
jako prawdomówny i>=2
falsey.Wypróbuj online.
Wyjaśnienie:
Niektóre przykładowe dane wejściowe:
n=15
:1
dla pierwszej liczby pierwszej 2 (ponieważ 15 nie jest podzielne przez 2).1
do,0
gdy tylkon
osiągniemy liczbę pierwszą 3. Ponieważ 15 można podzielić przez 3, staje się 5 (15/3 1 ), a zestaw staje się[] → [1]
.n
staje się 1 (5/5 1 ), a Set pozostaje ten sam ([1] → [1]
).n=1
zatrzymujemy zewnętrzną pętlę. Set ([1]
) zawiera tylko jeden element,1
z obu sąsiednich liczb pierwszych 3 i 5, więc zwracamy true.n=14
:1
do0
dla pierwszej liczby pierwszej 2 (ponieważ 14 można podzielić przez 2).n
staje się 7 (14/2 1 ), a Zestaw staje się[] → [1]
.n
pozostaje takie samo, a Set staje się[1] → [1,0]
.n
pozostaje takie samo, a Set również pozostaje taki sam ([1,0] → [1,0]
).n
staje się 1 (7/7 1 ), a Set pozostaje taki sam ([1,0] → [1,0]
).n=1
zatrzymujemy zewnętrzną pętlę. Set ([1,0]
) zawiera dwa elementy,1
z nieprzylegających liczb pierwszych 2 i 7 oraz0
z liczb pierwszych 3 i 5, więc zwracamy false.n=72
:1
do0
dla pierwszej liczby pierwszych 2, ponieważ 72 można podzielić przez 2 (wiele razy). Tak więcn
staje się 9 (72/2 3 ), a Set staje się[] → [3]
.n
staje się 1 (9/3 2 ), a Set staje się[3] → [3,2]
.n=1
zatrzymujemy zewnętrzną pętlę. Set ([3,2]
) zawiera dwa elementy,3
from prime 2 i2
from prime 3, więc zwracamy false.źródło
<2
i zwrócić liczbę całkowitą (określ, że zwracasz 1 dla wartości „prawda”).1
jest to prawda, a2
wyższa to falsey. Dzięki.J , 16 bajtów
Ogromne podziękowania dla FrownyFrog za -8 bajtów!
Wypróbuj online!
Moje stare rozwiązanie:
J , 24 bajty
Wypróbuj online!
Wyjaśnienie:
_&q:
pierwsi wykładnicy{.@I.}.]
usuwa wiodące zera, znajdując pierwszy niezerowy element:1=[:#@~.
sprawdza, czy wszystkie pozostałe liczby są równe:źródło
Łuska , 11 bajtów
Wypróbuj online!
Wyprowadza wartość 0, jeśli nie jest liczbą pierwszą / stałą wykładnika.
źródło
MATL , 7 bajtów
Wynikiem jest
1
wejście iff spełniające wymagania.Wypróbuj online! Lub sprawdź wszystkie przypadki testowe
Wyjaśnienie
źródło
Oktawa , 67 bajtów
Wypróbuj online!
Uważam, że to jedyne rozwiązanie wykorzystujące histogram.
Wyjaśnienie:
To tworzy histogram, w którym zmienną do zliczenia są czynniki wejściowe i umieszczane w przedziałach
primes(x)
, które są liczbami pierwszymi mniejszymi niż dane wejściowe. Następnie znajdujemy lokalizację czynników pierwszych, uwzględniamy różnicę między każdym z indeksów i odejmujemy jeden. Jeśli są jakieś elementy, które nie są zerowe (tj. Różnica wskaźników liczb pierwszych nie wynosi 1), spowoduje to wartość fałszowania, w przeciwnym razie zwróci wartość prawdziwości.Następnie sprawdzamy, czy wszystkie niezerowe elementy na histogramie są równe maksymalnemu elementowi. Jeśli istnieją wartości, które nie są równe, spowoduje to wartość fałszowania, w przeciwnym razie zwróci wartość prawdziwości.
Jeśli oba te bloki są zgodne z prawdą, to naszym wejściem jest kolejna liczba wykładnicza stałej stałej!
źródło
APL (Dyalog Extended) , 28 bajtów
Wypróbuj online!
W jaki sposób:
źródło
Wolfram Language (Mathematica) , 65 bajtów
Wypróbuj online!
źródło
Pari / GP , 63 bajty
Wypróbuj online!
źródło
J , 14 bajtów
1 na wyjściu oznacza kolejny stały wykładnik.
Wypróbuj online!
źródło
Czysty , 127 bajtów
Wypróbuj online!
Definiuje funkcję
? :: Int -> Bool
używając$ :: Int -> [Int]
na czynniki i@ :: Int -> Bool
sprawdzić pierwszości.źródło
APL (NARS) 41 znaków, 82 bajty
{π⍵} to funkcja faktoryzacji argumentu ⍵ na liście czynników pierwszych (powtórz, jeśli jedna liczba pierwsza pojawi się więcej czasu);
{1π⍵} jest funkcją next prime (zwróć uwagę, że w tym przypadku jej argumentem nie jest skalar, ale jedna tablica liczb całkowitych). test:
źródło