Introdução
Eu tenho muitas rochas ASCII. Eles são construídos com traços, tubos, Vs, pontos de intercalação, colchetes angulares, barras e espaços. Exemplo:
/--\
| |
| |
\--/
Eu quero corroê-los, assim:
/\
/ \
\ /
\/
Todos os cantos se tornaram mais arredondados. Um exemplo mais complicado:
/----\
| \------\
| |
| |
\------------/
/--\
/ \------\
| \
\ /
\----------/
Após outra erosão, tornaria-se
/\
/ \------\
< \
\ /
\--------/
E outro:
/\------\
< \
\ /
\------/
Desafio
Seu desafio é escrever um programa que possa corroer uma entrada uma vez. Você pode assumir que existe apenas uma rocha e pode assumir que é um loop fechado. A entrada conterá apenas os caracteres /\ -| <> ^V \n
e terá espaços à direita para criar um retângulo. O programa pode obter entradas de STDIN e enviar para STDOUT ou pode ser uma função. No final de cada linha, há um caractere de nova linha. A erosão deve seguir as regras descritas abaixo (Nota: nos exemplos a rocha não está concluída, é para facilitar a explicação). A saída deve estar no mesmo formato da entrada, com o mesmo tamanho da entrada. No entanto, espaços à direita podem ser omitidos.
As barras se espalharão por dutos e traços e se moverão.
/---
|
|
/--
/
|
/-
/
/
Se duas barras se fundirem, o caractere apropriado <>^V
é usado.
/-----\
| |
| |
| |
\-----/
/---\
/ \
| |
\ /
\---/
/-\
/ \
< >
\ /
\-/
^
/ \
< >
\ /
V
Se uma parte da rocha puder se fundir, ela ocorrerá. Nota: se uma parte pode mesclar, mas a outra não ( /\
na segunda linha do exemplo), a que pode ser mesclada (veja o exemplo).
/\
/\-^-/\-/ \--
|
<
|
/
\
|
/
/
\
\
|
|
/-------/\--
/
|
|
|
|
|
|
/
\
|
|
|
Eventualmente, todas as rochas se tornarão nada.
<> ^ /\
V \/
Casos de teste
Teste 1:
/----\
| \------\
| |
| |
\------------/
/--\
/ \------\
| \
\ /
\----------/
/\
/ \------\
< \
\ /
\--------/
/\------\
< \
\ /
\------/
/-----\
< \
\ /
\----/
/---\
< \
\ /
\--/
/-\
< \
\ /
\/
^
< \
\/
Teste 2:
/----\
| |
| |
| |
| |
\----/
/--\
/ \
| |
| |
\ /
\--/
/\
/ \
/ \
\ /
\ /
\/
/\
/ \
\ /
\/
/\
\/
Teste 3:
^ /\
/\--/\--/ \--/ \-\
\ |
| |
/ |
\ |
| |
| |
/ |
< |
\ |
| |
| |
/ |
/ |
\ |
\-----------------/
/-------^----/\-\
/ \
| |
| |
| |
| |
| |
| |
< |
| |
| |
| |
| |
/ |
\ /
\---------------/
/-------------\
/ \
/ \
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
\ /
\ /
\-------------/
/-----------\
/ \
/ \
/ \
| |
| |
| |
| |
| |
| |
| |
| |
\ /
\ /
\ /
\-----------/
/---------\
/ \
/ \
/ \
/ \
| |
| |
| |
| |
| |
| |
\ /
\ /
\ /
\ /
\---------/
/-------\
/ \
/ \
/ \
/ \
/ \
| |
| |
| |
| |
\ /
\ /
\ /
\ /
\ /
\-------/
/-----\
/ \
/ \
/ \
/ \
/ \
/ \
| |
| |
\ /
\ /
\ /
\ /
\ /
\ /
\-----/
/---\
/ \
/ \
/ \
/ \
/ \
/ \
/ \
\ /
\ /
\ /
\ /
\ /
\ /
\ /
\---/
/-\
/ \
/ \
/ \
/ \
/ \
/ \
/ \
\ /
\ /
\ /
\ /
\ /
\ /
\ /
\-/
^
/ \
/ \
/ \
/ \
/ \
/ \
/ \
\ /
\ /
\ /
\ /
\ /
\ /
\ /
V
^
/ \
/ \
/ \
/ \
/ \
/ \
\ /
\ /
\ /
\ /
\ /
\ /
V
^
/ \
/ \
/ \
/ \
/ \
\ /
\ /
\ /
\ /
\ /
V
^
/ \
/ \
/ \
/ \
\ /
\ /
\ /
\ /
V
^
/ \
/ \
/ \
\ /
\ /
\ /
V
^
/ \
/ \
\ /
\ /
V
^
/ \
\ /
V
^
V
Pontuação
Isso é código-golfe , então o programa com o menor número de bytes vence!
As brechas padrão não são permitidas.
"\x20\x20\x20\x20\x20\x20/\\\n/-\\\x20\x20/\x20\x20\\-\\\n|\x20\x20\\/\x20\x20\x20\x20\x20|\n\\---------/\n"
Respostas:
Ferrugem
Eu desisti disso depois de um tempo, as instruções meio que parecem ambíguas. No entanto, consegui algumas rochas com aparência de contração (veja a saída). Também tenho certeza de que isso precisa ser feito em um espaço bidimensional e não em uma string unidimensional como tentei aqui. Minha principal "questão" é que eu transformei a entrada dada marcando o espaço como 'dentro' ou 'fora' da rocha, infelizmente, neste ponto, não é possível distinguir entre as bordas interna e superior / inferior.
resultado
fonte