Palindrome Reversal-Addition
Der Vorgang des Hinzufügens der Umkehrung ist der Vorgang, bei dem eine Zahl zur Umkehrung hinzugefügt wird, bis die erzeugte Zahl ein Palindrom ist. Wenn wir zum Beispiel mit 68 beginnen, wäre der Prozess:
68 + 86 => 154 + 451 => 605 + 506 => 1111
Wie Sie sehen, dauerte dies 3 Additionen, um zu einer palindromischen Zahl zu gelangen. Wenn wir anfangen 89
würden, bräuchten wir 24 Stufen (die Sie hier sehen können ).
Der Weltrekord für die meisten Schritte, die unternommen wurden, bevor ein Palindrom erreicht wurde, liegt bei 261, was für die Zahl 1186060307891929990
gilt und eine Zahl ergibt, die größer als 10 118 ist . Es gab jedoch einige Zahlen, für die wir kein Palindrom erhalten konnten. Diese werden Lychrel-Nummern genannt .
Da wir in Basis 10 arbeiten, können wir sie eigentlich nur als Kandidaten bezeichnen, da es keinen Beweis dafür gibt, dass diese Zahlen niemals ein Palindrom erreichen. Der kleinste Lychrel-Kandidat zur Basis 10 ist beispielsweise 196 und hat weit über eine Milliarde Iterationen durchlaufen. Wenn das Palindrom existiert, ist es viel größer als 10 10 8.77 . Wenn zum Vergleich so viele Einsen in Atome eingeschrieben wären, bräuchten wir 2.26772 × 10 588843575 Universen mit Atomen, um sie auszuschreiben, vorausgesetzt, sie existieren.
Deine Aufgabe
Erstellen Sie ein Programm oder eine Funktion, die eine Ganzzahleingabe akzeptiert und die Anzahl der Schritte ausgibt oder ausgibt, die zum Erreichen eines Palindroms erforderlich sind. Sie müssen sich nicht mit Lychrel-Kandidaten auseinandersetzen (dh Ihr Programm darf bei einem Lychrel-Kandidaten entweder einen Fehler auslösen oder für immer ausgeführt werden).
Testfälle:
f(0) => 0
f(11) => 0
f(89) => 24
f(286) => 23
f(196196871) => 45
f(1005499526) => 109
f(1186060307891929990) => 261
Regeln
Boni
- Wenn Sie jeden formatierten Additionsschritt ausdrucken
n + rev(n) = m
, können Sie Ihre Punktzahl mit 0,75 multiplizieren . Die Summen sollten vor der Anzahl der Schritte ausgedruckt werden. - Wenn Ihr Code erkennt, ob eine Zahl ein Lychrel-Kandidat ist, können Sie Ihre Punktzahl mit 0,85 multiplizieren . In diesem Fall ist es ausreichend anzunehmen, dass alles, was mehr als 261 Iterationen benötigt, ein Lychrel-Kandidat ist. Geben Sie entweder nichts zurück oder alles, was keine Zahl ist, die für eine korrekte Antwort gehalten werden kann (usw.: eine beliebige Zeichenfolge oder eine Zahl, die nicht im Bereich von 0 bis 261 liegt). Jeder Fehler zählt nicht als gültige Ausgabe (z. B. maximale Rekursionstiefe überschritten) und kann nicht für die Erkennung verwendet werden.
- Wenn Sie beide Boni erfüllen, multiplizieren Sie mit 0,6 .
Das ist Code-Golf , also gewinnt die geringste Anzahl von Bytes.
Dieses Code-Snippet zeigt eine Beispiellösung in Python 3 mit beiden Boni.
def do(n,c=0,s=''):
m = str(n)
o = m[::-1]
if c > 261:
return "Lychrel candidate"
if m == o:
print(s)
return c
else:
d = int(m)+int(o)
s+="%s + %s = %s"%(m,o,str(d))
return do(d,c+1,s)
quelle
*0.6
Bonus über den anderen? Oder ist es nur das?10 + 01 = 11
oder10 + 1 = 11
oder ist es an uns?262
?Antworten:
Pyth, 12 Bytes
Probieren Sie es online aus: Vorführ- oder Testgeschirr
Dies verwendet eine ziemlich neue Funktion (nur 17 Stunden alt).
Erläuterung
bearbeiten:
Der Code wurde ein wenig geändert. Die alte Version war
Gleiche Byteanzahl, aber die neue ist viel cooler.
quelle
Python, 51
Bei Python 2 können Backticks nicht ersetzt werden,
str()
da sieL
anlong
Literale gebunden sind .Hier ist eine alternative Version mit der Punktzahl 64 * 0,85 = 54,4 :
Und eine alternative Version für Python 3 mit 88 * 0,6 = 52,8 :
quelle
CJam,
232220,4 BytesDer Code ist 24 Byte lang und gibt -1 für Lychrel-Kandidaten aus.
Probieren Sie es online aus.
Wie es funktioniert
Wenn
{}#
erfolgreich, ist der Index auch die Anzahl der Schritte. Wenn das Array hingegen kein Palindrom enthält,{}#
wird -1 gedrückt .quelle
Java, 200 × 0,6 = 120
Dies ist eine einfache Schleife, die genau das tut, was auf der Schachtel steht, aber mit ein bisschen Golf. Kehrt
1000
für Lychrel-Kandidaten zurück, um den Erkennungsbonus zu erhalten. Es stellte sich heraus, dass ich nicht zu viele Zeichen drucken konnte (zumindest für Java) und mir diesen Bonus auch schnappte. Das Beste, was ich ohne Bonuscode machen konnte, war 156, es hat sich also gelohnt.Mit einigen Zeilenumbrüchen:
Alte Antwort: 171 * 0,85 = 145,35 Bytes
quelle
s++<999
Rubin, (80 + 2) * 0,6 = ~ 49,2
Mit Fahnen
-nl
laufenDie Ausgabe sieht aus wie
Bei Angabe von 196 werden die ersten 261 Additionsschritte und dann gedruckt
nil
.Hier ist nichts zu schwierig. Wir prüfen, ob
$_
(was für die Eingabe initialisiert wird) die Umkehrung enthält, was nur möglich ist, wenn sie gleich sind, da sie die gleiche Größe haben. Wenn dies der Fall ist, drucken wir die Schrittnummer und beenden den Vorgang. Andernfalls zeigen wir den Additionsschritt an und führen ihn aus, wobei der neue Wert in gespeichert wird$_
(ich kann leider nicht nureval
die angezeigte Zeichenfolge, da sie eine umgekehrte Zahl mit einer nachgestellten 0 interpretiert als oktales Literal).puts
Gibt einen falschen Wert zurück, sodass die Schleife fortgesetzt wird.quelle
" + #{b} = "
Speichert ein Byte.-l
löschen, wenn wir die Nummer in eine Datei ohne abschließende Zeilenumbruch setzen und es in Pipe?Pyth - 19 Bytes
Verwendet while-Schleife und einen Zähler. Es gibt wahrscheinlich einen kleineren Algorithmus als diesen, aber dieser ist ziemlich kurz.
Probieren Sie es hier online aus .
quelle
K, 25 Bytes
Nicht sehr elegant. Die Gesamtform (
{monad 1}{monad 2}\x
) ist Ks Äquivalent zu einer allgemeinen "while" -Schleife, bei der die erste Monade die Haltebedingung und die zweite eine iterativ auf das Argument angewendete Funktion istx
. Die erste Monade ({~x~|x}
) ist die Negation der klassischen Phrase "ist xa Palindrom". Die zweite Monade verkettet einen String, der x plus die Umkehrung von x darstellt, wertet ihn aus und wandelt das Ergebnis dann zurück in einen String mit$
.Ein Probelauf mit Zwischenergebnissen:
Eine formatierte Ausgabe, wie für den Bonus angefordert, wäre sehr umständlich und würde eine erhebliche Menge an Code hinzufügen.
quelle
CJam, 23 Bytes
Noch ein paar Tage bis CJam, also bin ich ziemlich froh, zumindest in der gleichen Reichweite zu sein wie einige der Profis. :) Ich habe Martins Stringvergleichstrick verwendet, den er auch in den CJam-Hinweisen gepostet hat. Ich habe mir auch Dennis 'Lösung angesehen, um herauszufinden, wie man eine Saite umkehrt.
Erläuterung:
Testen Sie es online
quelle
Julia,
129120 Bytes * 0,6 = 72Dadurch wird eine unbenannte Funktion erstellt, die eine Ganzzahl als Eingabe verwendet und eine Ganzzahl zurückgibt, während jeder Schritt gedruckt wird. Lychrel-Kandidaten haben einen Rückgabewert von 262. Um dies zu nennen, geben Sie ihm einen Namen, z
f=i->...
.Beachten Sie, dass diese Lösung ohne Code, der sich nur auf die Boni bezieht, 84 Byte beträgt.
Ungolfed + Erklärung:
Beispiele:
2 Bytes gespart dank Geobits!
quelle
CJam, 24 Bytes
Teste es hier.
Erläuterung
In diesem Tipp finden Sie weitere Informationen dazu, warum
#
die String-Ungleichheit überprüft werden kann .quelle
#
.Haskell,
6653 BytesAnwendungsbeispiel:
quelle
r=reverse x
? Das würde Ihre zweite Zeile in ändernf x|x==r=0|1<2=1+f(show$read x+read(r))
und 2 Bytes sparen.x
wäre es nicht im Umfang. Allerdingsf x|x==r=0 .... read(r)) where r=reverse x
funktionieren würde, aber es ist mehr.Clojure, 94 Bytes
Dies ist mein erster Versuch, Golf zu codieren. Bitte sagen Sie mir, wenn ich etwas falsch mache.
Mit einigen Leerzeichen:
Einfache Rekursion der inneren Funktion. Es werden zwei Argumente benötigt, die Ganzzahl
%1
und ein Index%2
. Ob%1
es sich um ein Palindrom handelt, wird der Index zurückgegeben. Ansonsten ruft sich die Funktion mit der Summe und dem inkrementierten Index auf. Die äußere Funktion initialisiert den Index mit Null.Eine Probe:
quelle
Boost.Build, 304 Bytes
Nicht wirklich eine Sprache. Trotzdem cool.
Ganz einfach, abgesehen von dem ausgeklügelten, auf Regex basierenden Hack, mit dem ich die Saite umgedreht habe.
quelle
Rubin, 44
Benötigt Ruby 1.9 oder höher für die
->
Lambda-Syntax.quelle