Introdução
Você está preso em uma ilha deserta com alguns empregados e está caçando tesouros. Quanto mais se procura, mais tesouros se encontra. Quanto menos pessoas pesquisando, mais cada pessoa encontra.
Devido ao suprimento limitado, o líder decidiu que poucas pessoas, até um quarto do grupo, serão deixadas para morrer a cada noite. Ele decidiu não contar a ninguém exatamente quantas pessoas morrerão em um determinado dia antes do tempo.
Você está no controle de um pequeno grupo de 5 pessoas, que devem sair do acampamento para encontrar um tesouro para você.
Objetivo
O objetivo desta competição é acumular o máximo de tesouros possível. A cada turno em que seus servos não tentarem voltar ao acampamento, encontrarão um certo número de peças de tesouro. Seus servos podem retornar ao acampamento em momentos diferentes.
A cada turno em que um trabalhador fica de fora em busca de tesouros, ele encontra 1+R
peças do tesouro, onde R
está o número de trabalhadores (de todos os bots) que já estão de volta ao campo. Os bots mortos não são considerados neste cálculo.
No início de cada dia, um número aleatório ( n
) de 2
a max(3, floor(num_live_players/4))
será escolhido. (Para 10 jogadores no dia 1, isso é 2
para max(3,50/4)=12
. Para 20 jogadores no dia 1, isso seria 2
para max(3,100/4)=25
.) Esse número representa o número de jogadores que serão deixados para morrer naquele dia e não serão entregues ao seu programa. .
Se um servo for uma das últimas n
pessoas a retornar, ele / ela morrerá e não poderá transferir o tesouro que encontrou para sua posse. Além disso, o servidor não poderá participar da caça ao tesouro pelo resto da aventura.
Sua pontuação final é a quantidade média de tesouros que você obteve por aventura (corrida do controlador).
Se mais pessoas tentarem voltar ao acampamento no mesmo turno do que as vagas abertas, números aleatórios determinarão quem entra e quem morre.
Um dia nesta ilha, do nascer ao pôr do sol, dura 30 turnos. Como existem muitos animais perigosos à noite, a falta de retorno ao pôr do sol significa que você não poderá entrar no acampamento.
Entrada / Saída
Seu programa deve ser executado durante toda a simulação.
No início da simulação, INDEX I
será inserido, onde I
está o índice do seu bot (este índice é contado de 1 em diante).
No início de cada dia, START_DAY D/N
será inserido o seu programa, onde D
é o número do dia (a partir de 1
) e N
é igual a max(3, floor(num_live_players/4))
, que é o número máximo de pessoas que podem morrer naquele dia em particular.
No início de cada turno, START_TURN T
será inserido o seu programa, onde T
está o número do turno (a partir de 1
).
Depois que o programa receber isso, ele deverá responder com uma lista dos movimentos de seus servidores, cada um separado por vírgula.
Movimentos válidos são:
R
: Tente retornar ao acampamento.S
: Fique procurando um tesouro.N
: Servo já está morto ou no acampamento.
Digitar uma jogada inválida será interpretado como S
se o bot estivesse vivo e não estivesse no acampamento, ou de N
outra forma.
No final de cada turno, uma sequência deve ser passada para o seu programa:
END_TURN [Turn #] [Bot 1 Moves] [Bot 2 Moves] ...
onde os movimentos de cada bot são separados por vírgulas.
Esses movimentos serão um dos seguintes:
R
: Retornou com sucesso ao acampamento naquele turno.r
: Falha ao retornar ao acampamento naquele turno.S
: Ainda à procura de tesouros.D
: Morreu em um turno anterior.N
: Já de volta ao acampamento.
Bots e servidores permanecem na mesma ordem durante toda a simulação.
Por exemplo:
INDEX 2
....
END_TURN 8 N,N,N,N,N r,r,r,r,D D,D,D,N,R S,D,D,N,D
Aqui, você é o segundo bot ( r,r,r,r,r
), que tentou devolver todos os quatro servidores que ainda estão vivos (e infelizmente falhou nos quatro). Os funcionários do Bot 1 estão de volta ao acampamento. O Bot 3 tem três servos mortos, mais um no acampamento e um quinto criado que retornou com sucesso. Bot 4 tem um servo que ficou (e morrerá, já que este é o último turno do dia), um servo no acampamento e três servos mortos.
Após cada uma dessas cadeias, a menos que uma cadeia que sinalize o final do dia também tenha sido gerada (veja abaixo), seu programa é gerar os próximos movimentos de seus servidores, separados por vírgulas. Todos os servos devem ser considerados (com N
se já estiverem no acampamento e D
se já estiverem mortos). Movimentos inválidos serão tratados como S
se o servidor ainda não estivesse no campo / morto. Exemplo:
N,N,S,S,R
que significa:
Servant # | Action
1 | Do nothing.
2 | Do nothing.
3 | Stay put (keep looking for treasure).
4 | Stay put (keep looking for treasure).
5 | Try to return to camp.
No final de um dia, a seguinte sequência será passada após a END
sequência do último turno , informando a todos sobre quem está vivo:
END_DAY [Day #] [Bot 1 Status] [Bot 2 Status]
onde o status é uma lista separada por vírgula de A
(ativo) ou D
(inativo). O dia seguinte começa imediatamente depois.
A simulação termina quando há menos de 6 servidores ativos. Seu programa receberá a seguinte entrada no final da simulação:
EXIT
Regras / Detalhes
- Somente nos turnos em que sua ação está
S
, você encontrará tesouros. - Número de simulações executadas: 1000 vezes
- Seu programa não deve demorar mais de 1 segundo para determinar as jogadas.
- Seu programa não deve sair mais cedo; será iniciado exatamente uma vez.
- Verifique se o buffer de saída (se aplicável) está nivelado após cada saída.
- Os arquivos podem ser gravados na pasta do seu bot (
./players/BotName/
). O nome do seu bot é o que você chamar, com todos os caracteres não alfanuméricos removidos e gravados no CamelCase. As entradas podem salvar dados entre as execuções do controlador, pois as execuções são feitas seqüencialmente. - Seu programa deve sair após o recebimento
EXIT
. - Programas que não conseguem compilar ou gerar erros ou gerar texto inválido (não no formato de 5 caracteres separados por vírgulas) podem ser excluídos da competição. Uma nova linha deve seguir cada saída.
- O controlador pode ser encontrado no GitHub .
Inclua o nome do bot, idioma + versão, código e comando para compilar (se aplicável) e executar o bot.
Exemplo
O texto produzido pelo programa é prefixado aqui com a >
. Seu programa não deve gerar esse caractere.
INDEX 2
START_DAY 1/3
START_TURN 1
>S,S,S,S,S
END_TURN 1 S,R,S,S,S S,S,S,S,S
START_TURN 2
>S,S,S,S,S
END_TURN 2 S,N,S,R,S S,S,S,S,S
START_TURN 3
>R,R,S,S,S
END_TURN 3 R,N,R,N,R R,R,S,S,S
START_TURN 4
>N,N,S,S,S
END_TURN 4 N,N,N,N,N N,N,S,S,S
START_TURN 5
>N,N,R,R,R
END_TURN 5 N,N,N,N,N N,N,r,r,R
END_DAY 1 A,A,A,A,A A,A,D,D,A
START_DAY 2/3
START_TURN 1
>S,S,N,S,N
END_TURN 1 R,R,R,R,R S,S,D,D,N
END_DAY 2 A,A,A,A,A D,D,D,D,D
EXIT
As pontuações para o exemplo acima são:
Bot# Day 1 Day 2 Total
1 10 0 10
S1 1+2 0 3
S2 0 0 0
S3 1+2 0 3
S4 1 0 1
S5 1+2 0 3
2 20 0 20
S1 1+2 0 3
S2 1+2 0 3
S3 0 0 0
S4 0 0 0
S5 1+2+3+8 0 14
O vencedor é, portanto, o jogador, bot 2. Observe que o vencedor não precisa sobreviver até o fim absoluto. (Observe também que o jogador poderia ter permanecido até o turn 30 no dia 1, pois o acampamento não ficaria cheio até que o jogador enviasse mais um bot de volta).
Pontuações
Bot Score
Bob 2939.422
Statisticians 2905.833
Morning Birds 1652.325
Evolved 1578.285
Slow Returners 1224.318
Wandering Fools 1065.908
Randomizers 735.313
Drunkards 0
Plague 0
Os logs estão disponíveis no GitHub . Os resultados de cada avaliação estão disponíveis nesta planilha do Google .
fonte
Respostas:
Bob - C ++
Compilar:
Para correr:
fonte
Estatísticos, Python 3
Os estatísticos sempre trabalham juntos. No primeiro turno, eles retornam ao campo quando dois terços dos seus oponentes o fazem. Nos turnos subsequentes, eles confiam nos dados que coletaram dos turnos anteriores para prever os hábitos dos outros empregados e tentam retornar ao campo no último momento seguro.
Programa
Como você pode ver, roubei descaradamente a estrutura do programa do @Mike Sweeney.
Comando
EDIT: Corrigido um erro na verificação para voltar para casa. Eles devem ter um desempenho um pouco melhor agora.
EDIT 2: Os estatísticos agora são mais espertos do que antes: eles controlam quais servidores retornaram ao campo no dia atual e ajustam suas previsões de acordo. Além disso, eles correm mais riscos, retornando ao campo quando restam 3/4 do número máximo de servos moribundos. Isso os leva de volta ao topo (por pouco; Bob se tornou muito perigoso).
fonte
Bêbados, Perl 5
Um pouco demais de álcool e eles nunca encontrarão o caminho de volta ao acampamento.
Esta entrada é principalmente um exemplo, mas participará.
Programa
Comando
fonte
$status[$i] eq 'A' ? 'S' : 'D';
seja$status[$i] eq 'A' ? 'S' : 'N';
para atender a especificação?Pássaros da manhã
Deus ajuda quem cedo madruga!!!
Edit: Feito para que qualquer pessoa pudesse subclassificá-lo facilmente. Redefina o
doMove(int playerNumber)
seu próprio bot. Eu adicionei vários campos e métodos úteis. Eu o testei extensivamente. Ele não salva os status das simulações anteriores. Por favor, diga-me se houver algum problema.Ajuntar com:
javac ./players/MorningBirds/MorningBirds.java
Correr com:
java players.MorningBirds.MorningBirds
fonte
R
) em um determinado dia sempre morrerá naquele dia.Randomizadores - Ruby
Apenas para atrapalhar os bots direcionados por estatísticas, os randomizadores são bastante imprevisíveis. Todos eles retornam ao mesmo tempo, de forma aleatória, na tentativa de encalhar os outros.
(Não influenciado por outros jogadores.)
fonte
Tolos errantes, Python 2
Este é um bot simples do Python que envia os servidores até o horário predefinido de "retorno", depois eles tentam entrar no acampamento e permanecer até o dia seguinte.
É também uma estrutura básica para bots mais complexos que outras pessoas podem querer usar. No entanto, ele não foi testado com o mecanismo do juiz; portanto, deixe-me saber se cometi um erro.
Programa
Comando
Editar: código de decisão da ação alterado após o esclarecimento da regra.
fonte
Evoluído
Eu usei Programação Genética (através do JGAP) para fazer este bot. Ele veio com uma resposta simples que supera todos os outros (apenas).
Ajuntar com:
javac players/Evolved/Evolved.java
Correr com:
java players.Evolved.Evolved
Edit: Grrr ... Bob me bagunçou !!!
Edit: Yay !!! Bob, foi morto por uma praga desagradável !!!
fonte
SlowReturners - Ruby
Envia um criado de volta a cada 5 turnos.
fonte
Praga
A peste é uma doença. Não é racional. É previsível. As doenças não podem coletar tesouros, nem se importam com tesouros. A peste deixa outros jogadores doentes. Os sábios ficam em casa e esquecem os tesouros. Os tolos são sempre tolos e nunca receberão muito tesouro. Evoluído é (felizmente) imune à Praga. Ele também é sábio. Ele vai e recolhe tesouros, e não morre.
Ajuntar com:
javac players/Plague/Plague.java
Correr com:
java players.Plague.Plague
Bob e estatísticos agora são resistentes à praga.
fonte