PUNTUACIÓN ACTUALIZADA : como este desafío es más difícil de lo que esperaba, he ajustado la puntuación. Un programa que puede resolver una sola entrada espejo es una respuesta válida. Los programas más sofisticados obtienen una bonificación en su puntaje.
Ha habido varios acertijos en PPCG para encontrar un camino láser en una caja de espejos. En este rompecabezas, debe crear una caja de espejos para que coincida con varios destinos láser.
Se le da una caja y una especificación donde los láseres deben entrar y salir. Su programa necesita colocar exactamente N espejos de doble cara en la caja para cumplir con las especificaciones. Los espejos deben estar en ángulo a 45 grados, pero pueden inclinarse hacia adelante o hacia atrás.
Entrada
Su programa debe aceptar una cuadrícula de cuadro a través de STDIN, argumento de línea de comando o archivo en los siguientes ejemplos de formato:
+--G--+ +abcde+
G | f/////d
| /| a// c
+-----+ f |
+-b-e-+
Los pares de letras ([a-zA-Z] pueden usarse) indican la entrada / salida de hasta 52 láseres. Dentro de la caja habrá N /
espejos. Las dimensiones de la caja serán 3 <= W, H <= 200. La caja está hecha de +|-
caracteres. Puede haber cualquier número de espejos en la caja, incluido cero.
Salida
La salida debe coincidir con la entrada, excepto que los /
caracteres se pueden mover y / o cambiar a \
caracteres. Su programa debe enviar una cadena de caja espejo correcta a STDOUT o un archivo, arrastrando una nueva línea opcional. Si ninguna colocación de espejos puede cumplir con la especificación de entrada, salida Impossible\n
. Ejemplos de posibles soluciones:
+--G--+ +abcde+
G / | f \ \ d
| | a/ \ c
+-----+ f / //|
+-b-e-+
Ejemplo de prueba
Entrada:
+abcdefghijklmnopqrstuvwxyA-+
|/////////////// |
|/////////////// |
| |
+-Abcdefghijklmnopqrstuvwxya+
Salida de ejemplo:
+abcdefghijklmnopqrstuvwxyA-+
|\ \|
|/ / |
|\\\\\\\\\\\\\\\\\\\\\\\\\\ |
+-Abcdefghijklmnopqrstuvwxya+
Puntuación (ACTUALIZADO)
Este es el código de golf con bonos. Con su respuesta, debe nominar cuántos espejos puede resolver su programa (N). Su puntaje es la duración de su programa en bytes dividido por N. Esto permite que las personas ingresen con un programa simple, pero recompensa a más programadores de ambición con un bono.
Lagunas estándar no permitidas.
* 2^30
componente allíRespuestas:
C # -
897862 bytesEncontró un error grave al poner espejos en lugares donde no pueden estar. ¡Ahora funciona, con suerte! También hice un poco de golf ligero, no podía dejar el bucle while allí ... vergonzoso.
Programa completo, toma entrada de STDIN, salidas a STDOUT.
Esto fue muy divertido, resuelve bien el problema de 7 por 5 (y cuando quitas uno de los espejos, haciéndolo imposible), tomó aproximadamente 1 hora resolver los 30 por 5.
7 por 5 Ejemplo:
Versión imposible:
Algo diferente (el programa no mira el diseño espejo original):
Solución 30 por 5:
Observa cada fuente láser a su vez, y construye una ruta válida para ella (si puede), y luego pasa a la siguiente. Es una búsqueda bastante simple de profundidad, que tiene que saber qué fuente láser (objetivo) está mirando, cuántos espejos le quedan para colocar, la celda actual en la que se encuentra, la dirección en la que se mueve y cada celda. ya ha sido visitado (para que no ponga un espejo en algún lugar donde ya ha estado). Los últimos 3 se utilizan para ensamblar la ruta para el objetivo actual y en el restablecimiento cuando el objetivo cambia. Una vez que tiene todos los láseres conectados, continúa y llena los vacíos que no necesita dejar vacíos (otra razón por la que necesita saber en todos los lugares que visita).
Cuando está construyendo rutas, favorece avanzar "hacia adelante" sobre la inserción de un espejo, y cuando lo hace, favorece un espejo "\"; esto se ve mejor en el ejemplo "algo diferente" anterior, donde omite la primera celda debajo de 'a' superior, luego llena continuamente una "\" si puede encontrar una solución con una, de lo contrario una "/" (naturalmente, si omitir la primera celda resultara incapaz de encontrar una solución, entonces sería retrocede e intenta poner un espejo allí).
fuente
Python,
671654 bytesNo es una solución, sino un intento, lea a continuación.
No jugué golf al máximo, ya que no estoy satisfecho con la solución.
V
valida una solución dada recorriendo el campoF
para cada personajeC
que encuentra en la línea lateral. Las soluciones se generan al azar. Es feo, funciona para la entrada 1, pero toma mucho tiempo para las otras entradas. Dado que intenta soluciones al azar, no considero que sea una solución real para el problema dado; Pero podría ayudar a otros.Correr:
echo "entry1.txt" | python script.py
fuente