Herausforderungsbeschreibung
Nehmen wir eine positive ganze Zahl n
, kehren Sie ihre Ziffern um, rev(n)
um den absoluten Wert der Differenz dieser beiden Zahlen zu erhalten: |n - rev(n)|
(oder abs(n - rev(n))
).
Beispiel:
n = 5067
rev(n) = 7605
|n - rev(n)| = |5067 - 7605| = |-2538| = 2538
Nachdem Sie diesen Vorgang ausreichend oft wiederholt haben, werden die meisten Zahlen 0
(wodurch die Schleife beendet wird) ...
5067 -> 2538 -> 5814 -> 1629 -> 7632 -> 5265 -> 360 -> 297 -> 495 -> 99 -> 0
... obwohl einige Zahlen (wie 1584
) in einer Endlosschleife hängen bleiben:
1584 -> 3267 -> 4356 -> 2178 -> 6534 -> 2178 -> 6534 -> 2178 -> 6534 -> ...
^ infinite loop starts here
Sie müssen feststellen, ob eine bestimmte Ganzzahl in einer Endlosschleife hängen bleibt.
Eingabebeschreibung
Eine positive ganze Zahl.
Ausgabebeschreibung
Ein wahrer Wert ( True
, 1
), wenn die Zahl in einer Endlosschleife stecken bleibt, ein falscher Wert ( False
, 0
), ansonsten.
Anmerkungen
- Nachgestellte Nullen sollten weggelassen werden. dh
rev(5020) = 205
. - Denken Sie daran, dass dies Code-Golf ist , also machen Sie Ihren Code so kurz wie möglich!
- Relevante Reihenfolge: A072140
code-golf
number-theory
shooqie
quelle
quelle
Antworten:
Pyth, 5 Bytes
4 Bytes dank FryAmTheEggman
Testsuite.
Der Wahrheitswert ist eine der Zahlen in der Schleife.
Der falsche Wert ist
0
.Erläuterung
quelle
Mathematica,
3937 BytesWendet einfach die Umkehr- / Subtraktionszeiten
n
auf den Eingang ann
und prüft dann, ob das Ergebnis ist0
. Es kann nie mehr als10n
Schritte dauern , um eine Schleife zu erreichen, da die Transformation die Anzahl der Stellen nicht erhöhen kann und es weniger als10n
Zahlen gibt, die nicht mehr Stellen haben alsn
. Sehen Sie sich Dennis 'Beweis an, wie Sie diese Grenze reduzieren könnenn
.quelle
Gelee ,
65 BytesProbieren Sie es online!
Hintergrund
Dies verwendet die obere Schranke von @ MartinEnder mit 10n Iterationen und die folgenden Beobachtungen.
Es gibt 9 × 10 k - 1 positive ganze Zahlen n mit k Ziffern.
Die Differenz einer Zahl und ihrer Umkehrung ist immer ein Vielfaches von 9 , so dass nach der ersten Iteration nur 10 k - 1 von ihnen auftreten können.
Von den Vielfachen mehr als 1/10 wird eine Ziffer in der nächsten Iteration (für den Anfang, alles , was und Ende mit den gleichen Ziffern beginnen, und doppelt so viele grob , wenn die erste Ziffer ist weder verlieren 1 noch ein 9 ), so Es dauert höchstens 9 × 10 k - 2 , um eine Schleife zu betreten oder eine Ziffer zu verlieren.
Unter Anwendung der gleichen Überlegung auf die resultierende Ganzzahl von k - 1 Ziffern usw. dauert es höchstens 9 × 10 k - 2 + 9 × 10 k - 2 +… ≤ 10 k - 1 ≤ n Iterationen erforderlich, um eine Schleife oder einzufügen 0 erreichen.
Wie es funktioniert
quelle
Oracle SQL 11.2, 136 Bytes
Nicht golfen
quelle
APL, 26 Zeichen
Wir verwenden das linke Argument als Akkumulator der Werte, die wir bereits gesehen haben. Wir initialisieren es auf "0", was eine der beiden Beendigungsbedingungen ist. Die Wache
⍵∊⍺:×⍵
lautet: "Ist das richtige Argument etwas, das wir bereits gesehen haben (und das beinhaltet Null)? Wenn ja, geben Sie das Vorzeichen der Zahl zurück, das ist 1 oder 0". Andernfalls rufen wir uns erneut mit dem absoluten Wert der Subtraktion auf, nachdem wir den aktuellen Wert mit dem linken Argument verknüpft haben.Eine Neufassung der Mathematica-Lösung von Martin Ender würde mit 21 Zeichen aufwarten :
Es lautet: "Was ist das Zeichen des Ergebnisses nach dem Anwenden der gewünschten 10n-mal"?
quelle
Python 2, 50 Bytes
Teste es auf Ideone .
Hintergrund
Dies verwendet die obere Schranke von @ MartinEnder mit 10n Iterationen und die folgenden Beobachtungen.
Es gibt 9 × 10 k - 1 positive ganze Zahlen n mit k Ziffern.
Die Differenz einer Zahl und ihrer Umkehrung ist immer ein Vielfaches von 9 , so dass nach der ersten Iteration nur 10 k - 1 von ihnen auftreten können.
Von dem Multiples, mehr als ein Zehntel wird eine Ziffer in der nächsten Iteration (für den Anfang, alles , was und Ende mit den gleichen Ziffern beginnen, und doppelt so viele grob , wenn die erste Ziffer ist weder verlieren 1 noch ein 9 ), so Es dauert höchstens 9 × 10 k - 2 , um eine Schleife zu betreten oder eine Ziffer zu verlieren.
Unter Anwendung der gleichen Überlegung auf die resultierende ganze Zahl von k - 1 Ziffern usw. sind höchstens 9 × 10 k - 2 + 9 × 10 k - 2 +… ≤ 10 k - 1 ≤ n Iterationen erforderlich, um eine Schleife oder einzufügen 0 erreichen .
quelle
CJam,
1513 BytesTeste es hier.
Gleich wie meine Mathematica-Antwort.
quelle
Python,
12912096 BytesWenn eine Ausnahme abgefangen wird (normalerweise ist RuntimeError aufgrund der unendlichen Rekursion die einzige Ausnahme, die mit dieser Funktion ausgelöst werden kann), wird 1 ausgegeben. Andernfalls wird das Ergebnis 0 ausgegeben.
Vielen
Dank an @LeakyNun Vielen Dank an @shooqie
quelle
return a and rev(a)
a=[n-x,x-n][n>x]
def rev(n):a=abs(n-int(str(n)[::-1]));return a and rev(a)
.r
rev
Python,
10198 BytesSchildkröten- und Hasenalgorithmus.
Wahrheit ist jeder Wert in der Schleife, Falsch ist
0
.Ideone es!
quelle
Python 2,
858483 BytesEine weitere Antwort von Python. Es fügt n für jede Iteration zu einer Liste hinzu, und wenn n bereits in der Liste enthalten ist, wird es ausgegeben
False
. Ansonsten funktioniert es bis auf 0.Vielen Dank an @NonlinearFruit für ein Byte.
quelle
print n<1
funktioniert (dan
ist immer nicht negativ) und es speichert ein Bytedef f(n,L=[]):¶ if n<1or n in L:print n<1¶ else:f(abs(n-int(`n`[::-1])),L+[n])
spart 5 Bytes05AB1E,
1186 BytesErklärt
Der Wahrheitswert ist eine Zahl aus der Schleife.
Falscher Wert ist 0.
Probieren Sie es online aus
Verwendet die in Dennis 'Gelee-Antwort erklärt wurde
2 Bytes dank @Adnan gespart
In Version 7.9 von 05AB1E funktionieren die folgenden 5-Byte-Lösungen wie von @Adnan angegeben
quelle
DFÂ-Ä
funktioniert in Version 7.9, aber nicht in der aktuellen Version. In der aktuellen Version müssen Sie es zuerst in ein int konvertieren (soDFÂï-Ä
), aber Sie können Version 7.9 verwenden, um es zu 5 Bytes zu machen: p.Java 7, 161 Bytes
Dies erfordert einen Import, aber ich habe es als Funktion geschrieben. Schreien Sie mich in den Kommentaren an, wenn in diesem Szenario ein vollständiges Programm bevorzugt wird. Gibt 1 aus, wenn es eine Endlosschleife gibt, und 0, wenn der Wert 0 wird.
quelle
1
wahr?Brachylog ,
493223 BytesGibt
true
für Endlosschleifen und zurückfalse
sonstiges zurück.Dies ist eine schamlose Anpassung von Martin Enders Algorithmus.
Vorherige Antwort 32 Bytes
Erläuterung der vorherigen Antwort
quelle
PowerShell v2 +, 94 Byte
Übernimmt die Eingabe
$n
und startet einefor
Endlosschleife mit$a=,0
der Anfangsbedingung (dies verwendet den Komma-Operator, um$a
ein Array eines Elements festzulegen0
). Dies$a
ist unser Array von bereits gesehenen Werten.Bei jeder Schleifeniteration prüfen wir eine
if
. Die Bedingung legt zunächst den nächsten Wert für die$n
Verwendung der Zeichenfolgenumkehr und des[math]::Abs
.NET-Aufrufs fest und überprüft, ob dieser Wert bereits vorhanden ist-in
$a
. Wenn ja, geben wir$n
und ausexit
. Andernfalls fügen wir diesen Wert zum Array hinzu und setzen die Schleife fort.Ausgaben
0
für Eingabewerte, bei denen keine Endlosschleife verwendet wird (was in PowerShell falsch ist), und Ausgaben für den Wert, bei dem die Schleife ansonsten angetroffen wurde (Ganzzahlen ungleich Null sind wahr). Zum Beispiel Ausgänge2178
für die Eingabe1584
.quelle
Haskell, 65 Bytes
Gibt
0
für False und1
für True zurück. Anwendungsbeispiel:([]#) 1584
->1
.Der naheliegende Ansatz: Führen Sie eine Liste mit allen bisher gesehenen Ergebnissen. Berechnen Sie die nächste Zahl bis
0
oder in der Liste.quelle
JavaScript (ES6), 75 Byte
n<0?n=-n:n
undn*=n>0||-1
auch arbeiten. Der Algorithmus ähnelt etwas der PowerShell-Antwort, obwohl dies eine rekursive Formulierung ist.quelle
Ruby, 57 Bytes
Das anfangs leere Array
h
verfolgt zuvor getroffene Werte. Wir iterieren die Zahl, bis wir einen vorherigen Wert erreicht haben, und überprüfen dann den Wert bei der letzten Iteration. Da 0 ein Zyklus von 1 ist, ist es nur dann 0, wenn es keinen größeren Zyklus gibt. Ich benötige zusätzliche 2 Bytes, um dies in einen Booleschen Wert umzuwandeln, da 0 in Ruby wahr ist.quelle
Perl 6
58 53 3330 BytesErläuterung:
(stützt sich auf die vorherige Beobachtung, dass Sie diese Transformation höchstens
n
einmal durchführen müssen)quelle
Perl 5,
3129 BytesEs iteriert
n=|n-rev(n)|
n-mal, sodass die Ausgabe 0 ist, wenn keine Schleife vorhanden ist, andernfalls> 0. Dennis hat bereits bewiesen, dass das genug ist.Neue Version verwendet
eval
undx
Wiederholungsoperator anstelle derfor
Schleife.quelle
-p
Option,-l
ist für eine einzelne Eingabe nicht erforderlichMatlab,
8984 BytesEinfacher Ansatz - Stapelt alle Zahlen und prüft, ob zuvor eine Zahl aufgetaucht ist.
Erläuterung
quelle