Einige Zahlen, wie z. B. , sind Palindrome in Basis 10: Wenn Sie die Ziffern in umgekehrter Reihenfolge schreiben, erhalten Sie dieselbe Nummer.
Einige Zahlen sind die Summe von 2 Palindromen; Beispiel: oder .
Für andere Zahlen reichen 2 Palindrome nicht aus; Beispiel: 21 kann nicht als Summe von 2 Palindromen geschrieben werden. Das Beste, was Sie tun können, ist 3: .
Schreiben Sie eine Funktion oder ein Programm, das eine Ganzzahleingabe annimmt n
und die n
th-Zahl ausgibt, die nicht als Summe von 2 Palindromen zerlegt werden kann. Dies entspricht OEIS A035137 .
Einzelne Ziffern (einschließlich 0) sind Palindrome.
Es gelten Standardregeln für Sequenzen:
- Eingabe / Ausgabe ist flexibel
- Sie können 0- oder 1-Indexierung verwenden
- Sie können den
n
dritten oder den ersten Ausdruckn
oder eine unendliche Folge ausgeben
(Als Randnotiz: Alle ganzen Zahlen können als Summe von höchstens 3 Palindromen zerlegt werden .)
Testfälle (1-indiziert):
1 -> 21
2 -> 32
10 -> 1031
16 -> 1061
40 -> 1103
Das ist Code-Golf, also gewinnt die kürzeste Antwort.
n
wird das n-te Mitglied der Sequenz OEIS An? Klingt vielversprechend ...Antworten:
JavaScript (ES6),
93 83 8079 Byte1 Byte dank @tsh gespeichert
Gibt denn ten Term mit einem Index zurück.
Probieren Sie es online!
Wie?
Mitn testen wir, ob 1≤k≤n so dass sowohl k als auch n−k Palindrome sind. Wenn wir ein solches k , dann ist n die Summe von zwei Palindromen.
Der Trick dabei ist,k und n−k gleichzeitig zu verarbeiten, indem eine einzelne Zeichenfolge getestet wird, die aus der Verkettung von k , n−k und k .
Beispiel:
Fürn=2380 :
Kommentiert
NB: Dies ist eine Version ohne
eval()
für die Lesbarkeit.quelle
i=>eval("for(n=k=1;k=(s=[...k+[n-k]+k])+''!=s.reverse()?k-1||i--&&++n:++n;);n")
79 Bytesi=>eval("...")
können Sie mit ES6i=>eval`...`
2 Bytes sparen;n
am Ende stehenden entfernen können .eval()
da er sein Argument nicht in eine Zeichenfolge umwandelt . Das Entfernen;n
würde zu einem Syntaxfehler führen, und das Entfernen von nurn
würde die Funktion zurückgebenundefined
.Jelly ,
16 109 Bytes-1 Byte danke an Erik den Outgolfer . Gibt die erstenn Terme aus.
Probieren Sie es online!
Ich habe versucht, eine andere Idee zu entwickeln als ursprünglich. Lassen Sie uns den Denkprozess überprüfen:
Anfänglich funktionierte der Test wie folgt: Er erzeugte die ganzzahligen Partitionen dieser Zahl, filterte dann diejenigen heraus, die auch Nicht-Palindrome enthielten, und zählte dann, wie viele Listen mit der Länge 2 in Frage kamen. Dies war offensichtlich in Bezug auf die Codelänge nicht zu effizient.
Das Erzeugen der ganzzahligen Partitionen vonN und das anschließende Filtern hatten zwei Hauptnachteile: Länge und Zeiteffizienz. Um dieses Problem zu lösen, dachte ich, ich werde zuerst eine Methode entwickeln, um nur zu generieren die Paare von ganzen Zahlen(x,y) zuN summieren(nicht alle Listen beliebiger Länge), mit der Bedingung, dass beide Zahlen palindrom sein müssen.
Trotzdem war ich mit der "klassischen" Vorgehensweise nicht zufrieden. Ich habe die Ansätze gewechselt: Anstatt Paare zu generieren , konzentrieren wir uns auf einzelne Palindrome . Auf diese Weise kann man einfach alle Palindrome x berechnenx untenN , und wennN−x auch Palindrom ist, dann sind wir fertig.
Code-Erklärung
* Jede andere Ziffer, die nicht Null ist, funktioniert auch.
quelle
Jelly , 11 Bytes
Probieren Sie es online!
Das vollständige Programm funktioniert ungefähr so:
Möglicherweise haben Sie den Verdacht, dass Schritt 5 nicht die Aufgabe erfüllt, die er erfüllen sollte. Wir sollten z wirklich nicht dekrementieren, wenn alle Paare diese Summe ergeben x palindrom sind. Wir können jedoch beweisen, dass dies niemals passieren wird:
We conclude that, if we start with setting x to a value greater than or equal to 10, we can never have all pairs of non-negative integers that sum to x be pairs of palindromes.
quelle
ŻŒḂ€aṚ$Ṁ¬µ#
Retina,
135102 bytesTry it online! Too slow for
n
of 10 or more. Explanation:Start off by trying 0.
Repeat
n
times.Convert the current trial value to unary and increment it.
Create all pairs of non-negative integers that sum to the new trial value.
Repeat while there exists at least one pair containing two palindromic integers.
Increment and expand the trial value again.
Extract the final value.
quelle
Haskell,
686763 bytesReturns an infinite sequence.
Collect all
n
where eithera
orn-a
is not a palindrome for alla <- [0..n]
.Try it online!
quelle
Perl 5
-MList::Util=any -p
,5955 bytes-3 bytes thanks to @NahuelFouilleul
Try it online!
Note:
any
could be replaced bygrep
and avoid the-M
command line switch, but under the current scoring rules, that would cost one more byte.quelle
+
after thewhile
.R,
115111 bytes-4 thanks to Giuseppe
Try it online!
Most of the work is packed into the function arguments to remove the
{}
for a multi-statement function call, and to reduce the brackets needed in defining the objectr
Basic strategy is to find all palindromes up to a given bound (including 0), find all pairwise sums, and then take the n-th number not in that output.
The bound of
n*1000
was chosen purely from an educated guess, so I encourage anyone proving/disproving it as a valid choice.r=0:(n*1e3)
can probably be improved with a more efficient bound.Map(paste,Map(rev,strsplit(a,"")),collapse="")
is ripped from Mark's answer here, and is just incredibly clever to me.r[!r%in%outer(p,p,'+')][n]
reads a little inefficient to me.quelle
C# (Visual C# Interactive Compiler), 124 bytes
Try it online!
quelle
J, 57/60 bytes
Try it online!
The linked version adds 3 bytes for a total of 60 in order to save as a function that the footer can call.
In the REPL, this is avoided by calling directly:
Explanation
The general structure is that of this technique from an answer by Miles:
This saved a few bytes over my original looping technique, but since the core function is my first attempt at writing J, there is likely still a lot that can be improved.
quelle
1&(_:1&((e.((*&(-:|.)&":"0>:)&i.-))+])+)*
05AB1E,
1512 bytes-3 bytes thanks to @Grimy.
0-indexed.
Very slow, so times out for most test cases.
Try it online or verify the first few cases by removing the
Iè
.Much faster previous 15 byter version:
1-indexed.
Try it online or output the firstn values.
Explanation:
quelle
°LDʒÂQ}ãOKIè
(there's probably a better upper bound than 10^x for speed). I guess∞DʒÂQ}ãOK
is technically a 9, but it times out before the first output.Iè
) goes like:[1,21,32,43,54,65,76,87,98,111,131,141,151,...]
but is supposed to go like[*,21,32,43,54,65,76,87,98,201,1031,1041,1051,1052,...]
(the first1
/*
can be ignored since we use 1-indexed input).L
to 0-based.. :)Red, 142 bytes
Try it online!
Returns n-th term, 1-indexed
quelle
Python 3, 107 bytes
Try it online!
Inverting the palindrome checking saved 2 bytes :)
For reference the straight forward positive check (109 bytes):
quelle
APL(NARS), 486 bytes
Was ist das Wort für Break the Loop? Es scheint, es ist ": verlassen", richtig?
{k≡⌽k←⍕⍵}
in p ist der Test für Palindrom. Diese obige Funktion in der Schleife speichert das gesamte in der Menge P gefundene Palindrom. Wenn für ein Element w von P iw auch in P ist, bedeutet dies, dass das i nicht richtig ist und wir das Inkrement i haben. Ergebnisse:quelle