Introducción
Un rompecabezas común consiste en un tablero triangular con 15 agujeros para tees / clavijas como se muestra en la imagen a continuación:
Comenzando con todas las clavijas en el tablero, excepto por un agujero en la parte superior, el objetivo del rompecabezas es saltar las clavijas una sobre la otra como fichas, de tal manera que quede exactamente una clavija a la izquierda. El único movimiento válido es saltar una clavija sobre una clavija adyacente en cualquier dirección hacia un agujero vacío. La clavija que se saltó se retira del tablero. El juego termina cuando no quedan movimientos válidos.
Especificaciones
Su trabajo es escribir un programa que pueda encontrar una solución completa para el rompecabezas de clavijas, es decir, una que deje exactamente una clavija restante. Existen múltiples soluciones posibles, por lo que su programa solo necesita imprimir una.
- Su programa no recibirá ninguna entrada. No tiene permiso para leer datos de ninguna fuente externa.
- Imprima la lista de 13 movimientos que dan el resultado de 1 clavija restante usando este formato:
Peg 1 jumps Peg 3 to Hole 6.
- Los agujeros / clavijas están numerados de arriba a abajo, de izquierda a derecha, de modo que la clavija / agujero superior sea 1, numerando hasta que la esquina inferior derecha sea 15.
- Su programa debe encontrar la solución en tiempo de ejecución . Imprimir una solución directamente por cualquier otro medio que no sea resolverla en el programa es una descalificación automática.
- Bonificación : reciba 10 puntos de bonificación si puede generar múltiples soluciones únicas (solo puede imprimir separadas por líneas en blanco).
- Bonificación : recibe 5 puntos de bonificación si el número
15
no aparece en ninguna parte de tu código fuente.
Puntuación
Este es el código de golf, por lo que la solución más corta (por byte) que imprima una respuesta correcta será la ganadora. Los puntos de bonificación se restan de su recuento total de bytes. Proporcione una salida de muestra para ejecutar su programa, así como un enlace ideone
o algún sitio similar si es posible, demostrando la ejecución de su programa.
fuente
15=0xff=(1<4)-1=~(-1<<4)=...
15
sí mismas;)Respuestas:
Ruby, anotar
240238234 = 249 - 10-5Una implementación simple de ruby que imprime todas las soluciones posibles para este rompecabezas (toma menos de un minuto en mi computadora). Las primeras líneas de salida se pueden ver aquí:
Y el ejemplo en línea se puede encontrar aquí .
fuente
Python, 324 caracteres, puntuación = 319
El estado de clavija se mantiene como una máscara de bits.
M
contiene una lista de estados de clavijas y las instrucciones para llegar a ese estado.Podría hacer que imprima todas las soluciones también (hay 29760 de ellas), pero costaría más de 10 caracteres hacerlo.
No puedo publicarlo en ideone ya que tarda unos 90 segundos en ejecutarse.
Salida:
fuente
C, 386 caracteres, puntaje = 371
Imprime todas las soluciones 29760, en menos de un segundo.
Esta versión supone (entre otras cosas) que el compilador permitirá la declaración implícita de printf (). Se podrían guardar unos seis caracteres más utilizando implícita-int, pero esa característica se eliminó técnicamente de C99.
Además, se pueden guardar cuatro bytes más reemplazando las letras mayúsculas en las dos cadenas con los caracteres de control correspondientes. No hice eso aquí porque los compiladores no están obligados a permitir tales cadenas, y hace que el código fuente ya denso sea completamente ilegible.
Para mayor claridad, aquí está el mismo algoritmo sin las optimizaciones de tamaño más ofuscadoras:
f, o, yt son la lista de saltos legales inicializados en el primer bucle. R y yo formamos el historial que el programa utiliza para dar marcha atrás y explorar todos los juegos posibles.
Estoy seguro de que esto se puede mejorar!
fuente
>>1
por/2
.