EDIT: Recentemente, minha pergunta foi proposta como uma duplicata do 2048 Bot Challenge . Eu gostaria de enfatizar que esta pergunta é diferente da pergunta e exigirá que as respostas sejam pensadas de maneira diferente da pergunta. O 2048 Bot Challenge pediu ao usuário que criasse um bot, que seria executado por uma hora, com a maior pontuação sendo a pontuação do usuário. Além disso, tinha um limite de 555 bytes. Meu desafio executa o código com muito menos frequência, apenas 3 vezes. Sua pontuação é calculada usando a pontuação média dessas três vezes e dividindo pelo comprimento do caractere do seu código de golfe. Minha pergunta incentiva as entradas a serem "mais inteligentes" e não tentar obter a pontuação mais alta por força bruta.
-
EDIT: O método get foi alterado para getTile, para evitar conflitos com a palavra-chave JS get. Além disso, uma seção de pontuação alta foi adicionada.
Recentemente, criei um site que permite que o popular jogo 2048 seja controlado usando JavaScript. Meu site está vinculado aqui:
Quão:
Um Ace Editor está localizado acima do quadro. Você coloca um código nele, que é executado uma vez a cada 250 ms ou 4 vezes por segundo. Isso é chamado de ciclo.
Use os seguintes métodos para controlar o quadro. Você não pode usar as teclas de seta.
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
As seguintes variáveis são definidas para sua conveniência:
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
Regras:
- Sem aleatoriedade, você deve usar a lógica. (Sim, eu sei que o código de exemplo usa aleatoriamente.)
- Não há conexão com as funções do jogo ou trapaça de outras maneiras
- Geralmente, tente chamar apenas um método de movimentação por ciclo. Tudo bem se você usar mais, mas estraga a animação
- O tabuleiro deve começar em um estado aleatório, sem modificação do estado pré-jogo
- Você deve fornecer a versão descompactada e golfada do código em sua postagem.
- Você deve fornecer um link para o site que já carrega a versão não compactada do seu código, veiculada via PasteBin (por exemplo, ... thatcoolidea.com/2048?i=pH18GWtu carrega o código de exemplo.)
Pontuação:
- Seu código será pontuado por mim.
- A parte A da sua pontuação é uma média de 3 execuções do código, arredondadas para baixo.
- A parte B da sua pontuação é o comprimento do caractere do seu código de golfe.
- Sua pontuação final é a parte A dividida pela parte B
O vencedor terá seu código imortalizado como o código de exemplo no site, se desejar, e reconhecido em um comentário no código.
Boa sorte! Espero que você goste do desafio.
Pontuação máxima atual 225.22 - Freezer - user3217109
fonte
Respostas:
Sinker / Shaker, 65 bytes
Aqui está o meu . É tão cego e simples quanto eles vêm.
Descompactado (ish) ...
Tudo o que faz é repetir para baixo, direita, baixo, esquerda, etc. e bate uma vez se ficar preso. Nem sempre funciona muito bem, mas ocasionalmente recebe 512s. Minha pontuação mais alta durante os testes foi de 7520.
fonte
Semáforo -
2321 bytesEste é o link.
Isso se moverá alternadamente para cima e para a direita, exceto quando o quadro permanecer parado nos últimos dois movimentos, caso em que se moverá para baixo e para a esquerda, respectivamente.
Meu envio original, funcionalmente equivalente, tinha 23 bytes e marcou 182,72:
fonte
Hidromassagem -
372117 bytes - Pontuação: 211.22Eu decidi ir com uma abordagem "menos é mais". Meu código é um design simples que tenta subir, direita, baixo, esquerda ... Vou trabalhar em uma IA de aprendizado para ver uma maneira mais ideal de abordar o quebra-cabeça.
O otimizador ajudou a diminuir
a
a inicialização.Sam ajudou a encurtar
a
a inicialização, removeuvar
.Ungolfed?
Minha pontuação máxima com este AI é 5120.
Congelador - 12 bytes - Pontuação: 225.22
Este bot tem prioridade de movimentação. Ele tenta subir. Se pode subir, dá certo. Se não pode dar certo, cai. Se não puder descer, vai para a esquerda.
Explicação de James Bond
O código criptografado descriptografa para dizer:
O otimizador deveria ter jogado seu código descriptografado. Isso poderia ter sido # otimizado.
fonte
a
. Portanto, isso deve ser adicionado no comprimento do código.a
uma vez e esquecê-lo, mas se você fechar a guia / janela e voltar a ele, acho que não funcionará mais. É por isso que eu tive que adicionar o bit if (inicialização) no meu.var a=a|0;move(a++%4)
- 21 bytesa
sem fazervar a
Cabide - 20 bytes
Pontuação oficial: 224,87 - 2º lugar por 0,35 pontos
Este bot usa a abordagem para baixo, esquerda, baixo, direita, mas com o recurso incomum de que nunca subirá. Não tenho certeza de como classificar os casos em que ele trava e não é concluído, ou se o fato de que isso ocorre a torna ilegal. Aqui está, no entanto:
Padrão de inicialização graças ao @Optimizer.
Nas minhas 3 execuções de teste, obteve 4284, 6352 e 4232, para uma média de 4956. Eu atualizarei quando o teste oficial for executado.
Versão alternativa que fica paralisada (27 bytes):
fonte