El reto
El código más corto por recuento de caracteres para ayudar al robot a encontrar al gatito en la menor cantidad de pasos posible.
Golfistas, este es un momento de crisis: ¡Gatito desapareció y es el trabajo de Robot encontrarlo! El robot necesita llegar a Kitten por el camino más corto posible. Sin embargo, hay muchos obstáculos en el camino de Robot, y él necesita que le programes una solución.
Robot solía tener un programa que lo hiciera por él, pero ese programa se perdió y Robot no tiene respaldo :(.
El tiempo de ejecución de Robot no es el mejor, y la menor cantidad de caracteres que Robot debe leer del código fuente, el menor tiempo que pasará procesando, ¡y eso significa que Kitten se encontrará más rápido!
La memoria del robot contiene un mapa de la ubicación en la que se encuentra actualmente con la parte superior que representa el norte, la inferior que representa el sur, la derecha que representa el este y la izquierda que representa el oeste. El robot siempre está en una habitación rectangular de un tamaño desconocido rodeado de paredes, representado #
en su mapa de radar. Las áreas en las que el robot puede caminar están representadas por un espacio .
El radar del robot también busca muchos obstáculos en la habitación y los marca en varias letras ASCII. El robot no puede cruzar esos obstáculos. El radar marcará a Kitten como el personaje ASCII especial K
, mientras que la ubicación del Robot está marcada con R
.
El sistema de navegación del robot funciona de esta manera: puede comprender un dúo de dirección y número de unidades de movimiento a las que debe viajar, por ejemplo, N 3
significa 'ir al norte 3 unidades de movimiento'. El mapa de radar del robot está hecho de tal manera que una unidad de movimiento es un personaje ASCII. El robot solo puede ir en 4 direcciones y no puede viajar en diagonal.
Su tarea, valiente protector de gatitos, es leer el mapa de radar de Robot una vez, y generar la menor cantidad de direcciones, con la menor distancia de desplazamiento de la unidad de movimiento. Se garantiza que el robot tendrá al menos un camino hacia Kitten.
Para garantizar que Robot no pierda el tiempo ejecutando un programa que no funciona correctamente y que no ayudará a Robot a encontrar a Kitten, ¡le recomiendo, valiente protector de Kitten, que use esta salida del programa anterior de Robot para asegurarse de que no se pierda el tiempo en encontrar Kitten!
Casos de prueba
Input:
######################
# d 3 Kj #
# #
# R #
# q #
######################
Output:
E 13
N 2
Input:
######################
# d r 3 Kj #
# p p #
# T X #
# q s t #
# #
# R o d W #
# #
# g t U #
# #
######################
Output:
N 1
E 10
N 4
E 2
Input:
######################
# spdfmsdlwe9mw WEK3#
# we hi #
# rdf fsszr#
# sdfg gjkti #
# fc d g i #
# dfg sdd #
# g zfg #
# df df #
# xcf R#
######################
Output:
N 1
W 9
N 5
E 4
N 1
E 4
N 1
El recuento de código incluye entrada / salida (es decir, programa completo).
fuente
Respuestas:
C ++
1002899799 caracteresNote requiere el uso de C ++ 0x para eliminar el espacio entre>> en las plantillas.
Sí encuentra la ruta con el número mínimo de vueltas.
Es
Dijkstra's Algorithm
para resolver el problema del camino más corto.Para distinguir entre múltiples rutas de igual tamaño, una línea recta larga tiene menos peso que varias líneas cortas (esto favorece rutas con menos curvas).
En una forma más legible:
fuente
Scala 2.8 (451 caracteres)
... pero no resuelve los vínculos a favor de la menor cantidad de direcciones (aunque sí encuentra la menor cantidad de pasos).
Scala 2.8, 642 caracteres, resuelve los lazos correctamente;
Descubrió una ruta más corta para el segundo ejemplo que la dada en el problema:
fuente
Python 2.6 (504 caracteres)
fuente
Python 2.6 (535 caracteres)
Se descomprime en una implementación de A * severamente maltratada. Lee stdin. Busca soluciones con una distancia total mínima. Rompe los lazos al preferir un número mínimo de direcciones. Listas mueve a stdout. Encuentra gatitos.
Desempaquetado :
La fuente ha sido manualmente anti-golf en algunos lugares para obtener una representación comprimida más pequeña. Por ejemplo, se desenrolló un bucle for sobre las direcciones de la brújula.
fuente
c ++ - 681 caracteres necesarios
Primero reemplaza todos los obstáculos en el mapa con
#
s (y cambia los valores deK
yR
, para dejar espacio en el espacio de caracteres para trazados muy largos. Luego garabatea en el mapa. Un proceso iterativo marca todos los cuadrados sucesivamente accesibles hasta que es capaz de alcanzar al gatito en un solo movimiento. Después de eso, utiliza la misma rutina de comprobación de accesibilidad para encontrar una cadena de posiciones que conducen al inicio en instrucciones mínimas. Estas instrucciones se cargan en una cadena por pre-pendiente, de modo que imprimir en el orden correcto.No tengo la intención de seguir jugando al golf, ya que no resuelve adecuadamente los lazos y no se puede adaptar fácilmente para hacerlo.
Falla en
productor
Versión más o menos legible:
fuente
Ruby - 539 caracteres
Podría mejorar mucho, pero funciona para los pasos más cortos y las instrucciones.
fuente
Ruby - 648 caracteres
Otro que falla la menor cantidad de pruebas de direcciones, ya que no se me ocurre ninguna manera fácil de incrustarlo en A *.
fuente