Każdy palindrom z parzystą liczbą cyfr dzieli się przez 11, więc 11 jest jedyną [liczbą palindromową] z parzystą liczbą cyfr. - David Wasserman, OEIS
Nauczyłem się tego dzisiaj ręcznie, zanim zacząłem swoje badania, kiedy mój program pomijał liczby z parzystą liczbą cyfr (oprócz 11) podczas obliczania liczb pierwszych palindromicznych. Twoje zadanie: stwórz program lub funkcję, która otrzyma liczbę całkowitą N, która wypisze N-ty termin w sekwencji Stephen's Palindromic Sequence ™.
Stephen's Palindromic Sequence ™
Sekwencja Palindromowa Stephena ™ zaczyna się od 11 i kontynuuje od półpierwszych palindromowych podzielnych przez 11. Zasadniczo wszystkie półpierwsze, które byłyby liczbami pierwszymi, gdyby 11 się nie liczyły. Plusem jest to, że ta lista zawiera liczby o parzystej liczbie cyfr! Tak I wiele liczb o nieparzystej liczbie cyfr jest pomijanych, ponieważ były już pierwsze.
Początek sekwencji:
1 : 11
2 : 22
3 : 33
4 : 55
5 : 77
6 : 121
7 : 737
8 : 979
9 : 1111
10 : 1441
11 : 1661
12 : 1991
13 : 3113
14 : 3223
15 : 3443
16 : 3883
17 : 7117
18 : 7447
19 : 7997
20 : 9119
21 : 9229
22 : 9449
23 : 10901
* Chociaż 1331 (11 ^ 3) i podobne pasują do ducha tej sekwencji, nie pasują do reguł.
Dłuższe przypadki testowe:
26 : 91619
31 : 103301
41 : 139931
51 : 173371
61 : 305503
71 : 355553
81 : 395593
91 : 725527
101 : 772277
127 : 997799
128 : 1099901
141 : 3190913
151 : 3739373
161 : 7589857
171 : 9460649
200 : 11744711
528 : 39988993
Wejście
Liczba całkowita N,> = 1. Możesz użyć N z indeksowaniem 0 (pamiętaj o dostosowaniu przypadków testowych), jeśli podasz to w swojej odpowiedzi. Końcowe znaki nowej linii są dozwolone.
Wynik
Nth termin w Stephen's Palindromic Sequence ™. Końcowe znaki nowej linii są dozwolone.
Zasady
- Jedyne wejście, jakie może przyjąć Twój program / funkcja, to N. Twój program nie może na przykład pobrać sekwencji z OEIS ( obowiązują również standardowe luki ).
- Musisz być w stanie wydrukować wynik do sześciu cyfr (N = 127). Czas nie ma znaczenia - jeśli jednak twój program / funkcja bardzo szybko się wydłuża, musisz udowodnić, że algorytm działa. Jeśli twój język naturalnie pozwala na dłuższe wyniki, możesz pozwolić mu rozwinąć się naturalnie do jego limitu lub ograniczyć go do dziesięciu cyfr, w zależności od tego, co wolisz. Wyjście / zakończenie poza twoim limitem nie ma znaczenia, o ile nie wydaje się być prawidłowym wyjściem.
- Funkcja programu / funkcji przy nieprawidłowym wejściu nie ma znaczenia.
Odpowiedzi:
Galaretka ,
1813 bajtówZ jakiegoś powodu jest to znacznie wolniejsze niż moja początkowa wersja, mimo że robię dokładnie to samo.
Wypróbuj online!
N = 127
Jak to działa
źródło
Python 2 ,
767372706968 bajtówDzięki @WheatWizard za grę w golfa z 3 bajtów!
Dzięki @ ØrjanJohansen za grę w golfa na 1 bajcie!
Dzięki @xnor i @ ØrjanJohansen za utorowanie drogi do 68 bajtów!
Wejście jest indeksowane na 0. Wypróbuj online! lub sprawdź pierwsze 31 przypadków testowych .
tło
Przypomnijmy, że twierdzenie Wilsona stwierdza, że dla wszystkich liczb całkowitych p> 1 ,
co oznacza, że (p - 1)! + 1 można podzielić równo przez p wtedy i tylko wtedy, gdy p jest liczbą pierwszą.
Jeśli p> 1 nie jest liczbą pierwszą, jest złożone; niech q będzie najmniejszym głównym dzielnikiem p . Oczywiście, q ≤ p / q . Istnieją dwa przypadki:
Jeśli q = p / q , mamy to p = q² .
Jeśli q = 2 , (p - 1)! = 3! = 6 , więc (p - 1)! jest zgodny z 2 modulo p .
Jeśli p / q = q> 2 , więc 2q <p . W ten sposób q i 2q należą do 1,…, p - 1 , którego iloczyn jest silnią p - 1 , więc 2p = 2q² = q · 2q dzieli (p - 1)! równomiernie.
Jeśli q <p / q , q i p / q znajdują się między 1,…, p - 1 , więc p = q · p / q dzieli (p - 1)! równomiernie.
Podsumowując,
dla wszystkich liczb całkowitych p> 1 .
Teraz, dla wszystkich przystawek liczb całkowitych i wszystkich liczb całkowitych a , b i c , obowiązują następujące.
Gdy a = -1 , b = 11 i c = -1 , podążamy za tym
a ponieważ 21 i -23 są przystające modulo 44, a -1 i 11p-1 są przystające modulo 11p , dochodzimy do następującego wniosku.
Dla wszystkich możliwych wartości p wynik ( 11 , 21 lub 11p - 1 ) mieści się w zakresie 0,…, 11p - 1 , więc wartości te są zgodne z wartościami zwracanymi przez
%
operatora Pythona .Jak to działa
Inicjujemy c , k oraz m do 11 po zapisaniu danych wejściowych w n . c będzie stały przez pozostałą część programu. Ponieważ istnieją trzy wystąpienia c na poniższej linii i przypisanie c kosztuje tylko dwa bajty, to zapisuje bajt. k można pomyśleć o 11p, używając znaczenia p z poprzedniego akapitu; początkowo k = 11 = 11,1! . m zajmuje miejsce 11 · (p - 1)! ; początkowo m = 11 = 11,0! . k i mspełni relację m = 11 · (k / 11)! w każdym momencie.
n oznacza liczbę „palindromów Szczepana”, którą musimy znaleźć. Ponieważ k = 11 początkowo możemy wypisać k dosłownie bez dalszych obliczeń. Jednak gdy n jest dodatnie, wchodzimy do pętli while. Pętla zaczyna się od pomnożenia m przez k / c = p , a następnie dodania 11 do k , zwiększając w ten sposób p . Jeśli k jest członkiem sekwencji, odejmujemy 1 od n i zaczynamy od nowa. Gdy n osiągnie wartość 0 , znaleźliśmy element sekwencji o pożądanym indeksie i wyrwamy się z pętli, a następnie wypisujemy ostatnią wartość k.
Ekspresja
wykonuje rzeczywisty test, a jego wynik ( True / 1 dla elementów sekwencji, 0 / False w przeciwnym razie) jest odejmowany od n . Jak widać wcześniej, ~ m% k = (-m - 1)% k = (-11 · (p - 1)! - 1)% 11p równa się 10, jeśli p jest liczbą pierwszą, 21 jeśli p = 4 , a 11p - 1 > 43, jeżeli p> 4 jest złożony. Tak więc, po odjęciu c = 11 , pozostajemy -1 dla liczby pierwszej p i dodatniej liczby całkowitej większej niż 9 w przeciwnym razie.
Do prime p ,
`k`[::-1]
daje nam reprezentację ciąg k z odwróconej kolejności cyfr, więc porównując go do`k`
kontroli, czy k jest palindrom. Jeśli tak, wszystkie warunki są spełnione, a k jest członkiem sekwencji. Jeśli jednak p nie jest liczbą pierwszą, krok dużego zakresu i fakt, że k będzie zawsze mieć więcej niż jedną cyfrę, oznacza, że`k`[::-1]
nie może mieć takiej samej liczby cyfr jak`k`
, a co dopiero być równym.źródło
Brachylog , 17 bajtów
Wypróbuj online!
Jest to indeks 1.
Wyjaśnienie
Dwie realizacje z tą odpowiedzią:
⁽
) nie działa, jeśli nie ma żadnych danych wejściowych do przekazania (dlatego muszę to dodać:I
).N
wynik th predykatu (co pozwoliłoby uniknąć użycia,ᶠ⁽t
a zamiast tego npⁿ⁽
.).Wdrożenie obu zmian sprawiłoby, że ta odpowiedź miałaby 14 bajtów.
źródło
Mathematica,
6560 bajtówIteruje bezpośrednio przez liczby pierwsze,
NextPrime
sprawdzając, czy 11 razy liczba pierwsza jest palindromem. Działa do N = 528 . Wyniki 528 i 529 są oddalone o więcej niż 2 16 liczb pierwszych, w którym to momencie//.
nie uda się podjąć wystarczającej liczby podstawień.źródło
Python 2 ,
111107103102101100919089 bajtówDennis mnie tu pobił , więc sprawdź jego odpowiedź.
Ta odpowiedź jest indeksowana zerowo
Wypróbuj online!
Jeden bajt zaoszczędzony dzięki ćpunowi matematycznemu
Wyjaśnienie
Najpierw pobieramy dane wejściowe i ustawiamy je na
n
, a także tworzymy nową zmiennąr=1
. Będziemy liczyćr
szukanie palindromów, które są iloczynem liczby pierwszej i 11. Za każdym razem, gdy znajdziemy jedną, zmniejszamyn
ją, aż osiągnie 0.Rozpoczynamy pętlę:
Pierwszą rzeczą, którą robimy, jest przyrost
r
Predefiniujemy również zmienną
c
jako reprezentację ciągur*11
Teraz chcemy zmniejszyć,
n
jeśli znaleźliśmy taką liczbę. Po prostu odejmiemy wartość logiczną reprezentującą ifr*11
pasuje do wzorcar
. Jeśli takFalse
, odejmiemy zero, a jeśli takTrue
, odejmiemy 1.Aby obliczyć wartość logiczną, wykonujemy:
Pierwsza część
all
określi, czyr
jest liczbą pierwszą. Pomnożymy wynik przezc
ifr
jest liczbą pierwszą, będzie to po prostu,c
ale jeślir
jest złożone, będzie to""
pusty ciąg znaków. Następnie porównujemy toc[::-1]
z odwrotnościąc
. Gdybyr
jest liczbą pierwszą ic
jest palindromem, to będzieTrue
, jeśli jedno z nich się nie powiedzie, cała rzecz będzie oceniana jako fałszywa.Gdy
n
wynosi zero, po prostuprint c
.83 bajty
Oto rozwiązanie rekurencyjne, które jest krótsze, ale niestety nie spełnia specyfikacji, ponieważ zbyt szybko uderza w limit rekurencyjny Pythona.
Wypróbuj online!
źródło
05AB1E , 15 bajtów
0-indeksowane.
Wypróbuj online!
Wyjaśnienie
źródło
Haskell ,
9490 bajtówWypróbuj online! Przykładowe zastosowania:
([n|n<-[0,11..],(==)=<<reverse$show n,3>2#n]!!) 127
.[0,11..]
konstruuje nieskończoną listę[0,11,22,33, ...]
(zero jest potrzebne, aby sekwencja była indeksowana 1). Dla każdejn
z tej listy sprawdzamyn==(read.reverse.show)n
, czyn
jest to palindrom.3>2#n
sprawdza, czyn
ma najwyżej dwa główne dzielniki. Ponieważn
zawsze jest podzielna przez 11, nie otrzymujemy żadnych liczb pierwszych rzeczywistych, a tylko półpierwsze.Edycja: Podziękowania dla Ørjana Johansena za grę w 4 bajty!
źródło
div n h
. Wpływa także tylko na wydajność, ale2#
prawdopodobnie pierwszah#
.(==)=<<reverse$show n
jest krótszy.PHP, 82 bajty
Wypróbuj online!
źródło
$argn=81;
jest to zmienna wejściowa dostępna w wersji z wierszem poleceńAksjomat, 105 bajtów
Ungolf, kod testu i wyniki
Tutaj g (700) = 92511529, więc limit wynosiłby> 700; ww (1000) = 703999307, ale przy użyciu nextPrime ()
źródło