Introducción
Tengo una habitación llena de espejos mágicos . Son artefactos misteriosos que pueden duplicar cualquier elemento, excepto otro espejo mágico. Más explícitamente, una versión duplicada del elemento aparecerá en el otro lado del espejo, a la misma distancia. Sin embargo, si hay otro espejo mágico en el camino a cada lado, entre el espejo duplicado y cualquier elemento (original o duplicado), el duplicado no se forma. El elemento original puede estar a la izquierda o a la derecha del espejo, y el duplicado aparecerá en el otro lado. Además, el elemento duplicado puede ser duplicado por otro espejo. Los elementos nunca bloquean la duplicación de otros elementos (excepto al estar directamente en la posición del posible duplicado).
Entrada
Su entrada es una cadena que consta de los caracteres .#|
, que representan espacios vacíos, elementos y espejos mágicos. Siempre habrá al menos un espejo mágico en la entrada.
Salida
Su salida será otra cadena donde cada espejo mágico ha duplicado todos los elementos que puede, de acuerdo con las reglas anteriores. Puede suponer que siempre habrá un espacio vacío en el lugar donde aparece un elemento duplicado (para que no se salgan de los límites).
Ejemplos
Considere la cadena de entrada
.#.|.....|......#
A B C D
donde hemos marcado algunas posiciones para mayor claridad. El espejo B
duplica el elemento A
, que termina a su derecha:
.#.|.#...|......#
A B C D
Mirror C
luego duplica el nuevo elemento:
.#.|.#...|...#..#
A B C D
El espejo C
no puede duplicar el elemento A
, ya que el espejo B
está en el camino. Tampoco puede duplicar elementos D
, ya que el espejo B
está en el otro lado. Del mismo modo, el espejo B
no puede duplicar el elemento D
o el duplicado al lado, ya que el espejo C
está en el camino, por lo que esta es la salida correcta.
Para otro ejemplo, considere la entrada
.##..#...|#..##...|..##....#.
AB C DE FG H IJ K
El espejo se D
puede duplicar A
y B
hacia la derecha E
y G
hacia la izquierda.
C
y F
ya son duplicados el uno del otro. La cuerda se convierte
.##.##..#|#..##.##|..##....#.
AB C DE FG H IJ K
Mirror H
puede duplicar E
, F
y los duplicados de A
y B
a la derecha y I
a la izquierda.
G
y J
ya son duplicados entre sí, y el espejo D
está en el camino de K
. Ahora tenemos
.##.##..#|#..#####|#####..##.
AB C DE FG H IJ K
Finalmente, el espejo D
puede duplicar el duplicado de I
a la izquierda. Terminamos con
.#####..#|#..#####|#####..##.
AB C DE FG H IJ K
Reglas y puntaje
Puede escribir un programa completo o una función. El conteo de bytes más bajo gana. Los envíos que no usan motores de expresiones regulares compiten por separado de los que sí lo hacen, y pueden marcarse con (sin expresiones regulares) .
Casos de prueba
"|" -> "|"
"..|.." -> "..|.."
".#.|..." -> ".#.|.#."
"..#|.#." -> ".##|##."
".#..|....|.." -> ".#..|..#.|.#"
".|..|.#....." -> "#|#.|.#....."
"...|.#...|....#" -> ".##|##...|...##"
"......#|......." -> "......#|#......"
".#.|.....|......#" -> ".#.|.#...|...#..#"
".......|...#.##|...." -> "##.#...|...#.##|##.#"
"...#..||.......#..#...#" -> "...#..||.......#..#...#"
".##|.#....||#||......#|.#" -> ".##|##....||#||.....##|##"
".##..#...|#..##...|..##....#." -> ".#####..#|#..#####|#####..##."
".#|...||...|#...|..##...|#...." -> ".#|#..||.##|##..|..##..#|#..##"
"....#.|...#.|..|.|.....|..#......" -> "..#.#.|.#.#.|.#|#|#.#..|..#.#...."
"..|....|.....#.|.....|...|.#.|..|.|...#......" -> ".#|#...|...#.#.|.#.#.|.#.|.#.|.#|#|#..#......"
Respuestas:
Retina , 50 bytes
Pruébalo en línea! (La primera línea habilita un conjunto de pruebas separado por salto de línea).
Supongo que esto es lo contrario de una presentación (sin expresiones regulares).
Explicación
Esto es simplemente una sustitución de expresiones regulares, que se aplica repetidamente (
+
) hasta que la cadena deja de cambiar. Estoy usando grupos de equilibrio para asegurarme de que las dos posiciones reflejadas estén a la misma distancia del espejo dado (las referencias traseras no lo harán, ya que la cadena exacta en ambos lados del|
puede ser diferente).Esto se reemplaza con el
#$2#
que simplemente reemplaza tanto el primer como el último personaje del partido con a#
.fuente
Perl, 49 bytes
Crédito total a @ Martin Ender por este que sugirió esta expresión regular 15 bytes más corta que la mía.
47 bytes de código +
-pl
banderasPara ejecutarlo:
El primero (
([.#])
) y el último ((?!\1)[^|]
partes ) son las mismas que en la respuesta Retina (vea la explicación allí).La parte central (
(\||[^|](?2)[^|])
) usa la recursión perl ((?2)
) para hacer coincidir un espejo (\|
) o (|
) dos caracteres no espejos ([^|]
) separados por el mismo patrón ((?2)
).Mi versión anterior (y más fea):
s/([.#])(([^|]*)\|(??{$3=~s%.%[^|]%gr}))(?!\1)[^|]/#$2#/&&redo
fuente
Haskell (sin expresiones regulares), 117 bytes
fuente
PHP,
123117100 bytesEl programa toma el argumento de la línea de comandos, expresiones regulares tomadas de @Martin Ender / Dada. Corre con
-r
.fuente
C, 176 bytes
Sin golf
fuente
'#'
y'.'
con35
y46
respectivamente.x,i,j;void t(char*a){while(a[i]++)if(a[i]=='|'){for(j=x;a[j++]&&j<=i*2-x;j++){if((a[j]==35)&&(a[2*i-j]==46)){a[2*i-j]=35;i=-1;break;}if((i-j)&&(a[j]=='|'))break;}x=i+1;}}
- 170 bytesJavaScript (ES6), 170 bytes
Sin golf:
fuente