Warum ist die Nummer 6174 so interessant? Wie von Wikipedia definiert
- Nehmen Sie eine beliebige vierstellige Nummer mit mindestens zwei verschiedenen Ziffern. (Führende Nullen sind erlaubt.)
- Ordnen Sie die Ziffern in aufsteigender und absteigender Reihenfolge an, um zwei vierstellige Zahlen zu erhalten, und fügen Sie gegebenenfalls führende Nullen hinzu.
- Subtrahieren Sie die kleinere Zahl von der größeren Zahl.
- Fahren Sie mit Schritt 2 fort.
Der obige Prozess, bekannt als Kaprekars Routine, erreicht immer 6174 in höchstens 7 Iterationen. Sobald 6174 erreicht ist, wird der Prozess fortgesetzt, um es zu ergeben.
Schreiben Sie ein Programm, das die Kaprekar-Routine anhand einer bestimmten vierstelligen Zahl (siehe Definition oben) ausführt und jeden Schritt der Routine druckt.
Regeln:
- Einsendungen müssen vollständige Programme sein.
- Die Eingabe muss von der Standardeingabe gelesen werden. Das Leiten von Echo ist in Ordnung.
- Die Eingabe sollte in numerischer Form erfolgen.
- Es ist erforderlich, führende Nullen auszudrucken. (Siehe Beispiele unten.)
- In der letzten Zeile sollte angegeben werden, wie viele Iterationen benötigt wurden. Interpunktion ist erforderlich.
Beispiele:
> 2607
7620 - 0267 = 7353
7533 - 3357 = 4176
7641 - 1467 = 6174
Iterations: 3.
> 1211
2111 - 1112 = 0999
9990 - 0999 = 8991
9981 - 1899 = 8082
8820 - 0288 = 8532
8532 - 2358 = 6174
Iterations: 5.
> 6174
7641 - 1467 = 6174
Iterations: 1.
Jede Programmiersprache ist willkommen. Extra Punkte für Esoteriker + ein kleines Kopfgeld.
Update 1 : Es gibt bereits eine ähnliche Frage .
Update 2 : Beispiel für 6174 als Eingabe hinzugefügt. Vielen Dank an Peter Taylor für den Hinweis.
code-golf
repeated-transformation
sequence
Lunohodov
quelle
quelle
Antworten:
Perl -
147143134130129126129128126BEARBEITEN: Entspricht jetzt dem 6174-Fall, kostet ein paar Zeichen ... läuft mit
echo -n <number> | perl kaprekar.pl
EDIT: Endlich wieder da, wo ich vorher war: D
quelle
Ruby 1.9, 122 Zeichen
Beispielaufruf:
Ich habe das
-ln
Flag als 4 Zeichen gezählt (Unterschied zwischen dem normalen Aufrufruby kaprekar.rb
undruby -ln kaprekar.rb
).quelle
ruby -lp kaprekar.rb
. Geben Sie eine Nummer ein und drücken Sie die <Eingabetaste>, aber die Ausgabe ist die eingegebene Nummer. Mir fehlt ganz klar etwas ... Bitte geben Sie an, wie Sie das Skript verwenden sollen.6174
als Eingabe generiert , was diese Lösung leider auf 128 Zeichen bringt.echo 1234 | ruby kaprekar.rb
löst eine Warnung aus und endet mit einem Fehlerundefined method 'chars' for nil:NilClass (NoMethodError)
. Das Ausführenecho 1234 | ruby -lp kaprekar.rb
gibt nur eine Warnung aus und verhält sich wie erwartet. Die Ausgabe ist nicht wie erwartet, da sie eine Warnmeldung enthältkaprekar.rb:3: warning: regex literal in condition
Python, 141 Zeichen
quelle
;
s auf eine Zeile .while n-6174
. Kein Leerzeichen zwischenprint
und dem Zitat.Golfscript, 74 Zeichen
quelle
Haskell,
197192182181 Zeichenquelle
r
unds
speichert 2 Zeichen. Auch "000" ist überflüssig. "0" ist genug. Dies bringt uns zu 188 Zeichen. Ich bin überraschtinteract
, hilft hier nicht. Das tut es normalerweise.show x++s
mitshows x s
gewinnt 2 weitere Bytes. 186 jetzt.|k>0
) kann man das loswerdenf
. Weitere Umbenennungg
zu%
bringt uns zu 182 Zeichen.> <> -
268308Es ist kein großer Anwärter auf Golf, aber es hat Spaß gemacht zu schreiben. :)
Run with./fish.py kaprekar.fish -v <number>
EDIT: Nimmt jetzt Eingaben von STDIN entgegen.
quelle
JavaScript,
189182165 ZeichenGutschrift für DocMax:
Original:
Ungolfed:
quelle
n != 6174
,n-6174
da es Null zurückgibt, was falsch ist (zumindest in C und Python).while(n.length<4)
mitwhile(!n[3])
.n+'\n'
hinzugefügt wird, um die Bedingung und ein Extra zu vermeiden\n
, c) verwendet ein Temp, um eine Join-Split-Join-Sequenz zu vermeiden, d) nutzt die Tatsache, dass wir Es muss immer nur eine einzelne '0' zum Auffüllen hinzugefügt werden: Dasfor(n=prompt(i=0,o=e='');n-6174;i++,o+=(n=(b=n.split(e).sort(),a=b.join(e),b).reverse().join(e))+' - '+a+' = '+(n=('0'+(n-a)).slice(-4))+'\n');alert(o+"Iterations: "+i+'.')
sollten 172 Zeichen sein.i
0 (+4) ist, aber diese mit der kombinierti++
. Leider gibt das einen Fehler von eins aus, also habe ich das Inkrement auf ein Dekrement umgestellt und dann am Ende ein bisschen Trick benutzt (-1). Dann habe ichi=0,o=e=''
zui=o=e=''
(-2) gewechselt , diefor
Schleife neu formatiert , um zusätzliche Klammern (-1) zu vermeiden, das(b=...,a=...,b)
Bit (-2) erweitert und micha=b.join
in denreverse()
Aufruf eingeschlichen (-1). Also 169, nicht schlecht!PowerShell, 125
128130131Besteht alle Testfälle aus der Frage.
quelle
JavaScript, 260 Bytes
quelle
Clojure, 256 Zeichen
quelle
Scala 2.9, 194 Zeichen
Nutzt das App-Merkmal von Scala 2.9.
Bearbeiten: Gibt die korrekte Ausgabe für die anfängliche Eingabe von 6174 aus.
quelle
PHP, 215
259276ZeichenUngolfed:
quelle
abs
,max
undmin
Funktionen, da die Art immer bedeuten , dass$b
größer ist als$a
. Das könnte Ihnen 20 Charaktere ersparen. Außerdem denke ich, dass das Einfügen der Sortierung in die Schleife oben bedeutet, dass Sie sie nur einmal in Ihrem Code haben müssen, was Ihnen weitere 9<?function k($c){echo"> $c\n";$n=str_split(str_pad($c,4,0,0));for(;$k-6174;$z++){sort($n);$a=join($n);$b=strrev($a);$k=str_pad($b-$a,4,0,0);echo"$b - $a = $k\n";$n=str_split($k);}echo"Iterations: $z\n";}
Sie können 12 Zeichen speichern, indem Sie Ihrefor
Anweisung ändern , diese als Funktion aufrufen undjoin
anstelle von verwendenimplode
.CoffeeScript,
233225 ZeichenProbieren Sie es hier oder mit Anweisungen hier .
quelle
0
(wie von der Eingabeaufforderung vorgeschlagen) verwenden oder auf die Schaltfläche Abbrechen klicken, friert Safari ein.Scala 276
Scala 283
diff:
quelle
GAWK - 152 Zeichen
Dies ist eine GNU awk-Version. Es funktioniert möglicherweise nicht mit anderen Nicht-Gnu-Versionen.
quelle
awk: calling undefined function asort
. Die Awk-Version ist 20070501 und läuft unter OSX 10.6.7. Vergessen Sie nicht, die.
nach der Anzahl der Iterationen.9992 - 2999 = 6993
Ruby, 179 Zeichen, aber trotzdem Posten
quelle
PERL
quelle
K 104
Testfälle
quelle
Mathematica,
314291 ZeichenDies ist das Programm, kaprekar.m: -
Festlegen des Pfades vor dem Laufen: -
Ausführen des Programms: -
quelle
PHP , 160 Bytes
Probieren Sie es online!
Komplettes Programm, Eingabe wird
STDIN
mit ausgeführtphp -nF
.Ausgabe
quelle
Rust - 375 Bytes
Ich stelle dies als eine mögliche "Obergrenze" vor und fordere jeden dazu auf, eine Sprache zu finden, in der eine sinnvolle Implementierung länger ist - da nichts überflüssig ist, aber auch nichts, was auch nur annähernd offensichtlich ist, dass es erheblich schrumpfen würde. Die Sache mit Rust ist, dass es ungefähr 120 Zeichen braucht, um von stdin zu lesen und in eine Ganzzahl zu analysieren. "Oh, aber dann benutze einfach die String-Darstellung" ... aber ich bin zu 99% zuversichtlich, dass das noch länger dauern würde
quelle
Perl 6- n-Flag, 105 Bytes
Probieren Sie es online!
Endlich muss ich meinen
{}...*
Trick anwenden, da wir für 6174 mindestens eine Iteration benötigen. Ich bin mir nicht sicher, warum ich.&{ }
die Sequenz zusätzlich umschließen muss , was irgendwie scheiße ist.Erläuterung:
quelle