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 .