Los pomos de las puertas son geniales, pero cuando abres una puerta, siempre abolla las paredes a su alrededor. Necesito que ingreses el arte ASCII de una habitación, así:
+---------+--X --X --+-----+
| \ \ |\ | \ |
| \ \ | \ | \|
| X | \ | X
| / | | \ X
| / | \ /
| / | \ / |
+---X --+-------X------+-----+
Y haga salir la habitación con topes de puerta, así:
+---------+--X --X --+-----+
| \ . \ |\ | \.|
| \ \ | \ .| \|
| X | \ | X
| / | |. \ X
| / .| \ /
|. / | .\ / |
+---X --+-------X------+-----+
Especificación:
- La habitación ASCII (entrada) constará de
+
,-
, y|
. Estos personajes son puramente cosméticos; todos podrían ser+
s pero eso se vería horrible. También contendrá bisagras (X
) y puertas (/
o\
). - Las puertas están formadas por
/
o\
. A partir del carácter "bisagra", es decirX
, irán directamente en diagonal (cambio de 1 pulg.x
Y 1 pulg.y
) Para 2 o más unidades (caracteres). Para encontrar dónde colocar el tope de una puerta (siempre hay solo un tope por puerta), busque la puerta de entrada para la puerta. La puerta siempre comenzará en una bisagra, y tendrá la misma cantidad de espacios que la longitud de la puerta hacia arriba, abajo, izquierda o derecha desde allí. El siguiente espacio después de eso siempre será un muro. Por ejemplo, en esta puerta, la entrada está marcada con
D
s:\ \ ---DDX-----
Una vez que se encuentra la puerta, averigüe si necesita ir en sentido horario o antihorario para llegar a la puerta. Por ejemplo, en esa puerta de ejemplo anterior, debe ir en el sentido de las agujas del reloj, y en esta, debe ir en sentido contrario a las agujas del reloj:
\ <- \ ) -----X ---
Una vez que sepa qué camino tomar, siga por ese camino (ignorando la puerta) hasta llegar a una pared.
Aquí hay una visualización de eso para la puerta de ejemplo anterior:
El azul es la puerta, el naranja está descubriendo que debes ir en el sentido de las agujas del reloj, y el rojo continúa yendo en el sentido de las agujas del reloj hasta llegar a una pared.
Una vez que llegue a una pared, vaya (la longitud de la puerta) espacios desde la bisagra (
X
) en esa pared, aleje un espacio de la pared hacia la puerta (para que no coloque el tope de la puerta en la pared) e inserte un.
allí. Aquí está el mismo ejemplo de puerta que muestra cómo se coloca el tope:\ \ . ---DDX12---
¡Repita para cada puerta y obtenga el resultado! Use la entrada de ejemplo en la parte superior de esta publicación como un caso de prueba para verificar si su programa es válido.
Tenga en cuenta que no tiene que manejar puertas que no encajan en sus paredes, como por ejemplo:
| / | / | / | / +-X --
O:
/ / / +-X -- | |
- Este es el código de golf , por lo que ganará el código más corto en bytes.
Respuestas:
Scala, 860 bytes
Golfizado :
Sin golf :
Usar OOP fue definitivamente el enfoque equivocado aquí, en retrospectiva. Si pudiera hacerlo nuevamente, definitivamente iría con un montón de tablas de verdad codificadas.
fuente