Bulgarian Solitaire es un juego para un jugador popularizado por Martin Gardner en su columna matemática en Scientific American .
Tienes N
cartas idénticas, divididas en pilas. Toma una carta de cada pila y forma una nueva pila con las cartas retiradas. Repites este proceso hasta que alcances un estado que ya has visto y, por lo tanto, continuar repitiendo el ciclo.
Por ejemplo, supongamos que tiene 8
tarjetas, divididas en un montón de 5
y un montón de 3
. Escribimos los tamaños de pila en orden descendente: 5 3
. Aquí hay una transcripción del juego:
5 3
4 2 2
3 3 1 1
4 2 2
Primero quitas una carta de cada una de las dos pilas, dejando pilas de 4
y 2
, y una pila de 2
donaciones recién creada 4 2 2
. En el siguiente paso, estos disminuyen para 3 1 1
seguir con un nuevo montón de 3
. Finalmente, el último paso vacía las pilas de tamaño 1
y produce lo 4 2 2
que ya ha aparecido, así que nos detenemos.
Tenga en cuenta que la suma de los tamaños de pila permanece igual.
Su objetivo es imprimir una transcripción del juego desde una configuración inicial dada. Este es el código de golf, por lo que gana menos bytes.
Entrada
Una lista de números positivos en orden descendente que representa los tamaños de pila iniciales. Tomar entrada a través de STDIN o entrada de función. Puede usar cualquier estructura tipo lista que desee.
No obtienes el número total de tarjetas N
como entrada.
Salida
Imprime la secuencia de tamaños de pila que atraviesa el juego de Solitario búlgaro. Tenga en cuenta que se requiere imprimir, no regresar. Cada paso debe ser su propia línea.
Cada línea debe tener una secuencia de números positivos en orden descendente sin 0
's'. Puede tener separadores y tokens de inicio y fin (por ejemplo, [3, 3, 1, 1]
). Los números pueden tener varios dígitos, por lo que deben separarse de alguna manera.
Imprima las divisiones del tamaño de la pila que ve hasta e incluso llegando a repetir. Entonces, la primera línea debe ser la entrada, y la última línea debe ser una repetición de una línea anterior. No debería haber ninguna otra repetición.
Casos de prueba
>> [1]
1
1
>> [2]
2
1 1
2
>> [1, 1, 1, 1, 1, 1, 1]
1 1 1 1 1 1 1
7
6 1
5 2
4 2 1
3 3 1
3 2 2
3 2 1 1
4 2 1
>> [5, 3]
5 3
4 2 2
3 3 1 1
4 2 2
>> [3, 2, 1]
3 2 1
3 2 1
>> [4, 4, 3, 2, 1]
4 4 3 2 1
5 3 3 2 1
5 4 2 2 1
5 4 3 1 1
5 4 3 2
4 4 3 2 1
v$input()$
conQ
. 2. Si almacena la lista en orden decreciente, no necesitaN
nada:W!}QYQ~Y]Q=Q_S+fTmtdQ]lQ;Q
QW!}QY~Y]Q=Q_S+]lQfTmtdQQ
. Es exactamente lo mismo, personaje por personaje, hasta la conmutatividad.CJam, 26 bytes
Pruébalo en línea.
Ejecución de ejemplo
fuente
:p
funcionara, podría ...:p
Ruby, 98
Explicación
Array
.Hash
g
.Array#map
para disminuir cada elemento en 1, agregue la longitud delArray
elemento, ordénelo en orden decreciente y elimine el elemento0
.g
es suficiente verificar si tiene una clave para el nuevo estado del juego.fuente
sort_by
cosa es ciertamente inteligente, ensort.reverse
realidad es un personaje más corto ^^CJam,
35 3433 bytes(Maldición, este corte de energía que no fui el primero en publicar en CJam)
Entrada:
Salida:
Pruébalo en línea aquí
fuente
Python 2 - 103
Similar a la respuesta de Quincunx, pero reemplaza los agregados con la suma y elimina las dos últimas líneas.
Salida de muestra:
fuente
GolfScript,
5046Es casi seguro que se puede jugar más al golf. Pruébalo aquí.
fuente
Haskell, 99
fuente
CJam,
403634 bytesPruébalo aquí. Ingrese la entrada como una matriz de estilo CJam, como
[5 3]
, en el campo STDIN. El formato de salida es similar, por lo que los corchetes y los espacios son delimitadores.Incluso si sigo jugando golf más abajo (lo cual es definitivamente posible), no hay forma de vencer a Pyth con esto. Tal vez es hora de aprender J. Explicación más tarde.
fuente
JavaScript (E6) 113
La peor entrada hasta ahora :(
Prueba en la consola FireFox / FireBug
Salida
fuente
Pitón 2,
148130101Esto simplemente recuerda todas las iteraciones anteriores y verifica si la nueva está en esa lista. Luego, lo imprime.
Ejecución de muestra:
Entrada:
Salida:
Editar: volví a leer las especificaciones de golf, además apliqué mucho golf.
fuente
[4,2,2]
. Sin embargo, hay una solución fácil.Python 3: 89 caracteres
Al igual que las soluciones de Python ya publicadas, pero con llamadas a funciones recursivas en lugar de bucles. La lista
s
almacena las divisiones ya vistas y corta la recursión en caso de repetición.La función
print()
(esto es Python 3) solo debe llamarse de alguna manera en cada bucle. Lo complicado es que alambda
solo permite una sola expresión, por lo que no podemos hacerloprint(l);...
. Además, da salidaNone
, con lo que es difícil trabajar. Termino poniendoprint(l)
a un lado una desigualdad;==
no funciona por alguna razón que no entiendo.Un enfoque alternativo de pegarlo en una lista utiliza igualmente muchos caracteres.
El uso
print(*l)
formatearía las salidas como en4 2 2
lugar de[4,2,2]
.fuente