Vives dentro de una terminal que tiene 80 caracteres de ancho. Estás aburrido, así que decides jugar al dominó. No, no del tipo aburrido que se parece a Scrabble, el tipo divertido donde pasas una hora configurándolos para verlos caer en un segundo.
En las terminales, el dominó se ve así:
| upright domino
\ left-tilted domino
/ right-tilted domino
__ fallen domino
Como todos sabemos, si un dominó inclinado toca uno vertical, el segundo dominó también se inclina. La única excepción a esto es si dos fichas de dominó inclinadas lo tocan:
|\ --> \\ /| --> // /|\ --> /|\
Ajuste la constante gravitacional de su terminal para que esta transición tome 100 ms.
Si un dominó inclinado es apoyado por otro dominó o las paredes de la terminal, su viaje termina.
Ninguna de las fichas de dominó inclinadas en
\||||____||||/__ /|\ /\ /|\ __\||||____||||/
(80 caracteres) se moverán, ya que las dos fichas de dominó inclinadas más externas están soportadas por las paredes de la terminal y todas las demás están respaldadas por otras fichas de dominó.
Sin embargo, si el espacio en la dirección de inclinación está vacío, el dominó se cae:
| \\ --> |__\ // | --> /__|
Terminal. Constante gravitacional. Tú entiendes…
Finalmente, hay un ligero viento de la izquierda, por lo que las fichas de dominó inclinadas a la derecha caen más rápido que las inclinadas a la izquierda:
|/ \| --> |__\|
Tarea
Escriba un programa / función que muestre una animación de jugar dominó en una terminal.
Su código debe hacer lo siguiente:
Lea una cadena de entrada, que representa el estado inicial de las fichas de dominó.
Esta cadena no contendrá más de 80 caracteres y consistirá únicamente en el dominó descrito anteriormente y los espacios vacíos.
Imprima el estado y espere 100 ms.
Transforme el estado como se explicó anteriormente.
Si el estado cambió, regrese a 2.
Reglas adicionales
La longitud de la cadena de entrada no afecta el ancho del terminal; incluso si la cadena tiene menos de 80 caracteres, las paredes de la terminal aún están separadas por 80 caracteres.
Cada vez que se ejecuta el paso 2, el estado debe imprimirse en la misma ubicación, sobrescribiendo el estado anterior.
Dado que algunos idiomas no pueden esperar exactamente 100 ms, no dude en esperar cualquier cantidad entre 50 y 1000 ms.
Aplican reglas estándar de código de golf .
Ejemplos
Para el estado inicial
||\/||
imprima lo siguiente (uno sobre el otro):
||\/|| |\\//| \\\/// __\\//__
Para el estado inicial
/||||\
imprime lo siguiente
/||||\ //||\\ ///\\\
Para el estado inicial
/|||\
imprime lo siguiente
/|||\ //|\\
Para el estado inicial
|/ \|/ \|/ \|/ \|
imprima lo siguiente:
|__\|__\|__\|__\|
Para el estado inicial (80 caracteres)
\||||____||||/__ /|\ /\ /|\ __\||||____||||/
imprime lo siguiente
\||||____||||/__ /|\ /\ /|\ __\||||____||||/
/
o/|
y verá que el mosaico no cae del todo como debería.\033
con un byte ESC literal, ahorrando 3 bytes.Perl 5,
154146Tuve que usar un carácter temporal para mantener el estado entre 2 expresiones regulares.
Para lidiar con el riesgo de que algo como / | El | El | \ terminaría como / / / \ \ en lugar de / / | \ \.
Prueba
fuente
s, \\|/ ,__,g
lugar des/ \\|\/ /__/g
.ES6 ,
220218195 bytesMinified
Más legible
fuente
() = > {
y}()
simplemente se puede eliminar de su código. 2. No creo que los cuadros de alerta sean un formato de salida aceptable para una animación. Puede incrustar su JS en HTML o hacer el cambio requerido para que funcione desde la línea de comandos. 3. En cualquier caso, su código debe esperar aprox. 100 ms entre la impresión de un estado y el siguiente.console.log("^[c"+d)
lugar, donde^[
está el carácter ESC (un byte)..replace
a[R='replace']
, luego cada uno a[R]
, esto se reducirá bastante. También puede guardar algunos bytes si lo utilizasetTimeout(f,100,d)
en lugar de la configuración actual.C #, 335 bytes
No es una gran elección de idioma.
Abusé de la demora permitida entre 50 y 1000 para seleccionar un número de dos dígitos.
Nuevas líneas y sangría agregadas para mayor claridad:
fuente
PHP, 175 bytes
No minificado:
Básicamente regex golf. Primero aplana cualquier dominó que caiga que tenga espacio (y debido al orden de combinación de izquierda a derecha, el "viento" sopla). Luego viene la parte fea (¡maldición, cortes!)
/|\
, luego saltearlo.(/)|
y reemplazar con//
|(\)
y reemplazar con\\
Esto hace caer las fichas de dominó. Finalmente, solo espere 100 ms para el siguiente paso.
Usar
()
como delimitadores en la expresión regular significa/
que no es necesario escapar, ¡lo que ayuda mínimamente!fuente
POSIX shell + sed, 144
Esto es en dos partes. El trabajo principal de derribar las fichas de dominó es el
sed
reemplazo estándar de patrones, acumulando líneas en el espacio de espera. Nos dirigimos temporalmente/|\
en/:\
protegerlo, recuperando al final.Como
sed
no tengo ninguna forma de insertar retrasos (busqué terminfo / termcap, pero no pude encontrar ninguna forma estándar), envuelvo cada líneaprintf "...\r"; sleep .1
para imprimir una línea cada 100 ms. Realmente hago esto primero, cuando tenemos solo una línea, ya que los caracteres en el comando no serán tocados por ninguna de las sustituciones de derribo.Todo probado usando
dash
y GNUcoreutils
, conPOSIXLY_CORRECT
set en el entorno.fuente