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).
fonte
Respostas:
GreedySlime
Simplesmente faz o movimento que produz o maior ganho líquido de unidades de lodo.
Note que este é escrito em Python 2.x .
Execução de exemplo (usando o exemplo fornecido na descrição do desafio e assumindo que o código seja salvo em um arquivo chamado
slime.py
):fonte
Azul raso
O raso azul tenta descobrir o que pode acontecer no futuro, fazendo uma
n exaustivabusca em árvore de possíveis movimentos; infelizmente, ele não avança mais que o próximo turno. Depois, ele bate uma pontuação meio-boba em cada possível estado do conselho depois do próximo turno, calcula uma pontuação para cada ramo individual com uma fórmula igualmente ridícula e: voila, o movimento ideal é conhecido!EDIT: O código original foi executado muito lentamente, então eu o modifiquei para que ele pegue apenas uma amostra aleatória de todos os movimentos possíveis. Ele tentará quase todos os movimentos quando houver poucos movimentos possíveis e uma porcentagem menor quando houver mais movimentos possíveis.
fonte
Saltador
Gosta de pular, ainda mais no meio.
Passará se nenhum lodo puder pular.
C ++ , deve compilar simplesmente com
g++ jumper.cpp -o jumper
Roubei sua verificação de movimento, desculpe. Também desisti das práticas corretas de codificação logo após o início, por isso não olhe. No entanto, parece funcionar em qualquer tamanho de placa.
fonte
DeathSlime :
Descrição : Tenta caçar o inimigo mais fraco e destruí-lo. Repetir.
Como executar : ruby DeathSlime.rb
Versão Ruby : 2.1.2
fonte
Líquen
Este é um bot escrito em R. Ele precisa ser acionado usando
Rscript Lichen.R
.O algoritmo pretendido é que ele tenta cobrir uma área retangular (preenchendo o espaço em branco usando
spread
). Quando o retângulo está completo,merges
os dois slimes em um de seus cantos (o mais distante do canto do quadro) expandem a área "habitável" e preenchem esse retângulo recém-definido etc. Ele não usajump
.Se um inimigo estiver na área habitável e também houver um espaço vazio na área, ele preencherá o espaço vazio ao lado dele. Se o lodo que deve ser fundido ao expandir a área habitável estiver cercado por inimigos, então um lodo será apenas em
spread
vez deste fundido.fonte
0 0 0 0
quando não há lodo a bordo.CornerSlime
Esse lodo tem uma noção de cantos, ou pelo menos quando o escrevi pela primeira vez em C #, não tenho mais certeza.
Escrito em C ++, presumivelmente compilará bem com o gcc e quase sem argumentos; espero que eu não tenha usado nada específico da MSVC por acidente.
Testado exclusivamente contra ele próprio em um servidor modificado (nenhum compilador C ++ novo e sofisticado onde estou), por isso não tenho idéia de como ele será executado, espero que não seja desqualificado por ser muito lento. No momento, não há aleatoriedade neste bot, mas posso adicionar alguns posteriormente.
Isso é portado em C # para C ++ (devido a preocupações de velocidade) por alguém que realmente não conhece C ++ e é horrível. Começa construindo uma matriz de células, que depois preenche todo o tipo de informações inúteis sobre as células ao seu redor (número de minhas células, número de meus slimes, esse tipo de coisa). Em seguida, ele usa essas informações para decidir se precisa examinar mais de perto as informações usadas para criar essas informações e, em seguida, potencialmente usa essas informações para produzir uma saída significativa.
fonte