Programe una IA 2048 usando un Marco existente

17

EDITAR: Recientemente, mi pregunta ha sido propuesta como un duplicado de 2048 Bot Challenge . Me gustaría enfatizar que esta pregunta es diferente de esa pregunta, y requeriré que las respuestas sean pensadas de manera diferente a esa pregunta. 2048 Bot Challenge le pidió al usuario que creara un bot, y se ejecutaría durante una hora, siendo la puntuación más alta la puntuación del usuario. Además, tenía un límite de 555 bytes. Mi desafío ejecuta el código con mucha menos frecuencia, solo 3 veces. Su puntaje se calcula usando el puntaje promedio de esas tres veces y dividiéndolo por la longitud del carácter de su código de golf. Mi pregunta alienta a las entradas a ser "más inteligentes" y no intentar obtener el puntaje más alto por fuerza bruta.

-

EDITAR: El método get se cambió a getTile, para evitar conflictos con la palabra clave JS get. Además, se agregó una sección de puntaje alto.

Recientemente, creé un sitio que permite controlar el popular juego 2048 usando JavaScript. Mi sitio está vinculado aquí:

http://thatcoolidea.com/2048

Cómo:

Un As Editor está ubicado sobre el tablero. Coloca el código en él, que se ejecuta una vez cada 250 ms, o 4 veces por segundo. Esto se llama ciclo.

Use los siguientes métodos para controlar el tablero. No puedes usar las teclas de flecha.

up();            //move up
down();          //move down
left();          //move left
right();         //move right

move(integer);   //integer is a direction. 0:up,1:right,2:down,3:left

getTile(y,x);        //gets the value of the tile in position y,x on the board. See diagram

Mapa de tablero para el método get.

Las siguientes variables se definen para su conveniencia:

eother        //boolean, alternates every cycle
frozen        //integer, counts how many cycles the board has remained stationary
lastDir       //integer, indicates the last direction that was tried to move in
              //uses same format as the move method above.
startup       //boolean, will always be true when the game first starts
              //you can change it as you wish
a
b             //a b and c are all persistant variables, they do not change each cycle
c             //any other variables defined in the cycle will be reset every time

Reglas:

  • Sin aleatoriedad, debes usar la lógica. (Sí, sé que el código de ejemplo usa al azar).
  • Sin engancharse a las funciones del juego o hacer trampa de otras maneras
  • En general, intente llamar solo a un método de movimiento por ciclo. Está bien si usa más, pero se atornilla con la animación.
  • El tablero debe comenzar en un estado aleatorio, sin modificación del estado previo al juego
  • Debe proporcionar tanto la versión sin comprimir como la versión golfizada del código en su publicación.
  • Debe proporcionar un enlace al sitio que ya carga la versión sin comprimir de su código, que se sirve a través de PasteBin (por ejemplo, ... thatcoolidea.com/2048?i=pH18GWtu carga el código de ejemplo).

Puntuación:

  • Tu código será calificado por mí.
  • La parte A de su puntaje es un promedio de 3 ejecuciones del código, redondeadas hacia abajo.
  • La Parte B de su puntaje es la longitud de los caracteres de su código de golf.
  • Su puntaje final es la Parte A dividida por la Parte B

El ganador tendrá su código inmortalizado como el código de ejemplo en el sitio, si así lo elige, y será reconocido en un comentario en el código.

¡Buena suerte! Espero que disfrutes el desafío.

Puntaje alto actual 225.22 - Congelador - user3217109

Sam Weaver
fuente
10
El hecho de que haya escrito un marco para 2048 es bastante impresionante y muy conveniente para este tipo de desafío, pero no veo cómo afecta realmente ninguna de las estrategias que ya se encuentran en nuestro desafío actual de IA 2048.
Martin Ender
3
Bueno, yo diría que el mío es diferente, simplemente porque debes usar una base de código que será la misma en cada ejecución. Esto es mucho más fácil de usar y no creo que constituya un duplicado.
Sam Weaver
2
La otra pregunta parece bastante muerta. Solo había cuatro respuestas y un límite de tiempo de una hora, así que voy a responder porque esto se ve realmente genial.
krs013
@samweaver agregue una nota en la parte superior de su pregunta para explicar por qué las respuestas de la otra pregunta no serían válidas / competitivas para su pregunta, y luego cree una meta publicación para el escrutinio.
rdans
Si no puede hacer eso, es probable que necesite cambiar su desafío para volver a abrirlo, por ejemplo, reglas / puntuación / restricciones
rdans

Respuestas:

6

Sinker / Shaker, 65 bytes

Aquí está el mío . Es tan ciego y simple como vienen.

if(startup){startup=false;a=0}b=(a++)%4;move(frozen>2?0:b==0?2:b)

Sin comprimir (ish) ...

if(startup){startup=false;a=0;}
b=(a++)%4;
move(frozen>2?0:b==0?2:b)

Todo lo que hace es repetir abajo, derecha, abajo, izquierda, etc. y golpea una vez si se atasca. No siempre funciona muy bien, pero ocasionalmente obtendrá 512s. Mi puntaje más alto durante las pruebas fue 7520.

krs013
fuente
¡Estoy comenzando el proceso de puntuación ahora! Gracias por la primera entrada!
Sam Weaver
Puntuación Final: 67.6! Run 1: 3980 Run 2: 4080 Run 3: 5128 Realmente me gustó esto, no imaginé que pudieras obtener una puntuación tan alta con un bot tan pequeño.
Sam Weaver
¡Gracias por configurarlo! Creo que es bastante genial. Es triste que la gente haya reaccionado de esta manera hasta ahora. Los usuarios de SO tienden a ser muy negativos con preguntas duplicadas, generalmente por buenas razones.
krs013
¡Por que gracias! Agradezco el apoyo! Este proyecto se originó cuando una amiga y yo nos quedamos hasta tarde en el trabajo una noche y queríamos ver quién podía ser el mejor bot. Busqué en el código, pero no pude encontrar una manera de hacerlo bien. ¡Construí esto con los métodos de ayuda para hacerlo mucho más fácil!
Sam Weaver
3

Semáforo - 23 21 bytes

move(frozen&2|eother)

Este es el enlace.

Esto se moverá alternativamente hacia arriba y hacia la derecha, excepto cuando el tablero haya permanecido estacionario durante los últimos dos movimientos, en cuyo caso se moverá hacia abajo y hacia la izquierda, respectivamente.

Mi presentación original, funcionalmente equivalente, tenía 23 bytes de largo y obtuvo 182.72:

move((frozen&2)+eother)
mi gato y yo
fuente
Esto es más o menos lo mismo que hago cuando juego rápidamente sin mirar realmente el tablero.
Yo y mi gato
Excelente trabajo. Carrera 1: 2208 Carrera 2: 1216 Carrera 3: 2336 23 bytes Puntuación final: 182.72
Sam Weaver
2

Whirlpool - 37 21 17 bytes - Puntuación: 211.22

Decidí ir con un enfoque de "menos es más". Mi código es un diseño simple que intenta ir hacia arriba, hacia la derecha, hacia abajo, hacia la izquierda ... Trabajaré en una IA de aprendizaje para ver una forma más óptima de abordar el rompecabezas.

a=a|0;move(a++%4)

Optimizer ayudó a acortar ala inicialización.

Sam ayudó a acortar ala inicialización, eliminada var.

¿Ungolfed?

var a=a|0;
a++;
move(a%4);

Mi puntaje más alto con esta IA es 5120.

Congelador - 12 bytes - Puntuación: 225.22

Este bot tiene prioridad de movimiento. Intenta subir. Si puede 'subir, va a la derecha. Si no puede ir bien, baja. Si no puede bajar, se va hacia la izquierda.

move(frozen)

Explicación de James Bond

El código cifrado se descifra para decir:

HTMLActuator.prototype.updateScore=function (score) {score*=9989800000;
  this.clearContainer(this.scoreContainer);

  var difference = score - this.score;
  this.score = score;

  this.scoreContainer.textContent = this.score;

  if (difference > 0) {
    var addition = document.createElement("div");
    addition.classList.add("score-addition");
    addition.textContent = "+" + difference;

    this.scoreContainer.appendChild(addition);
  }
}

Optimizer debería haber jugado su código descifrado. Esto podría haber sido # Optimizado.

Zylviij
fuente
Tienes que definir realmente atambién. Entonces eso debe agregarse en la longitud del código.
Optimizador
Desafortunadamente, el backend conserva las variables a través de restablecimientos, por lo que puede definir / inicializar auna vez y olvidarse de él, pero si cierra la pestaña / ventana y vuelve a él, no creo que funcione más. Es por eso que tuve que agregar el bit if (inicio) en el mío.
krs013
1
puede usar var a=a|0;move(a++%4)- 21 bytes
Optimizer
¡Gracias! Nunca he usado javascript antes, así que
cometeré
En realidad, A no necesita ser definido. A se define en el backend, por lo que puede hacer referencia a él usando asin hacer nadavar a
Sam Weaver
1

Percha - 20 bytes

Puntuación oficial: 224.87 - 2do lugar por 0.35 puntos

Este bot usa el enfoque hacia abajo, izquierda, abajo, derecha, pero con la característica inusual de que nunca se moverá hacia arriba. No estoy seguro de cómo calificar los casos donde se cuelga y no se completa, o si el hecho de que eso ocurra lo hace ilegal. Aquí está, sin embargo:

b=b|0;move(b++%4||2)
OR
move(startup++%4||2)

Patrón de inicialización gracias a @Optimizer.

En mis 3 pruebas, obtuvo 4284, 6352 y 4232, para un promedio de 4956. Actualizaré cuando se ejecute la prueba oficial.


Versión alternativa que se cuelga (27 bytes):

b=b|0;move(b++%4||b%997&&2)
isaacg
fuente
No es necesario que te cuelgues, la puntuación solo se medirá allí como si el juego hubiera terminado.
Sam Weaver
¿Cómo sale el último de la horca?
krs013
@ krs013 El último se moverá hacia arriba una vez cada 4 * 997 ciclos, por lo que si la única forma de moverse es hacia arriba, se moverá hacia arriba.
isaacg
Gotcha Me preguntaba si era algo así; Supongo que no esperé lo suficiente.
krs013
Puntuación Final: 224.87, ¡buen trabajo!
Sam Weaver