Escriba un programa que genere una secuencia ganadora de movimientos a la variante determinista del juego 2048. La secuencia debe tener la forma de una cadena de números 0-3, con 0: arriba, 1: derecha, 2: abajo, 3: izquierda. Por ejemplo, la cadena "1132" significa derecha derecha izquierda abajo. ¡El programa ganador es el código fuente más corto que llega hasta 2048!
Las reglas para el determinista 2048: el juego se juega en una cuadrícula de 4x4 que inicialmente contiene 1 ficha, en la esquina superior izquierda. Cada movimiento consiste en el comando "izquierda", "derecha", "arriba" o "abajo". El comando de la izquierda desliza todos los mosaicos de la cuadrícula hacia la izquierda, luego combina y suma como mosaicos comenzando desde la izquierda. Del mismo modo, el comando de la derecha desliza los mosaicos a la derecha, luego combina a partir de la derecha.
Cada ficha solo puede participar en una combinación por movimiento.
Después de un movimiento, se crea un nuevo mosaico 2 en la primera columna desde la izquierda con un espacio disponible, en el primer espacio disponible desde la parte superior de esa columna.
Por ejemplo, la secuencia "derecha derecha izquierda abajo" conduce a los estados
2___
____
____
____
2__2
____
____
____
2__4
____
____
____
24__
2___
____
____
2___
____
____
44__
El comando derecho aplicado a la fila _ 2 2 2 da como resultado _ _ 2 4 El comando derecho aplicado a la fila 2 2 2 2 da como resultado _ _ 4 4
Esta pregunta inspirada en http://jmfork.github.io/2048/
fuente
$(".tile-container").addItem("<div class="tile tile-2048 tile-position-3-4">2048</div>");
Respuestas:
Python, 740 caracteres (665 caracteres comprimidos)
Código :
(Mezcla pestañas con espacios para sangría para guardar algunos bytes)
Debo haber sido un asco en el golf porque si solo comprimo el código anterior, la codificación base-64 y
exec
solo tiene 665 caracteres. Lo siguiente es exactamente equivalente a lo anterior, sin solución codificada ni nada:Respuesta :
Toma ~ 47 segundos (17 segundos sin golf) para encontrar la secuencia de 1111 movimientos:
Con la siguiente posición final del tablero y movimiento:
Curiosidades: la solución es 309 bytes comprimidos y 418 bytes si comprimidos y codificados en base64. Por lo tanto, sería un programa más corto simplemente decodificarlo e imprimirlo, pero eso no es nada divertido .
Explicacion :
Aquí hay un pastebin de la versión sin golf que imprime el tablero después de cada movimiento, ¡muy divertido de ver!
Es una IA de fuerza bruta muy simple. Asigna un EV para cada posición del tablero:
Realiza una búsqueda en profundidad cuatro movimientos hacia adelante y selecciona el camino que conduce al EV más alto en cuatro movimientos. La función ev lo alienta a limpiar el tablero y a mantener las piezas de mayor valor en la esquina, lo que termina siendo bastante óptimo. ¡Es suficiente para llegar allí!
Si modifica la función EV para colocar un valor más alto en otros puntos del tablero, algo como:
Esa función llega tan lejos como:
16k :
Eureka! Con una anticipación de 5 pasos en lugar de un 4, y los siguientes pesos:
Casi se pone 32k, terminando en:
La secuencia está aquí .
32k :
Sí, damas y caballeros, hemos alcanzado la marca de 32k. La función EV, en lugar de multiplicar cuadrados por una constante, eleva cada cuadrado a las siguientes potencias y las agrega.
x
significa que el cuadrado no está involucrado:Todavía suma todos los valores una vez y agrega 256 por cada cuadrado vacío. Lookahead tenía 4 hasta 32k, y luego aumentó hasta 5, pero realmente no parece hacer mucho. Junta final:
Pastebin de la secuencia de 24,625 movimientos .
fuente