Le maniglie delle porte sono fantastiche e tutte, ma quando apri una porta, ammaccano sempre le pareti attorno ad essa. Ho bisogno che tu prenda input dell'arte ASCII di una stanza, in questo modo:
+---------+--X --X --+-----+
| \ \ |\ | \ |
| \ \ | \ | \|
| X | \ | X
| / | | \ X
| / | \ /
| / | \ / |
+---X --+-------X------+-----+
E uscita la stanza con fermaporta, in questo modo:
+---------+--X --X --+-----+
| \ . \ |\ | \.|
| \ \ | \ .| \|
| X | \ | X
| / | |. \ X
| / .| \ /
|. / | .\ / |
+---X --+-------X------+-----+
Specifica:
- La sala ASCII (ingresso) sarà composto da
+,-e|. Questi personaggi sono puramente cosmetici; potrebbero essere tutti+s, ma sarebbe orribile. Conterrà anche cerniere (X) e porte (/o\). - Le porte sono costituite da
/o\. A partire dal carattere "cerniera", ovveroX, andranno direttamente in diagonale (cambio di 1 inxe 1 iny) per 2 o più unità (caratteri). Per trovare dove posizionare il fermaporta per una porta (c'è sempre solo un fermaporta per porta), trova la porta per la porta. La porta partirà sempre da una cerniera e da lì proseguirà la stessa quantità di spazi della lunghezza della porta su, giù, a sinistra o a destra. Il prossimo spazio dopo sarà sempre un muro. Ad esempio, in questa porta, la porta è contrassegnata da
Ds:\ \ ---DDX-----Una volta trovata la porta, scopri se devi andare in senso orario o antiorario per raggiungere la porta. Ad esempio, in quella porta di esempio sopra, devi andare in senso orario, e in questo, devi andare in senso antiorario:
\ <- \ ) -----X ---Una volta che sai da che parte andare, continua così (ignorando la porta) fino a raggiungere un muro.
Ecco una visualizzazione di questo per la porta di esempio sopra:

Il blu è la porta, l'arancione sta scoprendo che devi andare in senso orario, e il rosso continua ad andare in senso orario fino a raggiungere un muro.
Una volta raggiunto un muro, vai (la lunghezza della porta) spazi dalla cerniera (
X) su quel muro, sposta uno spazio dal muro verso la porta (in modo da non posizionare lo stipite proprio sul muro), e inserisci un.Là. Ecco lo stesso esempio di porta che mostra come è posizionato il fermaporta:\ \ . ---DDX12---Ripetere l'operazione per ogni porta e produrre il risultato! Usa l'input di esempio nella parte superiore di questo post come test case per verificare se il tuo programma è valido.
Si noti che non è necessario gestire porte che non si adattano alle loro pareti, come ad esempio:
| / | / | / | / +-X --O:
/ / / +-X -- | |- Questo è code-golf , quindi vincerà il codice più breve in byte.