Pourquoi le numéro 6174 est-il si intéressant? Tel que défini par Wikipedia
- Prenez n'importe quel nombre à quatre chiffres, en utilisant au moins deux chiffres différents. (Les zéros non significatifs sont autorisés.)
- Organisez les chiffres en ordre croissant puis décroissant pour obtenir deux nombres à quatre chiffres, en ajoutant des zéros de tête si nécessaire.
- Soustrayez le plus petit nombre du plus grand nombre.
- Revenez à l'étape 2.
Le processus ci-dessus, connu sous le nom de routine de Kaprekar, atteindra toujours 6174 en au plus 7 itérations. Une fois que 6174 est atteint, le processus continuera de le produire.
Écrivez un programme qui exécute la routine du Kaprekar contre un nombre à quatre chiffres donné (voir la définition ci-dessus) imprimant chaque étape de la routine.
Règles:
- Les soumissions doivent être des programmes complets.
- L'entrée doit être lue à partir de l'entrée standard. La tuyauterie de l' écho est OK.
- L'entrée doit être sous forme numérique.
- L'impression des zéros non significatifs est requise. (Voir les exemples ci-dessous.)
- La dernière ligne doit indiquer le nombre d'itérations nécessaires. La ponctuation est requise.
Exemples:
> 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.
Tout langage de programmation est le bienvenu. Des points supplémentaires pour les ésotériques + une petite prime.
Mise à jour 1 : il y a déjà une question similaire .
Mise à jour 2 : ajout d'un exemple pour 6174 en entrée. Merci à Peter Taylor pour l'avis.
code-golf
repeated-transformation
sequence
lunohodov
la source
la source
Réponses:
Perl -
147143134 134130129126129128126 126EDIT: est maintenant conforme au cas 6174, au prix de quelques caractères ... exécuté avec
echo -n <number> | perl kaprekar.pl
EDIT: Enfin de retour à l'endroit où j'étais avant: D
la source
Ruby 1.9, 122 caractères
Exemple d'appel:
J'ai compté le
-ln
drapeau comme 4 caractères (différence entre l'invocation normaleruby kaprekar.rb
etruby -ln kaprekar.rb
).la source
ruby -lp kaprekar.rb
. Entré un nombre et appuyé sur <Entrée> mais la sortie est le numéro entré lui-même. De toute évidence, il me manque quelque chose ... Veuillez indiquer comment utiliser le script.6174
entrée, ce qui porte malheureusement cette solution à 128 caractères.echo 1234 | ruby kaprekar.rb
génère un avertissement et se termine par une erreurundefined method 'chars' for nil:NilClass (NoMethodError)
. L'exécution desecho 1234 | ruby -lp kaprekar.rb
problèmes n'est qu'un avertissement et se comporte comme prévu. La sortie n'est pas celle attendue, car elle contient un message d'avertissementkaprekar.rb:3: warning: regex literal in condition
Python, 141 caractères
la source
;
s.while n-6174
. Pas d'espace entreprint
et le devis.Golfscript, 74 caractères
la source
Haskell,
197192182181 caractèresla source
r
ets
enregistre 2 caractères. "000" est également redondant. "0" suffit. Cela nous amène à 188 caractères. Je suis surprisinteract
n'aide pas ici. C'est généralement le cas.show x++s
parshows x s
gagne 2 octets supplémentaires. 186 maintenant.|k>0
), on peut s'en débarrasserf
. Un nouveau changementg
de nom%
nous amène à 182 caractères.> <> -
268308Pas beaucoup de compétiteur pour le golf, mais c'était amusant d'écrire. :)
Exécuter avec./fish.py kaprekar.fish -v <number>
EDIT: prend maintenant l'entrée de STDIN.
la source
JavaScript,
189182165 caractèresCrédit à DocMax:
Original:
Non golfé:
la source
n != 6174
àn-6174
puisqu'il retournera zéro, ce qui est faux (au moins en C et Python).while(n.length<4)
parwhile(!n[3])
.n+'\n'
est ajouté pour éviter le conditionnel et un extra\n
, c) utilise un temp pour éviter une séquence de jointure-séparation-jointure, d) tire parti du fait que nous n'a jamais besoin d'ajouter un seul «0» pour le remplissage:for(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+'.')
qui devrait être 172 caractères.i
est 0 (+4), mais j'ai combiné cela avec lei++
. Malheureusement, cela donne une erreur de désactivation d'une unité, j'ai donc changé l'incrément en décrément, puis j'ai utilisé une petite ruse au niveau du bit à la fin (-1). Ensuite, je suis passéi=0,o=e=''
ài=o=e=''
(-2), j'ai reformaté lafor
boucle pour éviter les parenthèses supplémentaires (-1), le(b=...,a=...,b)
bit développé (-2) et je me suis glisséa=b.join
à l'intérieur de l'reverse()
appel (-1). Alors 169, c'est pas mal!PowerShell, 125
128130131Réussit tous les cas de test de la question.
la source
JavaScript, 260 octets
la source
Clojure, 256 caractères
la source
Scala 2.9, 194 caractères
Utilise le trait App de Scala 2.9.
Edit: donne une sortie correcte pour l'entrée initiale de 6174.
la source
PHP, 215
259276personnagesNon golfé:
la source
abs
,max
et lesmin
fonctions, puisque le genre toujours signifie$b
est supérieure$a
. Cela pourrait vous faire économiser 20 caractères. De plus, je pense que mettre le tri à l'intérieur de la boucle en haut signifie que vous n'aurez besoin de l'avoir dans votre code qu'une seule fois, ce qui vous fera économiser encore 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";}
Vous pouvez enregistrer 12 caractères en modifiant votrefor
instruction, en l'appelant en tant que fonction et en utilisantjoin
au lieu deimplode
.CoffeeScript,
233225 caractèresEssayez-le ici ou avec des instructions ici .
la source
0
(comme suggéré par l'invite) ou le clic sur le bouton Annuler provoque le gel de Safari.Scala 276
Scala 283
diff:
la source
GAWK - 152 caractères
Il s'agit d'une version GNU awk. Il peut ne pas fonctionner avec d'autres versions non gnu.
la source
awk: calling undefined function asort
. La version Awk est 20070501 exécutée sur OSX 10.6.7. N'oubliez pas.
après le nombre d'itérations.9992 - 2999 = 6993
Ruby, 179 caractères mais affiche quand même
la source
PERL
la source
K, 104
Cas de test
la source
Mathematica,
314291 caractèresVoici le programme, kaprekar.m: -
Définition du chemin d'accès avant l'exécution: -
Exécution du programme: -
la source
PHP , 160 octets
Essayez-le en ligne!
Programme complet, l'entrée est
STDIN
exécutée avecphp -nF
.Sortie
la source
Rouille - 375 octets
Je présente cela comme une possible «borne supérieure», je mets au défi quiconque de trouver un langage où une mise en œuvre raisonnable de celui-ci est plus longue - car il n'y a rien de superflu, mais aussi rien de même à distance évident qui le réduirait considérablement. La chose à propos de Rust est qu'il faut environ 120 caractères pour lire à partir de stdin et analyser en un entier. "Oh mais alors utilisez simplement la représentation des chaînes" ... mais je suis sûr à 99% que ce serait encore plus long
la source
Indicateur Perl 6 -n, 105 octets
Essayez-le en ligne!
J'ai finalement pu utiliser mon
{}...*
astuce, car nous devons avoir au moins une itération pour 6174. Je ne sais pas pourquoi j'ai besoin de l'encapsulation supplémentaire.&{ }
autour de la séquence, ce qui est un peu nul.Explication:
la source