Introducción
Mi sobrina quiere hacer una pista de autos de carrera. Ella tiene partes de madera que encajan entre sí para formar la pista. Cada parte tiene forma cuadrada y contiene una forma diferente. Usaré los caracteres de dibujo de tubería para ilustrar:
│
: el camino que va verticalmente─
: el camino que va horizontalmente┌
┐
└
┘
: los caminos que giran en una dirección┼
: Un puente con un paso subterráneo
Curiosamente, no hay piezas de unión en t.
Aquí hay un ejemplo de una posible pista de carreras:
┌─┐
│ │┌─┐
│ └┼─┘
└──┘
Las reglas para una pista de autos de carrera válida son las siguientes:
- No puede haber ningún camino que vaya a ninguna parte.
- Debe formar un bucle (y todas las piezas deben ser parte del mismo bucle).
- En los puentes / pasos subterráneos, no puede girar (por lo que debe atravesarlos directamente).
Desafortunadamente, las piezas de la pista de autos de carrera que mi sobrina y yo tenemos son limitadas. Pero definitivamente queremos usarlos todos en la pista. Escriba un programa que, dada una lista de las piezas que están en nuestro inventario, genere una pista de autos de carrera que use todas esas piezas.
Descripción de entrada
Nos gustaría que la entrada ingrese a través de STDIN, argumentos de línea de comandos, lectura de archivos o una función de entrada de usuario (como raw_input
o prompt
). La entrada es enteros positivos separados por comas en la forma
│,─,┌,┐,└,┘,┼
donde cada uno de ellos representa la cantidad de esa pieza en particular que tenemos. Entonces, por ejemplo, la entrada:
1,1,1,1,1,1,1
significaría que teníamos una de cada pieza.
Descripción de salida
Salida de una pista de carreras de coches utilizando los caracteres de dibujo de tubería enumerados anteriormente. La pista de autos de carrera debe usar exactamente el número de cada pieza especificada en la entrada, ni más ni menos. Habrá al menos una pista de carrera válida para cada entrada.
Ejemplo de entradas y salidas
Entrada: 3,5,2,2,2,2,1
Una posible salida:
┌─┐
│ │┌─┐
│ └┼─┘
└──┘
Entrada: 0,0,1,4,4,1,3
Una posible salida:
┌┐
└┼┐
└┼┐
└┼┐
└┘
Respuestas:
Rubí 664
671 677 687 701(678 bytes)Este no es el programa más corto que se me ocurrió, pero sacrifiqué algo de brevedad por la velocidad de ejecución.
Puedes experimentar con el programa aquí . Tenga en cuenta que ideone tiene un límite de tiempo de ejecución, por lo que para las entradas que constan de más de aproximadamente 12 piezas, el programa probablemente expire.
También hay un conjunto de pruebas para el programa. Tenga en cuenta que las dos últimas pruebas están deshabilitadas en ideone, debido al límite de tiempo mencionado anteriormente. Para habilitar estas pruebas, elimine el
x_
prefijo de sus nombres.El programa encuentra una solución usando la búsqueda de profundidad primero; coloca las piezas de una en una y mantiene huellas de cabos sueltos. La búsqueda se detiene cuando no hay más extremos sueltos (desconectados) y todas las piezas han sido colocadas.
Este es el programa sin golf:
fuente