Introducción
Tengo muchas rocas ASCII. Están construidos con guiones, tuberías, Vs, caretes, corchetes, barras y espacios. Ejemplo:
/--\
| |
| |
\--/
Quiero erosionarlos, así:
/\
/ \
\ /
\/
Todas las esquinas se han vuelto más redondas. Un ejemplo más complicado:
/----\
| \------\
| |
| |
\------------/
/--\
/ \------\
| \
\ /
\----------/
Después de otra erosión, se convertiría en
/\
/ \------\
< \
\ /
\--------/
Y otro:
/\------\
< \
\ /
\------/
Desafío
Su desafío es escribir un programa que pueda erosionar una entrada una vez. Puede suponer que solo hay una roca y puede suponer que es un bucle cerrado. La entrada solo contendrá los caracteres /\ -| <> ^V \n
y tendrá espacios finales para crear un rectángulo. El programa puede recibir entradas de STDIN y salir a STDOUT o puede ser una función. Al final de cada fila hay un carácter de nueva línea. La erosión debe seguir las reglas descritas a continuación (Nota: en los ejemplos la roca no está completa, esto es para facilitar la explicación). La salida debe estar en el mismo formato que la entrada, con el mismo tamaño que la entrada. Sin embargo, se pueden omitir los espacios finales.
Las barras se extenderán a tuberías y guiones y se moverán.
/---
|
|
/--
/
|
/-
/
/
Si dos barras se combinan, <>^V
se utiliza el carácter apropiado .
/-----\
| |
| |
| |
\-----/
/---\
/ \
| |
\ /
\---/
/-\
/ \
< >
\ /
\-/
^
/ \
< >
\ /
V
Si una parte de la roca puede fusionarse, lo hará. Nota: si una parte puede fusionarse pero la otra no (es decir, /\
en la segunda línea del ejemplo), entonces la que puede fusionarse lo hará (ver ejemplo).
/\
/\-^-/\-/ \--
|
<
|
/
\
|
/
/
\
\
|
|
/-------/\--
/
|
|
|
|
|
|
/
\
|
|
|
Eventualmente, todas las rocas se convertirán en nada.
<> ^ /\
V \/
Casos de prueba
Prueba 1:
/----\
| \------\
| |
| |
\------------/
/--\
/ \------\
| \
\ /
\----------/
/\
/ \------\
< \
\ /
\--------/
/\------\
< \
\ /
\------/
/-----\
< \
\ /
\----/
/---\
< \
\ /
\--/
/-\
< \
\ /
\/
^
< \
\/
Prueba 2:
/----\
| |
| |
| |
| |
\----/
/--\
/ \
| |
| |
\ /
\--/
/\
/ \
/ \
\ /
\ /
\/
/\
/ \
\ /
\/
/\
\/
Prueba 3:
^ /\
/\--/\--/ \--/ \-\
\ |
| |
/ |
\ |
| |
| |
/ |
< |
\ |
| |
| |
/ |
/ |
\ |
\-----------------/
/-------^----/\-\
/ \
| |
| |
| |
| |
| |
| |
< |
| |
| |
| |
| |
/ |
\ /
\---------------/
/-------------\
/ \
/ \
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
\ /
\ /
\-------------/
/-----------\
/ \
/ \
/ \
| |
| |
| |
| |
| |
| |
| |
| |
\ /
\ /
\ /
\-----------/
/---------\
/ \
/ \
/ \
/ \
| |
| |
| |
| |
| |
| |
\ /
\ /
\ /
\ /
\---------/
/-------\
/ \
/ \
/ \
/ \
/ \
| |
| |
| |
| |
\ /
\ /
\ /
\ /
\ /
\-------/
/-----\
/ \
/ \
/ \
/ \
/ \
/ \
| |
| |
\ /
\ /
\ /
\ /
\ /
\ /
\-----/
/---\
/ \
/ \
/ \
/ \
/ \
/ \
/ \
\ /
\ /
\ /
\ /
\ /
\ /
\ /
\---/
/-\
/ \
/ \
/ \
/ \
/ \
/ \
/ \
\ /
\ /
\ /
\ /
\ /
\ /
\ /
\-/
^
/ \
/ \
/ \
/ \
/ \
/ \
/ \
\ /
\ /
\ /
\ /
\ /
\ /
\ /
V
^
/ \
/ \
/ \
/ \
/ \
/ \
\ /
\ /
\ /
\ /
\ /
\ /
V
^
/ \
/ \
/ \
/ \
/ \
\ /
\ /
\ /
\ /
\ /
V
^
/ \
/ \
/ \
/ \
\ /
\ /
\ /
\ /
V
^
/ \
/ \
/ \
\ /
\ /
\ /
V
^
/ \
/ \
\ /
\ /
V
^
/ \
\ /
V
^
V
Puntuación
Este es el código de golf , por lo que gana el programa con el menor número de bytes.
Las lagunas estándar no están permitidas.
"\x20\x20\x20\x20\x20\x20/\\\n/-\\\x20\x20/\x20\x20\\-\\\n|\x20\x20\\/\x20\x20\x20\x20\x20|\n\\---------/\n"
Respuestas:
Oxido
Renuncié a esto después de un tiempo, las instrucciones parecen ambiguas. Sin embargo, obtuve algunas rocas de aspecto retráctil (ver salida). También estoy bastante seguro de que esto debe hacerse en un espacio de 2 dimensiones en lugar de en una cadena de 1 dimensión como lo intenté aquí. Mi "problema" principal es que transformo la entrada dada marcando el espacio como "dentro" o "fuera" de la roca, desafortunadamente en este punto no puede distinguir entre los bordes interior y superior / inferior.
salida
fuente