introduction
J'ai beaucoup de roches ASCII. Ils sont construits avec des tirets, des tuyaux, des V, des carets, des équerres, des barres obliques et des espaces. Exemple:
/--\
| |
| |
\--/
Je veux les éroder, comme ceci:
/\
/ \
\ /
\/
Tous les coins sont devenus plus ronds. Un exemple plus compliqué:
/----\
| \------\
| |
| |
\------------/
/--\
/ \------\
| \
\ /
\----------/
Après une autre érosion, il deviendrait
/\
/ \------\
< \
\ /
\--------/
Et un autre:
/\------\
< \
\ /
\------/
Défi
Votre défi consiste à écrire un programme qui peut éroder une entrée une fois. Vous pouvez supposer qu'il n'y a qu'un seul rocher et vous pouvez supposer qu'il s'agit d'une boucle fermée. L'entrée ne contiendra que les caractères /\ -| <> ^V \n
et comportera des espaces de fin pour créer un rectangle. Le programme peut soit obtenir une entrée de STDIN et une sortie vers STDOUT, soit être une fonction. À la fin de chaque ligne se trouve un caractère de nouvelle ligne. L'érosion doit suivre les règles décrites ci-dessous (Remarque: dans les exemples, la roche n'est pas terminée, c'est pour faciliter l'explication). La sortie doit être au même format que l'entrée, avec la même taille que l'entrée. Cependant, les espaces de fin peuvent être omis.
Les barres obliques se propageront aux pipelines et aux tirets et se déplaceront.
/---
|
|
/--
/
|
/-
/
/
Si deux barres obliques fusionnent, le caractère approprié de <>^V
est utilisé.
/-----\
| |
| |
| |
\-----/
/---\
/ \
| |
\ /
\---/
/-\
/ \
< >
\ /
\-/
^
/ \
< >
\ /
V
Si une partie de la roche peut fusionner, elle le fera. Remarque: si une partie peut fusionner mais pas l'autre (c'est- /\
à- dire dans la deuxième ligne de l'exemple), celle qui peut fusionner le sera (voir l'exemple).
/\
/\-^-/\-/ \--
|
<
|
/
\
|
/
/
\
\
|
|
/-------/\--
/
|
|
|
|
|
|
/
\
|
|
|
Finalement, toutes les roches ne deviendront rien.
<> ^ /\
V \/
Cas de test
Test 1:
/----\
| \------\
| |
| |
\------------/
/--\
/ \------\
| \
\ /
\----------/
/\
/ \------\
< \
\ /
\--------/
/\------\
< \
\ /
\------/
/-----\
< \
\ /
\----/
/---\
< \
\ /
\--/
/-\
< \
\ /
\/
^
< \
\/
Test 2:
/----\
| |
| |
| |
| |
\----/
/--\
/ \
| |
| |
\ /
\--/
/\
/ \
/ \
\ /
\ /
\/
/\
/ \
\ /
\/
/\
\/
Test 3:
^ /\
/\--/\--/ \--/ \-\
\ |
| |
/ |
\ |
| |
| |
/ |
< |
\ |
| |
| |
/ |
/ |
\ |
\-----------------/
/-------^----/\-\
/ \
| |
| |
| |
| |
| |
| |
< |
| |
| |
| |
| |
/ |
\ /
\---------------/
/-------------\
/ \
/ \
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
\ /
\ /
\-------------/
/-----------\
/ \
/ \
/ \
| |
| |
| |
| |
| |
| |
| |
| |
\ /
\ /
\ /
\-----------/
/---------\
/ \
/ \
/ \
/ \
| |
| |
| |
| |
| |
| |
\ /
\ /
\ /
\ /
\---------/
/-------\
/ \
/ \
/ \
/ \
/ \
| |
| |
| |
| |
\ /
\ /
\ /
\ /
\ /
\-------/
/-----\
/ \
/ \
/ \
/ \
/ \
/ \
| |
| |
\ /
\ /
\ /
\ /
\ /
\ /
\-----/
/---\
/ \
/ \
/ \
/ \
/ \
/ \
/ \
\ /
\ /
\ /
\ /
\ /
\ /
\ /
\---/
/-\
/ \
/ \
/ \
/ \
/ \
/ \
/ \
\ /
\ /
\ /
\ /
\ /
\ /
\ /
\-/
^
/ \
/ \
/ \
/ \
/ \
/ \
/ \
\ /
\ /
\ /
\ /
\ /
\ /
\ /
V
^
/ \
/ \
/ \
/ \
/ \
/ \
\ /
\ /
\ /
\ /
\ /
\ /
V
^
/ \
/ \
/ \
/ \
/ \
\ /
\ /
\ /
\ /
\ /
V
^
/ \
/ \
/ \
/ \
\ /
\ /
\ /
\ /
V
^
/ \
/ \
/ \
\ /
\ /
\ /
V
^
/ \
/ \
\ /
\ /
V
^
/ \
\ /
V
^
V
Notation
C'est du code-golf , donc le programme avec le plus petit nombre d'octets gagne!
Les échappatoires standard ne sont pas autorisées.
"\x20\x20\x20\x20\x20\x20/\\\n/-\\\x20\x20/\x20\x20\\-\\\n|\x20\x20\\/\x20\x20\x20\x20\x20|\n\\---------/\n"
Réponses:
Rouille
J'ai abandonné après un certain temps, les instructions semblent ambiguës. Cependant, j'ai eu des roches d'aspect rétrécissant (voir la sortie). Je suis également sûr que cela doit être fait dans un espace à 2 dimensions plutôt que dans une chaîne à 1 dimension comme j'ai essayé ici. Mon principal «problème» est que je transforme l'entrée donnée en marquant l'espace comme «à l'intérieur» ou «à l'extérieur» de la roche, malheureusement à ce stade, il ne peut pas faire la distinction entre l'intérieur et les bords supérieur / inférieur.
production
la source