Niektóre liczby, takie jak , są palindromami w podstawie 10: jeśli napiszesz cyfry w odwrotnej kolejności, otrzymasz ten sam numer.
Niektóre liczby są sumą 2 palindromów; na przykład lub .
W przypadku innych liczb 2 palindromy nie wystarczą; na przykład 21 nie można zapisać jako sumy 2 palindromów, a najlepsze, co możesz zrobić, to 3: .
Napisz funkcję lub program, który pobiera liczby całkowite n
i wyprowadza n
liczbę, której nie można rozłożyć na sumę 2 palindromów. Odpowiada to OEIS A035137 .
Pojedyncze cyfry (w tym 0) to palindromy.
Obowiązują standardowe zasady dotyczące sekwencji:
- wejście / wyjście jest elastyczne
- możesz użyć indeksowania 0 lub 1
- możesz
n
wypisać termin, pierwszen
terminy lub nieskończoną sekwencję
(Na marginesie: wszystkie liczby całkowite można rozłożyć jako sumę co najwyżej 3 palindromów.)
Przypadki testowe (indeksowane 1):
1 -> 21
2 -> 32
10 -> 1031
16 -> 1061
40 -> 1103
To jest golf golfowy, więc wygrywa najkrótsza odpowiedź.
n
, wydrukuj n-ty element sekwencji OEIS An? Brzmi obiecująco ...Odpowiedzi:
JavaScript (ES6),
93 83 8079 bajtówZapisano 1 bajt dzięki @tsh
Zwraca ty termin, 1-indeksowany.n
Wypróbuj online!
W jaki sposób?
Biorąc pod uwagę , testujemy, czy istnieje jakikolwiek taki, że zarówno jak i są palindromami. Jeśli znajdziemy takie , to jest sumą dwóch palindromów.n 1≤k≤n k n−k k n
Sztuczka polega na jednoczesnym przetwarzaniu i przez testowanie pojedynczego łańcucha utworzonego z połączenia , i .k n−k k n−k k
Przykład:
Dla :n=2380
Skomentował
Uwaga: To jest wersja bez
eval()
czytelności.źródło
i=>eval("for(n=k=1;k=(s=[...k+[n-k]+k])+''!=s.reverse()?k-1||i--&&++n:++n;);n")
79 bajtówi=>eval("...")
ES6 pozwala na użyciei=>eval`...`
, oszczędzając 2 bajty;n
na końcu.eval()
ponieważ nie zmusza argumentu do łańcucha. Usunięcie;n
spowoduje błąd składniowy, a usunięcien
spowoduje powrót funkcjiundefined
.Galaretka ,
16 109 bajtów-1 bajt dzięki Erik the Outgolfer . Wyprowadza pierwsze wyrażeń.n
Wypróbuj online!
Próbowałem wymyślić inny pomysł niż moje oryginalne podejście. Przyjrzyjmy się procesowi myślenia:
Początkowo test działał w następujący sposób: wygenerował całkowite partycje o tej liczbie, a następnie odfiltrował te, które również zawierały nie-palindromy, a następnie policzył, ile było dopuszczalnych list o długości 2. Nie było to oczywiście zbyt wydajne pod względem długości kodu.
Generowanie całkowitych partycji a następnie filtrowanie miało 2 główne wady: efektywność długości i czasu. Aby rozwiązać ten problem, pomyślałem, że najpierw wymyślę metodę generowania tylko par liczb całkowitych które sumują się do (nie wszystkich list o dowolnej długości), pod warunkiem, że obie liczby muszą być palindromem.N. ( x , y ) N( x , y) N.
Ale nadal nie byłem zadowolony z „klasycznego sposobu” tego. Zmieniłem podejście: zamiast generować pary , skupmy się na programie na indywidualnych palindromach . W ten sposób można po prostu obliczyć wszystkie palindromy poniżej , a jeśli jest również palindromem, to skończymy.x N. N.- x
Objaśnienie kodu
* W tym przypadku działa każda inna niezerowa cyfra.
źródło
Galaretka , 11 bajtów
Wypróbuj online!
Pełny program działa mniej więcej tak:
Możesz podejrzewać, że krok 5 tak naprawdę nie wykonuje pracy, którą powinien. Naprawdę nie powinniśmy zmniejszać wartości z, jeśli wszystkie pary sumujące do x są palindromiczne. Możemy jednak udowodnić, że tak się nigdy nie stanie:
Jeśli natomiastk jest palindromem, możemy udowodnić, że k - 1 nie jest palindromem. Niech pierwsze i ostatnie cyfry k być refa i reL. odpowiednio. Ponieważ k jest palindromem, refa= D.L.> 0 . Niech pierwsze i ostatnie cyfry k - 1 BE re′fa i re′L. odpowiednio. Ponieważ reL.> 0 , re′L.= D.′fa- 1 ≠ D.′fa k - 1 (k−1,x−(k−1)) ( k - 1 ) + ( x - ( k - 1 ) ) = k - 1 + x - k + 1 = x
Dochodzimy do wniosku, że jeśli zaczniemy od ustawienia x na wartość większą lub równą 10 , nigdy nie możemy mieć wszystkich par liczb całkowitych nieujemnych, które sumują się jako x par palindromów.
źródło
ŻŒḂ€aṚ$Ṁ¬µ#
Siatkówka ,
135102 bajtówWypróbuj online! Zbyt wolny dla
n
10 lub więcej. Wyjaśnienie:Zacznij od wypróbowania 0.
Powtórz
n
czasy.Konwertuj bieżącą wartość próbną na jednostkową i zwiększ ją.
Utwórz wszystkie pary nieujemnych liczb całkowitych, które sumują się do nowej wartości próbnej.
Powtarzaj, dopóki istnieje co najmniej jedna para zawierająca dwie liczby całkowite palindromiczne.
Zwiększ i ponownie rozwiń wartość próby.
Wyodrębnij wartość końcową.
źródło
Haskell,
686763 bajtówZwraca nieskończoną sekwencję.
Zbierz wszystkie
n
gdzie alboa
czyn-a
nie jest palindrom dla wszystkicha <- [0..n]
.Wypróbuj online!
źródło
Perl 5
-MList::Util=any -p
,5955 bajtów-3 bajty dzięki @NahuelFouilleul
Wypróbuj online!
Uwaga:
any
można go zastąpićgrep
i unikać-M
przełączania wiersza poleceń, ale przy obecnych regułach punktacji kosztowałoby to jeszcze jeden bajt.źródło
+
powhile
.R ,
115111 bajtów-4 dzięki Giuseppe
Wypróbuj online!
Większość pracy jest zapakowana w argumenty funkcji, aby usunąć
{}
wywołanie funkcji dla wielu instrukcji i zmniejszyć nawiasy potrzebne do zdefiniowania obiektur
Podstawową strategią jest znalezienie wszystkich palindromów do danej granicy (w tym 0), znalezienie wszystkich par par, a następnie pobranie n-tej liczby nie znajdującej się w tym wyniku.
Granica
n*1000
została wybrana wyłącznie z domysłów wykształconych, więc zachęcam każdego, kto udowodni / potępi ją jako słuszny wybór.r=0:(n*1e3)
prawdopodobnie można go poprawić za pomocą bardziej wydajnego wiązania.Map(paste,Map(rev,strsplit(a,"")),collapse="")
został zerwany z odpowiedzi Marka tutaj i jest dla mnie niesamowicie sprytny.r[!r%in%outer(p,p,'+')][n]
czyta mi to trochę nieefektywnie.źródło
C # (interaktywny kompilator Visual C #) , 124 bajty
Wypróbuj online!
źródło
J , 57/60 bajtów
Wypróbuj online!
Połączona wersja dodaje 3 bajty w sumie 60, aby zapisać jako funkcję, którą stopka może wywołać.
W REPL można tego uniknąć, dzwoniąc bezpośrednio:
Wyjaśnienie
Ogólna struktura jest taka, że od tej techniki z odpowiedzią przez Miles :
Pozwoliło to zaoszczędzić kilka bajtów w porównaniu z moją oryginalną techniką zapętlania, ale ponieważ podstawową funkcją jest moja pierwsza próba napisania J, prawdopodobnie nadal można wiele poprawić.
źródło
1&(_:1&((e.((*&(-:|.)&":"0>:)&i.-))+])+)*
05AB1E ,
1512 bajtów-3 bajty dzięki @Grimy .
0-indeksowane.
Bardzo wolno, więc limit czasu dla większości przypadków testowych.
Wypróbuj online lub sprawdź kilka pierwszych przypadków, usuwając
Iè
.Znacznie szybsza poprzednia 15 bajtowa wersja:
1-indeksowany.
Wyjaśnienie:
źródło
°LDʒÂQ}ãOKIè
(prawdopodobnie jest lepsza górna granica niż 10 ^ x dla prędkości). Chyba technicznie∞DʒÂQ}ãOK
jest to 9, ale upływa limit czasu przed pierwszym wyjściem.Iè
) wygląda tak:[1,21,32,43,54,65,76,87,98,111,131,141,151,...]
ale powinna wyglądać podobnie[*,21,32,43,54,65,76,87,98,201,1031,1041,1051,1052,...]
(pierwsza1
/*
może zostać zignorowana, ponieważ używamy danych 1-indeksowanych).L
na 0 na 0 .. :)Czerwony , 142 bajty
Wypróbuj online!
Zwraca n-ty termin, 1-indeksowany
źródło
Python 3 , 107 bajtów
Wypróbuj online!
Odwrócenie sprawdzania palindromu zapisało 2 bajty :)
Dla porównania: bezpośrednia kontrola dodatnia (109 bajtów):
źródło
APL (NARS), 486 bajtów
Jakie jest słowo „przerwać pętlę”? Wygląda na to, że to „: zostaw”, prawda?
{k≡⌽k←⍕⍵}
w p jest testem na palindrom. Ta powyższa funkcja w pętli przechowuje cały palindrom znaleziony w zbiorze P, jeśli dla jakiegoś elementu w P jest również taki, że iw jest również w P, oznacza to, że i nie jest poprawne i mamy przyrost i. Wyniki:źródło