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 Bduplica el elemento A, que termina a su derecha:
.#.|.#...|......#
A B C D
Mirror Cluego duplica el nuevo elemento:
.#.|.#...|...#..#
A B C D
El espejo Cno puede duplicar el elemento A, ya que el espejo Bestá en el camino. Tampoco puede duplicar elementos D, ya que el espejo Bestá en el otro lado. Del mismo modo, el espejo Bno puede duplicar el elemento Do el duplicado al lado, ya que el espejo Cestá 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 Dpuede duplicar Ay Bhacia la derecha Ey Ghacia la izquierda.
Cy Fya son duplicados el uno del otro. La cuerda se convierte
.##.##..#|#..##.##|..##....#.
AB C DE FG H IJ K
Mirror Hpuede duplicar E, Fy los duplicados de Ay Ba la derecha y Ia la izquierda.
Gy Jya son duplicados entre sí, y el espejo Destá en el camino de K. Ahora tenemos
.##.##..#|#..#####|#####..##.
AB C DE FG H IJ K
Finalmente, el espejo Dpuede duplicar el duplicado de Ia 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 +
-plbanderasPara 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#/&&redofuente
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'.'con35y46respectivamente.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