Você é uma bola de lodo. Naturalmente, sendo lodo, você quer escorrer pela maior área possível. Mas existem outros 3 slimes que querem fazer exatamente a mesma coisa. Quem será o lodo superior?
Descrição
Todos os slimes serão reunidos em uma arena. Os juízes (isto é, o programa de controle) farão uma lista exaustiva de todas as combinações possíveis de 4 gosmas, as colocarão nos cantos de uma mesa e observarão para ver qual gosma escorre pela maior área.
Seus slimes podem executar uma das 3 ações a cada turno: espalhar, pular ou mesclar. Uma descrição mais detalhada sobre o que isso significa será fornecida na seção Saída .
Board / Arena
A arena será um tabuleiro quadrado (atualmente 8x8, mas isso pode mudar no futuro). Aqui está um exemplo de arena de um jogo em andamento:
11111222
11111444
11.22444
.1222.4.
333.3244
33333.44
333...44
333....4
Slime é representado pelos números de 1 a 4 (jogadores de 1 a 4) e o espaço vazio é representado por um ponto ( .
). Inicialmente, o tabuleiro começa como todo o espaço vazio, exceto por uma única unidade do lodo do jogador 1 no canto superior esquerdo, jogador 2 no canto superior direito, jogador 3 no canto inferior esquerdo e jogador 4 no canto inferior direito.
As coordenadas são representadas pelo índice de linha e coluna com base em 0, para facilitar a leitura no código. Por exemplo, as coordenadas (3, 6) representam o 7º quadrado na 4ª linha (no exemplo acima, a 4
). (Isso facilita o acesso aos quadrados:. board[coords.x][coords.y]
) Aqui está uma ilustração visual:
(0, 0) (0, 1) (0, 2)
(1, 0) (1, 1) (1, 2)
(2, 0) (2, 1) (2, 2)
Entrada
A entrada do seu programa será qual jogador você é (1, 2, 3 ou 4), uma vírgula ( ,
) e o conteúdo do tabuleiro / arena (com novas linhas substituídas por vírgulas). Por exemplo, se você fosse o jogador 3 no cenário acima, sua entrada seria:
3,11111222,11111444,11.22444,.1222.4.,333.3244,33333.44,333...44,333....4
Resultado
Seu programa deve gerar 4 números inteiros. Os dois primeiros são o índice de linha e coluna, respectivamente, do slime que você deseja mover, e os dois seguintes são o índice de linha e coluna de onde você deseja movê-los.
Você tem três opções em cada turno: Espalhe, pule ou junte.
Espalhar
Para se espalhar, as coordenadas alvo devem estar exatamente a um quadrado do lodo que está sendo movido e o quadrado nas coordenadas alvo deve ter um espaço vazio. Ao espalhar, um novo lodo é criado nas coordenadas de destino e o lodo antigo não é removido. Depois que o novo slime é criado, todos os slimes inimigos nos 8 quadrados ao redor desse novo slime são convertidos no jogador que se moveu.
Por exemplo, com o quadro na Fig. 1, se o jogador 1 produzir
0 1 1 2
, o resultado será o quadro na Fig. 2.1. 2. 11.22 11.12 1..22 1.112 ..22. ..11. ..... .....
Saltar
Para pular, as coordenadas alvo devem estar exatamente a dois quadrados do slime que está sendo movido e o quadrado nas coordenadas alvo deve ter espaço vazio. Ao jupar, um novo lodo é criado nas coordenadas de destino e o lodo antigo é removido. Depois que o novo slime é criado, todos os slimes inimigos nos 8 quadrados ao redor desse novo slime são convertidos no jogador que se moveu.
Por exemplo, com o quadro na Fig. 1, se o jogador 1 produzir
0 1 2 3
, o resultado será o quadro na Fig. 2.1. 2. 11..2 1...2 1...2 1...1 ....2 ...11 ...22 ...11
Mesclar
Para mesclar, as coordenadas alvo devem estar exatamente a um quadrado do slime que está sendo movido, e o quadrado nas coordenadas alvo deve ser o mesmo slime do jogador. Ao mesclar, o lodo antigo é removido. Então, todos os espaços vazios nos 8 quadrados ao redor do slime alvo são convertidos no jogador que se moveu (não incluindo o slime antigo sendo movido).
Por exemplo, com o quadro na Fig. 1, se o jogador 1 produzir
0 1 1 2
, o resultado será o quadro na Fig. 2.1. 2. 11..2 1.112 1.1.2 11112 ....2 .1112 ..222 ..222
Você também pode passar simplesmente emitindo coordenadas inválidas (ex. 0 0 0 0
).
Regras e restrições
Regras adicionais são:
- Você pode ler e gravar arquivos em sua própria pasta para manter os dados (os envios serão armazenados
players/YourBotName/yourBotName.language
), mas não pode modificar ou acessar qualquer outra coisa fora dele. O acesso à Internet é proibido. - Seu envio não pode ser codificado especificamente para ajudar ou prejudicar outro envio. (Você pode ter vários envios, mas eles não devem interagir especificamente entre si de forma alguma.)
- Seu envio não deve demorar mais de 0,1 segundos por turno. Se o seu envio demorar 0,105 segundos ocasionalmente, tudo bem, mas isso pode não demorar significativamente mais do que esse limite de tempo. (Isso é principalmente uma verificação de sanidade para evitar que os testes demorem muito tempo).
- Seu envio não deve ser uma duplicata exata (ou seja, usar exatamente a mesma lógica) de outra, mesmo que esteja em um idioma diferente.
- O envio deve ser sério. Isso é baseado em opiniões, mas se a sua inscrição claramente não estiver tentando resolver o desafio (por exemplo, se você passar a cada turno), será desqualificada.
Se o seu envio quebrar alguma dessas regras ou não seguir a especificação, será desqualificado, removido playerlist.txt
e o jogo será reiniciado desde o início. Se o seu envio for desqualificado, deixarei um comentário no seu post explicando o porquê. Caso contrário, seu envio será adicionado à tabela de classificação. (Se você não vê sua submissão no placar, não tem comentários explicativos sobre sua postagem e postou sua submissão antes da hora da "Última atualização" abaixo, diga-me! Talvez eu tenha ignorado isso inadvertidamente.)
Na sua inscrição, inclua:
- Um nome.
- Um comando shell para executar o seu programa (por exemplo,
java MyBot.java
,ruby MyBot.rb
,python3 MyBot.py
, etc.).- Observe que a entrada (seu player e mapa) será anexada a isso como um argumento de linha de comando.
- Os programas serão testados no Ubuntu 14.04, portanto, verifique se o seu código pode ser executado (livremente) nele.
- Um número de versão, se o seu código funcionar de maneira diferente em versões diferentes do seu idioma.
- O código do seu bot.
- Instruções sobre como compilar o código, se necessário.
Código / teste do controlador, exemplo bot
O código do controlador está escrito em C ++ e pode ser encontrado no Github . Mais instruções sobre como executar e testar seu código podem ser encontradas lá.
simplebot.rb
, um bot muito simples que espalha ou salta um lodo aleatório para um local aleatório a cada turno também é publicado no Github .
Pontuação e placar
Quando todos os quadrados do tabuleiro estão preenchidos, o jogo termina e as pontuações são calculadas. A pontuação final de um jogador é a quantidade de quadrados que contêm seu lodo no final do jogo. Se já passaram 2000 turnos (500 para cada jogador) e o jogo ainda não acabou, o jogo terminará assim mesmo e as pontuações serão relatadas como se o jogo tivesse terminado.
No final do torneio, a pontuação de todos os jogos será calculada em média para calcular a pontuação final de cada jogador, que será publicada na tabela de classificação. Não há prazo para envio; Continuarei atualizando a tabela de classificação periodicamente à medida que novos envios forem recebidos.
São necessários 4 envios até que um cabeçalho real apareça.
+--------------------------+-----------+--------------------+
| Name | Avg Score | Last Updated (UTC) |
+--------------------------+-----------+--------------------+
| GreedySlime | 47.000 | Jul 22 10:27 PM |
| Jumper | 12.000 | Jul 22 10:27 PM |
| ShallowBlue | 5.000 | Jul 22 10:27 PM |
| Lichen | 0.000 | Jul 22 10:27 PM |
+--------------------------+-----------+--------------------+
Última atualização: 22 de julho às 22:27 (UTC).