Problema
Imagine 7 cubos alineados en una fila. Cada cubo puede contener como máximo 2 manzanas. Hay 13 manzanas etiquetadas del 1 al 13. Se distribuyen entre los 7 cubos. Por ejemplo,
{5,4}, {8,10}, {2,9}, {13,3}, {11,7}, {6,0}, {12,1}
Donde 0 representa el espacio vacío. El orden en que aparecen las manzanas dentro de cada cubo no es relevante (por ejemplo, {5,4} es equivalente a {4,5}).
Puede mover cualquier manzana de un cubo a un cubo adyacente, siempre que haya espacio en el cubo de destino para otra manzana. Cada movimiento se describe por el número de la manzana que desea mover (lo cual no es ambiguo porque solo hay un espacio vacío). Por ejemplo, aplicando el movimiento
7
a la disposición anterior resultaría en
{5,4}, {8,10}, {2,9}, {13,3}, {11,0}, {6,7}, {12,1}
Objetivo
Escriba un programa que lea un arreglo de STDIN y lo clasifique en el siguiente arreglo
{1,2}, {3,4}, {5,6}, {7,8}, {9,10}, {11,12}, {13,0}
usando la menor cantidad de movimientos posible. Nuevamente, el orden en que aparecen las manzanas dentro de cada cubo no es relevante. El orden de los cubos es importante. Debería mostrar los movimientos utilizados para ordenar cada disposición separada por comas. Por ejemplo,
13, 7, 6, ...
Su puntaje es igual a la suma del número de movimientos necesarios para resolver los siguientes arreglos:
{8, 2}, {11, 13}, {3, 12}, {6, 10}, {4, 0}, {1, 7}, {9, 5}
{3, 1}, {6, 9}, {7, 8}, {2, 11}, {10, 5}, {13, 4}, {12, 0}
{0, 2}, {4, 13}, {1, 10}, {11, 6}, {7, 12}, {8, 5}, {9, 3}
{6, 9}, {2, 10}, {7, 4}, {1, 8}, {12, 0}, {5, 11}, {3, 13}
{4, 5}, {10, 3}, {6, 9}, {8, 13}, {0, 2}, {1, 7}, {12, 11}
{4, 2}, {10, 5}, {0, 7}, {9, 8}, {3, 13}, {1, 11}, {6, 12}
{9, 3}, {5, 4}, {0, 6}, {1, 7}, {12, 11}, {10, 2}, {8, 13}
{3, 4}, {10, 9}, {8, 12}, {2, 6}, {5, 1}, {11, 13}, {7, 0}
{10, 0}, {12, 2}, {3, 5}, {9, 11}, {1, 13}, {4, 8}, {7, 6}
{6, 1}, {3, 5}, {11, 12}, {2, 10}, {7, 4}, {13, 8}, {0, 9}
Sí, cada uno de estos arreglos tiene una solución.
Reglas
- Su solución debe ejecutarse en tiempo polinómico en el número de cubos por movimiento. El punto es usar heurísticas inteligentes.
- Todos los algoritmos deben ser deterministas.
- En caso de empate, gana el conteo de bytes más corto.
fuente
Respuestas:
Puntuación: 448
Mi idea es ordenarlos consecutivamente, comenzando con 1. Esto nos da la buena propiedad de que cuando queremos mover el espacio a la cesta anterior / siguiente, sabemos exactamente cuál de las dos manzanas tenemos que mover: el máximo / min uno, respectivamente. Aquí está el desglose de prueba:
El código se puede jugar mucho más, pero una mejor calidad del código motivará respuestas adicionales.
C ++ (501 bytes)
Otras mejoras pueden ser cambiar a C e intentar reducir la puntuación comenzando desde los valores grandes hacia abajo (y eventualmente combinando ambas soluciones).
fuente
C,
426448Esto clasifica las manzanas de una en una de 1 a 13, de manera similar al método de yasen , excepto que cada vez que tenga la oportunidad de mover un número mayor hacia arriba o hacia abajo, lo tomará.
Lamentablemente, esto solo mejora el rendimiento en el primer problema de prueba, pero es una pequeña mejora.Cometí un error al ejecutar los problemas de prueba. Parece que simplemente he reimplementado el método de yasen.Se necesita entrada sin llaves ni comas, p. Ej.
Aquí está el código de golf entrando en 423 bytes contando algunas líneas nuevas innecesarias (probablemente podría jugar más golf, pero espero que este puntaje sea superado):
Y el código sin golf, que también imprime el puntaje:
fuente
Python 3-121
Esto implementa una búsqueda de profundidad primero con profundidad creciente hasta que encuentre una solución. Utiliza un diccionario para almacenar estados visitados para que no los vuelva a visitar a menos que tenga una ventana de mayor profundidad. Al decidir qué estados verificar, utiliza el número de elementos extraviados como heurístico, y solo visita los mejores estados posibles. Tenga en cuenta que, dado que el orden de los elementos dentro de su depósito no importa, siempre mantiene un orden dentro de los depósitos. Esto hace que sea más fácil verificar si un elemento está fuera de lugar.
La entrada es una matriz de entradas, siendo el primer int el número de cubos.
Entonces, por ejemplo, para el n. ° 8 (este tarda mucho tiempo en ejecutarse en mi máquina, los otros terminan en segundos):
Aquí están los resultados en el conjunto de pruebas: # 1: 12, # 2: 12, # 3: 12, # 4: 12, # 5: 11, # 6: 11, # 7: 10, # 8: 14, # 9: 13, # 10: 14
Aquí está el código:
fuente