Gracias a esta pregunta por alguna inspiración
En este desafío representaremos una línea de dominó como una cadena de |
, /
y \
. Se le dará una serie de fichas de dominó como entrada y deberá determinar cómo se verán cuando se hayan asentado. Aquí están las reglas sobre cómo se caen las fichas de dominó
Un dominó de pie
|
, a la izquierda de un dominó caído a la izquierda\
, también se convertirá en un dominó caído a la izquierda.Un dominó de pie
|
, derecho de un dominó caído a la derecha/
, también se convertirá en un dominó caído a la derecha.Si un dominó parado está entre un dominó caído a la izquierda
\
y uno derecho/
, permanecerá en pie.
Estas reglas se aplican repetidamente hasta que la disposición ya no cambie.
Aquí hay un ejemplo de cómo una sola entrada podría llegar a su conclusión.
|||||||\/|||||||\||\|||/||||||\|||||
||||||\\//|||||\\|\\|||//||||\\|||||
|||||\\\///|||\\\\\\|||///||\\\|||||
||||\\\\////|\\\\\\\|||////\\\\|||||
|||\\\\\////|\\\\\\\|||////\\\\|||||
||\\\\\\////|\\\\\\\|||////\\\\|||||
|\\\\\\\////|\\\\\\\|||////\\\\|||||
\\\\\\\\////|\\\\\\\|||////\\\\|||||
Su tarea es escribir código que encuentre y genere el resultado final de una entrada. Puede suponer que la entrada siempre es válida y contiene al menos 2 caracteres.
Este es el código de golf, por lo que las respuestas se puntuarán en bytes, con menos bytes mejor.
Casos de prueba
|||/|||| -> |||/////
|||\|||| -> \\\\||||
|/||||\| -> |///\\\|
||/|||\| -> ||//|\\|
||\|||/| -> \\\|||//
fuente
Respuestas:
Retina , 32 bytes
Pruébalo en línea!
Explicación
El
+
le dice a Retina que ejecute el reemplazo en un bucle hasta que no pueda cambiar la cadena. Cada reemplazo calcula un paso las fichas de dominó que caen. El reemplazo en sí es realmente tres reemplazos en uno, pero esto asegura que sucedan simultáneamente:Esto solo coincide
/|\
(así como/\\
y/\\
, pero eso no importa) y lo reinserta sin cambios. El propósito de esto es saltar|
con fichas de dominó caídas en ambos lados, porque esto es más corto que descartar aquellos casos con miradas separadas en los otros dos casos.Esto coincide
/|
y lo convierte en//
.Esto coincide
|\
y lo convierte en\\
.fuente
$1$2$2$3$3
para vencer a los idiomas de golf.Python 2 ,
1151141111089895 bytes-1 byte gracias a ovs
Pruébalo en línea!
fuente
b=0;
y reemplazar las ocurrencias deb
byid
para guardar dos bytes!V , 23 bytes
Pruébalo en línea!
Realmente, esto es muy similar a la respuesta de la retina, solo que se ve más feo. Utiliza compresión regex.
Hexdump:
Explicación:
ò
le dice a V que se ejecute hasta que la cadena no cambie. El resto es una expresión regular comprimida. Convirtámoslo en el equivalente vim ...fuente
SNOBOL4 (CSNOBOL4) ,
117115112111 bytesPruébalo en línea!
Gracias a la respuesta de Python de Rod por la idea de la condición de detención con una segunda variable para ver los cambios en lugar de probarlos
D '/|' | '|\'
.fuente
Haskell ,
114107bytesPruébalo en línea! La primera línea define una función anónima.
Explicación:
until=<<((==)=<<)$g
es una función de punto fijo (vea aquí una explicación) que aplica la funcióng
a la cadena de entrada hasta que el resultado ya no cambie.zip3('|':s)s(tail s++"|")
crea para cada dominó, es decir, el carácter de la cadenas
, un triple con el dominó anterior y posterior, rellenando con|
los bordes. Por ejemplo, se/\|
convierte[(|,/,\),(/,\,|),(\,|,|)]
(ignorando el escape).t
se aplica a cada uno de los triples para calcular la nueva posición de la pieza central del triple.fuente
Perl 5 , 39 + 1 (
-p
) = 40 bytesPruébalo en línea!
fuente
Prólogo (SWI) , 132 bytes
Pruébalo en línea!
Este programa define un predicado
+/2
que es verdadero si el segundo argumento es la versión establecida del primero. Ambos argumentos son listas de códigos de caracteres.Explicación
Esta solución utiliza un DCG para determinar cuál es el siguiente paso y luego calcula repetidamente el siguiente paso hasta que el siguiente paso sea el mismo que el paso actual.
El DCG
Estas cinco líneas de código definen una regla DCG (Gramática de cláusula definida)
+
que se utiliza en el programa para calcular un solo paso de derribo del dominó. Los DCG en Prolog funcionan encontrando el primer caso de la regla cuyo lado derecho coincide con la cadena y determinando el argumento de la regla en el lado izquierdo a través de ese proceso. Si un caso no coincide, retrocederá e intentará un caso posterior.Esta línea representa el caso base de la
+
regla. Simplemente establece que si no hay fichas de dominó actualmente, en el siguiente paso todavía no habrá fichas de dominó.Desde este programa se ocupa exclusivamente de las listas de códigos de caracteres es importante tener en cuenta que los códigos de caracteres para
/
,\
y|
son 47, 92, y 124, respectivamente. Este caso de la+
regla maneja la/|\
cadena.Este estuche maneja un dominó que cae a la derecha y derriba el dominó a la derecha. Como viene después del caso para el manejo
/|\
, no se usará para esa posibilidad.Maneja el caso de un dominó que cae a la izquierda que derriba el dominó a su izquierda.
Este es el caso comodín. Como nada más cambia además de lo descrito anteriormente, siempre que quede texto en la cadena de entrada, simplemente lo copiará a la salida siempre que no coincida con ninguno de los casos anteriores.
El predicado
El predicado principal toma dos argumentos, el primero es la configuración inicial del dominó, el segundo es el dominó establecido. Como se trata de Prolog, el segundo puede ser indeterminado y el programa lo calculará. El predicado en sí mismo es bastante simple,
+(N,X,[])
llama al DCG y calcula el siguiente paso de las fichas de dominó que lo almacenanN
.(X=N,Y=N;N+Y)
comprueba si el siguiente paso de las fichas de dominó es el mismo que el actual y si es asíY
, ya que las fichas de dominó deben haberse asentado y si no es así, vuelve a aparecer, llamando al mismo predicado con el siguiente paso de las fichasN
de dominó en lugar deX
.fuente
APL (Dyalog) , 36 bytes
Pruébalo en línea!
-3 parcialmente gracias a Cows Quack .
Se siente tan poco golfista ... :(
fuente
cara , 166 bytes
Toma la entrada como un argumento de línea de comando y las salidas a STDOUT. Esto solo funciona en commit 86494f6 y posteriores debido a una corrección de errores en ese commit.
Envuelto para la estética:
Y sin golf / comentado:
Aquí hay algunos trucos sutiles que reducen algunos bytes adicionales, como
el nombramiento de las variables | y /, a cuyos valores ASCII se accede mediante introspección más adelante en el código
la
'|
en la primera línea del bucle principal, que se llama allí en vez de en la segunda línea con el fin de establecer el | puntero para usar en la segunda sección del bucle principalfuente
Perl 5 , 52 + 1 (-p) = 53 bytes
-6 bytes gracias a mik
Probablemente no sea lo mejor para Perl, pero es lo que se me ocurrió.
Explicación
Pruébalo en línea!
fuente
-p
en lugar de-a
elimina la necesidad deprint;
; usarwhile
como sufijo a una expresión ficticia (por ejemplo0
) ahorrará otros 2 bytesPerl 5 , 44 (código) + 1 (
-p
) = 45 bytesPruébalo en línea!
Explicación
fuente
Limpio , 98 bytes
Pruébalo en línea!
fuente
Ruby , 83 bytes
Técnicamente barato con
9.times
, o incluso solo999.times
pero no tengo ganas de ser barato :)Todavía tiene un gran potencial de golf. (Nota:
y while undone
es mucho más largo quex.size.times
)Pruébalo en línea!
fuente
R , 114 bytes
Pruébalo en línea!
Devuelve una cadena escapada.
fuente
C (gcc) , 183 bytes
Pruébalo en línea!
fuente