Dada una cadena de 1
y 2
de cualquier longitud, escriba un código (ya no tiene que ser una función , todo estará bien) que calcula cuántos pasos necesita para reducir la cadena a una forma final, siguiendo este criterio:
Si la cadena es 112112
, esto significa que se tienen que imprimir a 1, dos 1s y 2, así:
1112
. Cuando vuelva a realizar la operación, tendrá que imprimir un 1 y un 2. Obtendrá 12
. Luego imprime uno 2, obteniendo 2
. Esta es una forma final, ya que esta cadena ya no va a cambiar. Su código saldrá 3
, ya que necesita 3 pasos para llegar al formulario final.
Otras reglas
Si la cadena tiene una longitud desigual, el último número permanece intacto.
Cada cadena que ya no puede cambiar (como
222222
) se considera una forma final.No puede usar ninguna fuente externa.
Su código debe funcionar con cada cadena de
1
y2
.El código más corto gana, ya que es el código de golf.
Su código debe imprimir cada paso.
Todo método de entrada estará bien.
Ejemplos
Input >> 122122122121212212
Your code has to print:
211222111111222
11222111222
122111222
2111222
111222
1222
222
Steps:7 (you can omit the "Steps")
---- ---- ---- ----
Input >> 22222221
Your code has to print:
22222211
2222221
2
---- ---- ---- ----
Input >> 2222
Your code has to print:
0
EDITAR: Muy editado. Lamento mucho eso.
1 11 2
. Cada dos números es un par: el primer número del par dice cuántas veces se representa el segundo número en el par. Cualquier dígito impar final sin un par asociado se representa tal cual.Respuestas:
Ruby 1.9+, 73 caracteres
Veo la regla de no regex como tonta y arbitraria, así que aquí hay unasoluciónrencorosabasada en regex:Prueba de funcionamiento:
La última línea es el número de pasos.
Editar: Vereos ha eliminado la restricción de expresiones regulares.
fuente
C -
156154Mi primer código de golf aquí!
Prueba:
Salida:
fuente
GolfScript: 69 caracteres
Cada iteración del bucle interno encuentra los primeros 2 números en la cadena y los usa para formar un bloque del formulario
{num1 num2 '' + *}
. Cuando se evalúa este bloque, obtenemos la lectura deseada de esos números. Repita esto hasta que no haya más personajes. Luego, repita ese ciclo mientras realiza un seguimiento del número de iteraciones e impresiones.Muestra:
fuente
Python - 126
Esto no imprime el valor de entrada. Si es necesario, muévase
print s;
a la derecha antesn="";
Nota: dijiste "función", así que esta es una función. Aquí hay una versión que no es una función (127 caracteres):
(Si puedo hacer que el usuario pegue el número en 118 (pegue los datos entre comillas en la primera línea)):
Ejecución de muestra:
Como beneficio adicional, cada una de estas soluciones funciona para cadenas que contienen números más grandes (hasta 9), pero algunas cadenas producen salidas cada vez más grandes (por ejemplo,
99
)fuente
JavaScript, 107
(requiere soporte de función de flecha, por ejemplo, como en Firefox)
s
es la cadena de entradaCada ronda, usamos la expresión regular
.?.?
para explotars
en una matriz de cadenas de dos caracteres, luegomap
esas cadenas en sus formas reducidas y pegar la matriz nuevamenter
almacena el resultado de la ronda actual para compararlo con el anteriors
k
es el contador redondoAbusamos horriblemente
prompt
(alias ap
) como un mecanismo de entrada y salida, ya que puede presentar un mensaje al usuariofuente
Perl - 50 (+2) bytes
Requiere
-pl
interruptores de línea de comando.Uso de la muestra:
fuente
PHP, 240
Ejemplo: http://skyleo.de/codegolf.php?i=211222111111222
Soy un poco malo en codegolf ._. Tal vez no debería usar solo Java y PHP (y debería pensar más complicado)
fuente
str_split
ya que puede acceder a caracteres individuales en una cadena al igual que una matriz en PHP.R, 158
Ejemplo:
fuente
MATEMÁTICA, 117
fuente
POWERSHELL, 2
Basado en la respuesta de Vereos "Puede usar cualquier método de entrada que acorte su código" a mi pregunta en los comentarios del OP, el siguiente script logra el resultado:
Ejemplo ejecutado para "122122122121212212":
Obviamente, esta no es una entrada seria; su propósito es ilustrar mi punto de que permitir cualquier método de entrada puede trivializar el código real necesario para producir la respuesta. Por lo tanto, el método de entrada debe especificarse más rigurosamente.
fuente
J, 41 caracteres
Como una función (¡ew parens! No muy feliz por ellos):
Vista en despiece ordenado Ejecución de la muestrafuente
Perl, 107 caracteres
El otro código perl claramente supera esto, pero para lo que vale, aquí está. Usé el modificador -l a costa de un personaje adicional:
Una versión más legible de eso:
fuente