Introdução
Eu tenho uma sala cheia de espelhos mágicos . Eles são artefatos misteriosos que podem duplicar qualquer item, exceto outro espelho mágico. Mais explicitamente, uma versão duplicada do item aparecerá no outro lado do espelho, à mesma distância. No entanto, se houver outro espelho mágico no caminho de ambos os lados, entre o espelho de duplicação e o item (original ou duplicado), a duplicata não será formada. O item original pode ser esquerdo ou direito do espelho e a duplicata aparecerá no outro lado. Além disso, o item duplicado pode ser duplicado por outro espelho. Os itens nunca bloqueiam a duplicação de outros itens (exceto por estar diretamente na posição da possível duplicata).
Entrada
Sua entrada é uma sequência que consiste nos caracteres .#|
, que representam espaço vazio, itens e espelhos mágicos. Sempre haverá pelo menos um espelho mágico na entrada.
Saída
Sua saída será outra string em que cada espelho mágico duplicou todos os itens possíveis, de acordo com as regras acima. Você pode assumir que sempre haverá um espaço vazio no local onde um item duplicado aparece (para que eles não saiam dos limites).
Exemplos
Considere a sequência de entrada
.#.|.....|......#
A B C D
onde marcamos algumas posições para maior clareza. O espelho B
duplica o item A
, que termina à sua direita:
.#.|.#...|......#
A B C D
O espelho C
duplica o novo item:
.#.|.#...|...#..#
A B C D
O espelho C
não pode duplicar o item A
, pois o espelho B
está no caminho. Ele também não pode duplicar o item D
, pois o espelho B
está no caminho do outro lado. Da mesma forma, o espelho B
não pode duplicar o item D
ou a duplicata ao lado, pois o espelho C
está no caminho, portanto esta é a saída correta.
Para outro exemplo, considere a entrada
.##..#...|#..##...|..##....#.
AB C DE FG H IJ K
O espelho D
pode duplicar A
e B
para a direita E
e G
para a esquerda.
C
e F
já são duplicados um do outro. A cadeia se torna
.##.##..#|#..##.##|..##....#.
AB C DE FG H IJ K
Espelho H
pode duplicar E
, F
e as cópias de A
e B
para a direita, e I
à esquerda.
G
e J
já são duplicados um do outro, e o espelho D
está no caminho K
. Agora temos
.##.##..#|#..#####|#####..##.
AB C DE FG H IJ K
Finalmente, o espelho D
pode duplicar a duplicação de I
para a esquerda. Acabamos com
.#####..#|#..#####|#####..##.
AB C DE FG H IJ K
Regras e pontuação
Você pode escrever um programa completo ou uma função. A menor contagem de bytes vence. Os envios que não usam mecanismos regex competem separadamente daqueles que o fazem e podem ser marcados com (sem regex) .
Casos de teste
"|" -> "|"
"..|.." -> "..|.."
".#.|..." -> ".#.|.#."
"..#|.#." -> ".##|##."
".#..|....|.." -> ".#..|..#.|.#"
".|..|.#....." -> "#|#.|.#....."
"...|.#...|....#" -> ".##|##...|...##"
"......#|......." -> "......#|#......"
".#.|.....|......#" -> ".#.|.#...|...#..#"
".......|...#.##|...." -> "##.#...|...#.##|##.#"
"...#..||.......#..#...#" -> "...#..||.......#..#...#"
".##|.#....||#||......#|.#" -> ".##|##....||#||.....##|##"
".##..#...|#..##...|..##....#." -> ".#####..#|#..#####|#####..##."
".#|...||...|#...|..##...|#...." -> ".#|#..||.##|##..|..##..#|#..##"
"....#.|...#.|..|.|.....|..#......" -> "..#.#.|.#.#.|.#|#|#.#..|..#.#...."
"..|....|.....#.|.....|...|.#.|..|.|...#......" -> ".#|#...|...#.#.|.#.#.|.#.|.#.|.#|#|#..#......"
Respostas:
Retina , 50 bytes
Experimente online! (A primeira linha ativa um conjunto de testes separado por avanço de linha.)
Eu acho que isso é o oposto de uma submissão (sem regex).
Explicação
Isso é simplesmente uma substituição de regex, que é aplicada repetidamente (
+
) até que a string pare de mudar. Estou usando grupos de balanceamento para garantir que as duas posições espelhadas estejam à mesma distância do espelho fornecido (as referências anteriores não o farão, pois a seqüência exata em ambos os lados|
pode ser diferente).Isso é substituído pelo
#$2#
que simplesmente substitui o primeiro e o último caractere da partida por a#
.fonte
Perl, 49 bytes
Crédito total para @Martin Ender por este que sugeriu esse regex 15 bytes mais curto que o meu.
47 bytes de código +
-pl
sinalizadoresPara executá-lo:
A primeira (
([.#])
) e a última ((?!\1)[^|]
) partes são as mesmas da resposta da Retina (veja a explicação ali).A parte do meio (
(\||[^|](?2)[^|])
) usa perl recursion ((?2)
) para corresponder a um espelho (\|
) ou (|
) dois caracteres não espelhos ([^|]
) separados pelo mesmo padrão ((?2)
).Minha versão mais antiga (e mais feia):
s/([.#])(([^|]*)\|(??{$3=~s%.%[^|]%gr}))(?!\1)[^|]/#$2#/&&redo
fonte
Haskell (sem regex), 117 bytes
fonte
PHP,
123117100 bytesO programa recebe um argumento de linha de comando, regex retirado de @Martin Ender / Dada. Corra com
-r
.fonte
C, 176 bytes
Ungolfed
fonte
'#'
e'.'
com35
e46
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
Ungolfed:
fonte