Jak wszyscy wiemy, żółwie schodzą w dół . Ale czy jest to również liczba pierwsza?
Liczbę uważa się za „pierwszą żółwia”, jeżeli spełnia następujące warunki:
1) It is prime.
2) It is possible to remove a single digit leaving a prime number.
3) Step 2 can be repeated until left with a single digit prime.
Na przykład 239
jest „żółwiem”, ponieważ można je zredukować do 23
jednego 2
lub 3
obu, które są pierwsze. To również może być zredukowana do 29
wtedy 2
. 151
nie jest liczbą pierwszą żółwia, ponieważ redukuje się do 15
(nie pierwsza), 51
(nie pierwsza) lub 11
. 11
jest liczbą pierwszą, ale można ją jedynie zredukować 1
, co nie jest.
Biorąc pod uwagę dodatnią liczbę całkowitą, określ, czy jest to „liczba żółwia”. Twój wynik może być w dowolnej formie, pod warunkiem, że daje to samo wyjście dla dowolnej wartości prawdziwej lub falsey.
Przypadki testowe:
input -> output
1 -> false
2 -> true
17 -> true
19 -> false
239 -> true
389 -> false
Punktacja
To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w każdym języku!
Odpowiedzi:
Galaretka , 16 bajtów
Wypróbuj online!
Jak to działa
źródło
Haskell ,
1041029998979591 bajtówWypróbuj online!
Wyjaśnienie
Najpierw przeprowadzamy test pierwszeństwa
Wykorzystuje to Twierdzenie Wilsona do ustalenia pierwotności danych wejściowych.
Następnie deklarujemy przypadek podstawowy, który zapewni, że pusty ciąg znaków jest prawdziwy.
Teraz definiujemy rzeczywistą funkcję
Używamy straży wzór do wiązania
zip[0..]x
doy
, dlatego musimy używać go dwa razy później. Następnie twierdzimy, że odpowiedź brzmi[[snd b|b<-y,b/=a]|a<-y]
to wszystkie liczby, które są cyframi usuwanymi z naszych danych wejściowych. Twierdzimy więc, że co najmniej jedna z tych liczb jest prawdziwaf
. Aby upewnić się, że liczby złożone są fałszywe, dodajemyprime$read x
. Jeśli liczba nie jest liczbą pierwszą, lista stanie się pusta, aany
pusta lista będzie fałszywa.źródło
any f[[
↦or[f[
[b|(i,b)<-y,i/=a]|(a,_)<-y
↦[snd b|b<-y,b/=a]|a<-y
R,
1241221201139593106105 bajtówKtóry ocenia się na funkcję:
Rozwiązanie rekurencyjne. Pobiera dane wejściowe jako listę cyfr.
Ma 2 logiczne instrukcje:
Czy
x
łączna jest liczba pierwsza?Czy którykolwiek z poniższych
TRUE
:Czy długość jest
x
niezerowa? To jest nasz końcowy warunek zakończenia.Czy
f
TRUE
dla dowolnego podzbiorux
?Pierwsze stwierdzenie gwarantuje, że nadal pracujemy tylko na liczbach pierwszych. Drugi dokonuje rzeczywistej rekurencji.
Zaoszczędzono dwa bajty dzięki @Giuseppe.
Musiałem cofnąć niektóre z moich golfów z powodu błędu, w którym przez przypadek testowałem z poprzednią definicją funkcji.
R, 98 bajtów, niekonkurujący
Jak wspomniałem w komentarzach, zrobiłem paczkę . Ponieważ wyzwanie to poprzedza, nie jest to konkurencja, ale chciałem to trochę pokazać. Jak dotąd niewiele, ale się tam dostaniemy.
C()
to pierwsza funkcja w pakiecie, która zajmuje się łączeniem cyfr w cyfrę.źródło
sum(x*10^(((l<-sum(x|1))-1):0))
) są tak cholernie niewygodne. Naprawdę zastanawiam się nad stworzeniem pakietu golfowegoR
.sapply
... Myślę też, że możesz chcieć to zrobićf=pryr::f(...)
lub użyćf
wsapply
.g
lub czegoś takiego?el(strsplit(x,''))
zaoszczędziłoby mnóstwo bajtów.Galaretka , 19 bajtów
Wypróbuj online!
Jak to działa
Rekurencja bez skrzynki podstawowej ftw.
źródło
Galaretka ,
2726 bajtówMonadyczny link przyjmujący i zwracający liczby całkowite (
1
dla żółwia0
inaczej).Wypróbuj online!
W jaki sposób?
źródło
Rubinowy ,
7257 + 8 =8065 bajtówUżywa
-rprime
flagi. -15 bajtów od histocrata!Wypróbuj online!
źródło
&&!!
just&
, spowoduje to rzutowanie wyniku na wartość logiczną. Twoje rekurencyjne wezwanie może być również nieco krótsze przy użyciu perlizmów:!n.scan(/./){f[$`+$']&&break}}
n.scan
sztuczka działa tak, jak działa?.scan.find
, ale możemy ręcznie wyjść z pętli po sukcesie. Jeśli się zepsujemy ,scan
zwracanil
, w przeciwnym razie zwraca ciąg, który jest zawsze zgodny z prawdą.Java, 220 bajtów
Wypróbuj online!
Gra w golfa:
Nie golfowany:
źródło
boolean t(String n){int l=n.length(),x=new Integer(n),i;for(i=2;i<x;x=x%i++<1?0:x);if(x>1)if(l<2)return 1>0;else for(i=0;i<l;)if(t(n.substring(0,i)+n.substring(++i,l)))return 1>0;return 1<0;}
f
jesteś pewien, ale skąd pochodzi?>0
aby przekonwertować int na wartość logiczną), który powinien zaoszczędzić 2 * 2 + 1 * 4 = 8 bajtów w wersji Kevina Cruijssena.05AB1E ,
2827 bajtówIteracyjne rozwiązanie.
Wypróbuj online!
Wyjaśnienie
źródło
Python 2 ,
132124119 bajtów-8 Dzięki @WheatWizard
-5 Dzięki @LeakyNun
Wypróbuj online!
Nie mogę wymyślić niczego, co by go wyostrzyło bez wbudowanego sprawdzania liczb pierwszych. Pobiera liczbę jako ciąg znaków (założyłem, że biorąc pod uwagę PO dozwoloną listę cyfr, ale jeśli nie, to +14 bajtów dla innej lambdy) i rekurencyjnie oblicza turtlenity każdego „żółwia”.
źródło
f=lambda n,i=0:n==''or p(int(n))and i<len(n)and(f(n[:i]+n[i+1:])or f(n,i+1))
oszczędza bajt. Ktoś z lepszymi umiejętnościami gry w golfa w Pythonie prawdopodobnie może to jeszcze bardziej skrócić.C #, 355 bajtów
Wypróbuj online!
Mój pierwszy golf golfowy, więc mam nadzieję, że zrobiłem to dobrze. Nie mogłem wymyślić sposobu, aby uczynić go jeszcze mniejszym (innym niż użycie int zamiast BigInteger, ale zrobiłem to, aby działało dla wszystkich dostarczonych przypadków testowych). Tak czy inaczej, oto ten sam poprawnie sformatowany:
źródło
Perl 6 , 65 bajtów
Wypróbuj online!
źródło
PHP , 164 bajty
Wypróbuj online!
Zaczyna się od przetestowania liczby pod kątem pierwszeństwa, a następnie zapętla cyfry jako tablicę, wyskakując z nich i łącząc resztę z powrotem i karmiąc je rekurencyjnie przez funkcję. Każde łącze w dół wykonuje logiczną operację OR z dolnymi ścieżkami, zwracając je tylko
true
wtedy, gdy istnieje co najmniej jedna ścieżka wszystkich liczb pierwszych.źródło
JavaScript 167 bajtów
Wyjaśnienie
Pokaż fragment kodu
źródło