¿Por qué es tan interesante el número 6174? Según lo definido por Wikipedia
- Tome cualquier número de cuatro dígitos, usando al menos dos dígitos diferentes. (Se permiten ceros a la izquierda).
- Organice los dígitos en orden ascendente y luego en orden descendente para obtener dos números de cuatro dígitos, agregando ceros a la izquierda si es necesario.
- Resta el número más pequeño del número más grande.
- Regrese al paso 2.
El proceso anterior, conocido como la rutina de Kaprekar, siempre alcanzará 6174 en un máximo de 7 iteraciones. Una vez que se alcanza 6174, el proceso continuará produciéndolo.
Escriba un programa que ejecute la rutina de Kaprekar contra un número de cuatro dígitos dado (vea la definición anterior) imprimiendo cada paso de la rutina.
Reglas:
- Las presentaciones deben ser programas completos.
- La entrada debe leerse de la entrada estándar. La tubería del eco está bien.
- La entrada debe estar en forma numérica.
- Se requiere imprimir ceros a la izquierda. (Ver ejemplos a continuación).
- La última línea debería decir cuántas iteraciones fueron necesarias. Se requiere puntuación.
Ejemplos:
> 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.
Cualquier lenguaje de programación es bienvenido. Puntos extra para los esotéricos + una pequeña recompensa.
Actualización 1 : ya hay una pregunta similar .
Actualización 2 : ejemplo agregado para 6174 como entrada. Gracias a Peter Taylor por el aviso.
code-golf
repeated-transformation
sequence
lunohodov
fuente
fuente
Respuestas:
Perl -
147143134130129126129128126EDITAR: ahora cumple con el caso 6174, a costa de unos pocos caracteres ... ejecutar con
echo -n <number> | perl kaprekar.pl
EDITAR: Finalmente de vuelta a donde estaba antes: D
fuente
Ruby 1.9, 122 caracteres
Ejemplo de invocación:
He contado la
-ln
bandera como 4 caracteres (diferencia entre la invocación normalruby kaprekar.rb
yruby -ln kaprekar.rb
).fuente
ruby -lp kaprekar.rb
. Ingresó un número y presionó <Enter> pero la salida es el número ingresado. Claramente me falta algo ... Por favor, aconseje cómo usar el script.6174
como entrada, que desafortunadamente trae esta solución hasta 128 caracteres.echo 1234 | ruby kaprekar.rb
genera una advertencia y termina con un errorundefined method 'chars' for nil:NilClass (NoMethodError)
. La ejecuciónecho 1234 | ruby -lp kaprekar.rb
solo emite una advertencia y se comporta como se esperaba. La salida no es el esperado, ya que contiene un mensaje de advertenciakaprekar.rb:3: warning: regex literal in condition
Python, 141 caracteres
fuente
;
s.while n-6174
. No hay espacio entreprint
y la cita.Golfscript, 74 caracteres
fuente
Haskell
197192182181 caracteresfuente
r
ys
guarda 2 caracteres. Además, "000" es redundante. "0" es suficiente. Esto nos lleva a 188 caracteres. Me sorprendeinteract
que no ayude aquí. Por lo general lo hace.show x++s
conshows x s
ganancias 2 bytes más. 186 ahora.|k>0
) uno puede deshacerse de élf
. Cambiarle el nombreg
a%
nos lleva a 182 caracteres.> <> -
268308No es un gran contendiente para el golf, pero fue divertido escribirlo. :)
Ejecutar con./fish.py kaprekar.fish -v <number>
EDITAR: ahora toma la entrada de STDIN.
fuente
JavaScript
189182165 caracteresCrédito a DocMax:
Original:
Sin golf:
fuente
n != 6174
an-6174
ya que devolverá cero, que es falso (al menos en C y Python).while(n.length<4)
porwhile(!n[3])
.n+'\n'
se agrega para evitar el condicional y un extra\n
, c) usa una temperatura para evitar una secuencia de unión-división-unión, d) aprovecha el hecho de que solo tiene que agregar un solo '0' para el relleno: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+'.')
que debe ser de 172 caracteres.i
es 0 (+4) pero combiné eso con eli++
. Desafortunadamente, eso da un error por un error, así que cambié el incremento a una disminución y luego usé un pequeño truco bit a bit al final (-1). Luego cambiéi=0,o=e=''
ai=o=e=''
(-2), volví a formatear elfor
bucle para evitar paréntesis adicionales (-1), expandí el(b=...,a=...,b)
bit (-2) y me escabullía=b.join
dentro de lareverse()
llamada (-1). Entonces 169, no está mal!PowerShell, 125
128130131Pasa todos los casos de prueba de la pregunta.
fuente
JavaScript, 260 bytes
fuente
Clojure, 256 caracteres
fuente
Scala 2.9, 194 caracteres
Utiliza el rasgo de la aplicación de Scala 2.9.
Editar: proporciona la salida correcta para la entrada inicial de 6174.
fuente
PHP, 215
259276caracteresSin golf:
fuente
abs
,max
ymin
, ya que el tipo siempre significará que$b
es mayor que$a
. Eso podría ahorrarte 20 personajes. Además, creo que poner el tipo dentro del bucle en la parte superior significará que solo necesita tenerlo en su código una vez, lo que le ahorrará otros 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";}
Puede guardar 12 caracteres cambiando sufor
declaración, llamando a esto como una función y usando enjoin
lugar deimplode
.CoffeeScript,
233225 caracteresPruébalo aquí o con instrucciones aquí .
fuente
0
(como lo sugiere la solicitud) o al hacer clic en el botón cancelar hace que Safari se congele.Scala 276
Scala 283
diff:
fuente
GAWK - 152 caracteres
Esta es una versión awk de GNU. Es posible que no funcione con otras versiones que no sean GNU.
fuente
awk: calling undefined function asort
. La versión Awk es 20070501 ejecutándose en OSX 10.6.7. No olvide el.
después del número de iteraciones.9992 - 2999 = 6993
Ruby, 179 caracteres pero publicando de todos modos
fuente
PERL
fuente
K, 104
Casos de prueba
fuente
Mathematica
314291 caracteresEste es el programa, kaprekar.m: -
Configuración de la ruta antes de ejecutar: -
Ejecutando el programa: -
fuente
PHP , 160 bytes
Pruébalo en línea!
Programa completo, entrada es
STDIN
, ejecutar conphp -nF
.Salida
fuente
Óxido - 375 bytes
Presento esto como un posible "límite superior", desafío a cualquiera a encontrar un lenguaje donde una implementación razonable de esto sea más larga, ya que no hay nada superfluo, pero tampoco nada remotamente obvio que lo reduzca significativamente. Lo que pasa con Rust es que se necesitan unos 120 caracteres para leer de stdin y analizar en un entero. "Ah, pero solo usa la representación de cadena" ... pero estoy 99% seguro de que sería aún más largo
fuente
Perl 6 -n bandera, 105 bytes
Pruébalo en línea!
Finalmente pude usar mi
{}...*
truco, ya que necesitamos tener al menos una iteración para 6174. Sin embargo, no estoy seguro de por qué necesito el ajuste adicional.&{ }
alrededor de la secuencia, lo que apesta.Explicación:
fuente