Distanciamento para 4 homens
Descrição
Você de alguma forma se viu em um impasse de quatro vias. Uma arma carregada repousa em suas mãos e algumas granadas estão presas no seu cinto.
O objetivo é ter mais saúde ao final de um impasse. Um impasse termina quando no máximo uma pessoa tem uma quantidade positiva de saúde.
Cada jogador tem vida 5
e morre quando a saúde cai para / abaixo 0
. O turno em que um jogador morre é o último turno em que um jogador pode sofrer dano.
Se houver um jogador ao vivo no final de um impasse, esse jogador vence. Caso contrário, o jogador com menos pontos de vida negativos ganha.
Ações
Atirar : Atire em alguém.
2
dano se atirar em um inimigo vivo0
dano se atirar em um inimigo mortohealth_at_start_of_turn+2
danos se atirar em si mesmo. (Observe que isso deixará você com mais-2
saúde.)- Se um inimigo atirar em você no mesmo turno em que você se atirar, você terminará o impasse com -4 de vida (você ainda recebe dano de outros jogadores no turno em que se mata).
- Sua ação no turno seguinte será ignorada (e presumida
Nothing
).
Esquivar : Tente desviar do tiro de um único oponente.
Prepare : Solte sua granada e prepare-se para jogá-la.
- Você só tem três turnos para jogá-lo antes de ser explodido (
6
dano a si mesmo,3
dano a todos os inimigos vivos) - Morrer com uma granada não jogada é equivalente a não jogar a granada por três turnos.
- Você só tem três turnos para jogá-lo antes de ser explodido (
Jogue : jogue a granada em direção a alguém e torça pelo melhor.
- O alvo recebe
8
dano se estiver vivo - Todos os outros (inclusive você) recebem
3
dano se estiverem vivos
- O alvo recebe
Nada : fique parado por um turno e observe todos morrerem.
Entrada
Seu programa receberá as seguintes informações:
- A saúde de cada jogador
Uma lista de ações realizadas por esse jogador desde o início do confronto Abaixo está o formato das informações passadas por jogador:
[Health],[Action 1],[Action 2],[Action 3],...
As ações serão dadas no formato especificado na seção Saída .
Você receberá 4 dessas strings, separadas por um espaço, e transmitidas como um único argumento. A ordem dessas seqüências de caracteres é:
[Player Info] [Opponent 1 Info] [Opponent 2 Info] [Opponent 3 Info]
As cadeias são passadas como o segundo argumento. O primeiro argumento contém um número inteiro que identifica exclusivamente o impasse que está sendo promulgado. É garantido que os impasses entre o mesmo conjunto de jogadores não sejam simultâneos. No entanto, vários impasses serão ocorrer ao mesmo tempo.
Por exemplo:
$./Player.bash 5 "3,S2,N 5,P,N 3,S0,N -2,S3,N"
Atualmente, o jogador e o segundo oponente têm 3 pontos de vida, o primeiro adversário tem 5 pontos de vida e o terceiro oponente tem -2 pontos de vida e está morto.
No primeiro turno:
- Jogador 1 atirou no inimigo 2
- Inimigo 1 preparou uma granada
- Inimigo 2 atirador
- O inimigo 3 atirou em si mesmo
No segundo turno:
- Todos os jogadores não fizeram nada. (O jogador e o inimigo 2 não podem fazer nada desde que atiraram no turno anterior. O inimigo 3 está morto: ele fará
Nothing
o resto do impasse.)
O segundo argumento no início de um impasse é: 5 5 5 5
.
Resultado
Um comando deve ser emitido no formato listado abaixo. Uma saída inválida é interpretada como 'Nothing'. Um comando que requer um alvo deve ser seguido por um número inteiro ( 0-3
, 0
representando o jogador e 1-3
representando os inimigos 1-3).
S[target]
: Dispara no alvo.D[target]
: Tenta se esquivar [alvo].P
: Prepare uma granada.T[target]
: Jogue a granada em [alvo].N
: Fazer nada.
Um comando que precisa de um alvo, mas é alimentado com um alvo que não está entre 0
e que 3
não é alimentado inteiramente com um alvo será assumido como alvo0
(o jogador).
Pontuação
No final de cada impasse, os jogadores recebem uma pontuação calculada pela seguinte fórmula:
35 + health at end of standoff
No caso em que um jogador termina um impasse com a saúde negativa, eles vão receber uma pontuação abaixo de 35 . Os seguintes pontos também são recompensados como um bônus:
- Mais saúde: +4 pontos
- Segundo maior número de pontos de vida: +2 pontos
- Terceiro maior número de pontos de vida: +1 ponto.
Em caso de empate, o bônus mais baixo é concedido (se duas pessoas empatarem com mais pontos de vida, ambos receberão +2; se houver 3 pessoas com mais pontos de vida, +1 e se todos terminarem igualmente, +0).
A pontuação final é determinada calculando a média de todas as pontuações individuais.
Regras / Detalhes
- A ordem dos eventos dentro de um turno é a seguinte:
- Todos os jogadores fazem suas ações.
- Jogadores com 0 ou menos pontos de vida morrem.
- Granadas não lançadas que precisam explodir, explodirão (jogadores que acabaram de morrer ainda estão feridos, pois ainda é a vez em que eles morreram).
- Nenhuma colaboração entre entradas.
- Três * standoffs ocorrerão entre cada conjunto de 4 jogadores. (A ordem dos jogadores pode variar a cada impasse).
- As entradas que consumirem quantidades excessivas de memória do espaço em disco serão desqualificadas.
- Ler ou modificar arquivos que não sejam da sua entrada desqualificará a sua entrada.
- Um caminhão, dirigido por um bêbado, atropelará todos os jogadores vivos após o
50th
turno, se o impasse ainda não tiver terminado no final do50th
turno.- Este caminhão causa 20 de dano a todos os jogadores ao vivo.
- Os impasses ocorrem rapidamente. Os programas são cortados após 1 segundo.
- Seu programa será chamado a cada turno, mesmo depois que você morrer.
- Você pode ler ou gravar arquivos apenas em seu diretório (se sua entrada for JohnDoe, você poderá salvar arquivos no diretório players / JohnDoe /); no entanto, esse NÃO será o diretório atual enquanto o script estiver em execução.
- Os impasses ocorrerão em uma máquina executando o Arch Linux (versão 2014.08.01).
O controlador está disponível no GitHub .
Inclua o seguinte em sua postagem:
- Um nome para o seu bot
- Um comando shell para executar a entrada bot (ex.
java Doe.java
) Será passado pela linha de comando como um único argumento (java Doe.java 5 "-2,S0 -2,S1 -2,S2 5,N"
) - Código do seu bot
- Como o bot deve ser compilado (se aplicável)
- Idioma (e versão, se aplicável, especialmente para python)
* O controlador está demorando muito para seis.
Placar
Observer 43.280570409982
MuhammadAli 43.134861217214
Osama 43.031983702572
LateBoomer 42.560275019099
SimpleShooter 42.412885154062
LessSimpleShooter 42.3772
Neo 42.3738
Scared 42.3678
Richochet 42.3263
Equivocator 42.2833
TwentyFourthsAndAHalfCentury 42.2640
Darwin 42.1584
HanSolo 42.1025
Coward 42.0458
ManipulativeBastard 41.8948
Sadist 41.7232
Aggressor 41.7058
CourageTheDog 41.5629
Grenadier 40.9889
Bomberman 40.8840
Spock 40.8713
Sniper 40.6346
DONTNUKEMEBRO 39.8151
PriorityTargets 39.6126
Hippolyta 39.2480
EmoCowboy 39.2069
Zaenille 39.1971
AntiGrenadier 39.1919
PoliticallyCorrectGunman 39.1689
InputAnalyzer 39.1517
Rule0Bot 39.1000
BiasedOne 39.0664
Pacifist 39.0481
StraightShooter 39.0292
Ninja 38.7801
MAD 38.2543
Monkey 37.7089
Label1Goto1 36.2131
Generated: 2014/08/22 03:56:13.470264860 UTC
Logs: no GitHub
fonte
Respostas:
Observador
Esse cara analisa seus inimigos. O objetivo é sobreviver até que apenas um oponente "agressivo" seja deixado e depois matá-lo em um impasse épico.
Compilar:
javac Observer.java
Executar:java Observer arg0 arg1
fonte
!player.contains("S" + id)
essa é uma condição necessária na função "isAggressive"? Um jogador suicida estará morto de qualquer maneira #Granadeiro
As armas são superestimadas. O verdadeiro impasse de um escocês é assim:
Embora isso pareça trivial, provavelmente não é uma estratégia terrível . Desde armas e granadas ambos têm um ciclo de dois por sua vez, este é de longe o mais eficiente 1 maneira de causar dano.
Claro, se todos os três oponentes atirarem em mim no primeiro round, não é bom. Mas também não haveria muito mais.
Compile / execute da maneira Java padrão:
1 nota de rodapé sem sentido
fonte
Regra número 0 de Asimov Bot - Python
Bem direto, ele atacará o primeiro jogador que vê segurando uma granada para proteger a maioria dos humanos. Se ninguém é uma ameaça para a maioria dos humanos, ele não fará nada.
Execute-o como:
fonte
Han Solo - Python
Han atirou primeiro. Nesse caso, ele atirará primeiro escolhendo o alvo mais próximo vivo.
Execute-o como:
Nota : Esta é a primeira coisa que escrevi em Python. Portanto, se você encontrar alguma prática incorreta específica para python, entre em contato.
fonte
is_alive
EmoCowboy
Por que esperar para morrer? Apenas se mate agora. Esperemos que o resto dos tolos exploda um ao outro até muito menos que -2.
A pontuação será normalmente -2. Às vezes, -4, se as pessoas decidirem me matar. Raramente mais do que isso, o que significa que isso deve superar várias das inscrições atuais.
Pitão
EDIT: Isso não é uma piada, e é geralmente por isso que essas submissões de emo são desaprovadas. Esta é uma estratégia legítima. Estar vivo é mortal!
fonte
Pacifista
Ele é um cara de verdade, apenas foi pego pela multidão errada.
Execute como
runghc pacifist.hs
, mas convém compilá-lo com -O3 se a eficiência for um problema.fonte
-O3
faz uma diferença.runghc
lado. Na verdade, é 10 vezes mais lento na minha caixa Linux.Macaco - Python (Primeira entrada!)
Macaco vê macaco faz. Repetirá exatamente a última ação executada por um jogador aleatório.
Pode ser executado assim: "python monkey.py args" Não são necessárias etapas extras.
fonte
-1
diretamente.argv[2]
obter a história dos jogadores.Simple Shooter - Perl (bug corrigido)
Este bot atira no oponente com mais vida. É uma estratégia muito simples, mas acho que tem uma chance decente de realmente se sair bem.
Isto é como executá-lo usando algum exemplo de entrada:
fonte
Spock, em Python 3.x
Esse código é mais um experimento embora (daí o nome de Spock porque ... ele é vulcano, e eles são muito bons nesse tipo de coisa), mas foi divertido construí-lo. O principal raciocínio por trás de todo esse código são suposições que um ser lógico e bom, como Spock, faria, se fossem dadas as regras do jogo:
O objetivo deste jogo é maximizar a pontuação, o que seria feito por todo mundo parado, o que não é possível, devido ao caminhão.
A maneira como Spock joga no resto do jogo pode ser resumida por sua famosa citação: " As necessidades de muitos superam as necessidades de poucos ". Em outras palavras, Spock precisa garantir que o menor dano seja sofrido, matando aqueles que o fazem. Como ele faz isso:
O raciocínio é que, ao atingir os jogadores mais fracos, estamos encerrando as fontes de dano. O raciocínio por trás das granadas é que elas disparam independentemente e causam menos dano se não forem jogadas.
E assim esse bot funciona. Não testei extensivamente quanto a falhas de entrada (por favor, avise-me se algo der errado), mas estou confiante de que resolvi a maioria dos problemas. Baseei uma pequena parte do código do bot HanSolo, mas na maioria das vezes é uma bagunça de código emaranhada. Desfrutar.
Execute-o como:
12-08-2014 - Pequenas correções de erros em relação à detecção de granadas
14/08/2014 - Pequenas correções de erros em relação ao final do jogo, graças a isaacg por apontá-lo antes
fonte
Traceback (most recent call last):
File "./players/Spock/Spock.py", line 87, in <module>: Endgame(current_turn)
File "./players/Spock/Spock.py", line 79, in Endgame: if IsTarget(player, target_health):
File "./players/Spock/Spock.py", line 4, in IsTarget: return int(player[1].split(",")[0]) < target_health
TypeError: unorderable types: int() < str()
player[1][1]
deveria serint(player[1][1])
.Atirador politicamente correto
Muito politicamente correto, pois não discrimina nada. Portanto, não é muito inteligente.
Realmente não importa quais argumentos são passados para ele.
python politicallycorrectgunman.py
fonte
random.choice(array)
?Straight Shooter
Ele é uma parte treinada da cavalaria e fala em vários idiomas, mas, sendo cintilante, o Straight Shooter só pode ver o inimigo à sua frente. Sendo um cavalo, ele não entende que você precisa esperar entre os tiros.
Perl, Python 2/3, Ruby: este cavalo é realmente uma entrada poligonal.
Para uma resposta que tenha um pouco mais de pensamento (e algum paradigma funcional), veja: Vigésimo quarto e meio século .
fonte
Anti-granadeiro
Granadas são ruins. Muito mal. Portanto, se alguém está preparando um, a melhor coisa a fazer é matá-lo. Caso contrário, apenas sairemos.
fonte
Ricochet - Perl
Estratégias simples parecem funcionar decentemente neste desafio, então aqui está outro. Atira em um jogador vivo aleatório. Ele tem o recurso adicional de cometer suicídio no final para evitar o caminhão.
Execute assim:
fonte
Agressor
Puxa na primeira rodada, atira no oponente com maior vida útil na segunda rodada, atira no oponente com maior vida útil a partir de então.
Execute isso como ./agg ID "5 5 5 5".
fonte
Ninja
Apenas esquiva aleatoriamente tentando evitar ser atingido.
correr como
Args são desnecessários, mas podem ser adicionados sem problemas.
fonte
Nome : PriorityTargets
Comando Shell : ruby PriorityTargets.rb 5 [game_state]
Língua : Ruby V2.1.2
Descrição : o PriorityTargets tenta encontrar estilos de reprodução comuns. Ele então decide, com base nesses estilos de jogo, quem ele quer atacar e qual arma usar.
Nota : Submissão do First Code Golf! Muito maior do que os outros envios, porque fiquei um pouco louco.
fonte
Covarde - Perl
Atua de maneira muito covarde. Quando se sente saudável, escolhe um inimigo que não se sente assim e atira nele. Pontos de bônus para os inimigos que estavam atirando no último turno (porque eles sabem que estão fazendo
Nothing
esse turno e, portanto, são absolutamente indefesos). Quando ele não se sente tão bem, ele corre para se esconder, para matar alguém ocasionalmente.Código Perl bastante padrão; salve-o em algum arquivo e execute
perl file argument argument [...]
. Eu verifiquei a sintaxe e estava tudo bem, então espero não ter problemas com isso.E: eliminou o potencial de divisão por 0 erro.
fonte
Bomberman
O bot escrito em R, na linha de comando, deve ser:
Rscript Bomberman.R arg0 arg1
percebi que, depois de começar a escrever esse bot, o Geobits já fez um granadeiro, mas acho que o meu é significativamente diferente, pois verifica sua saúde acima de 3 antes de preparar uma granada e o joga no último atirador primeiro e o segundo mais saudável, e se sua saúde estiver abaixo de 3, ele desviará do jogador perigoso (nem morto nem atirador na última rodada) ou atirará em um dos jogadores restantes.
Editar
Parece haver algum problema de comunicação entre esse bot e o seu controlador, pois todos os logs que eu olhei mostraram que meu bot apenas produzia
N
. Então, aqui está o mesmo bot, mas reescrito em Python, na esperança de que, se este também tiver um problema de comunicação, alguém o veja.Para ser chamado com
python Bomberman.py arg0 arg1
.fonte
Neo
Desvie de um jogador vivo que não atirou no último turno. Se todo mundo vivo atirou no último turno, atire em um jogador vivo aleatório. Suicídio quando você vê faróis.
Não espero muito desse cara contra atiradores de granadas, mas contra atiradores pode funcionar muito bem. Veremos.
fonte
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.charAt(String.java:658)
at Neo.main(Neo.java:17)
Século XXI e Meio
Essa entrada do Python se esquiva até que apenas jogadores passivos ou um único jogador agressivo permaneçam e depois começam a atirar. Ela espera que um marciano que esteja passando cuide de granadeiros e caminhoneiros bêbados.
A menos que eu tenha feito algo errado, isso é Python funcional. Certamente não se parece com o tipo de Python que escrevi antes de Haskell e seus amigos me encontrarem, e acho que não mudei nada. Mas se você souber melhor, por favor, me diga.
Correr como:
fonte
Assustada
Esta submissão tem medo de todos. Mas é especialmente assustador para algumas pessoas. Então, descobre quem é o mais perigoso e atira neles. Se vários inimigos parecerem os mais perigosos, ele atira aleatoriamente.
Este é python (2 ou 3, o mesmo resultado em qualquer um.) Salve como
scared.py
, execute compython3 scared.py
fonte
Bastardo manipulador - Python
Prepara e lança granadas. Se ele acha que não há tempo ou há poucos inimigos, ele atira. Se ele está sozinho, ele tenta enganar o outro cara.
fonte
Osama
Eu venho tentando isso há um dia ou mais, agora é hora de postar e ver como os outros evoluíram nesse meio tempo.
Compile com
ghc -O2 osama.hs
e execute usando./players/Osama/osama
.fonte
Sniper - Lua
No primeiro turno, ele atirará em uma pessoa aleatória e, em seguida, atirará em qualquer jogador que possa matar (2 ou 1 ponto de vida). Se nenhum deles funcionar, ele tentará atirar no jogador que atirou por último, caso contrário, atirará em um jogador aleatório. Correr com
lua Sniper.lua
fonte
lua Sniper.lua 3 "5,S1 3,D3 5,N 5,P"
,. Pode ser necessário verificar seuarg
índice.lua: ./players/Sniper/Sniper.lua:38: attempt to compare nil with number
stack traceback:./players/Sniper/Sniper.lua:38: in main chunk
[C]: in ?
Darwin
A sobrevivência do mais apto significa que os menos saudáveis devem morrer.
Fundamentação
Olhando para o lote de resultados da terça-feira (12), parece haver três grupos distintos: sobreviventes; o efetivamente suicida; e o pior que o inútil. Os sobreviventes compartilham estratégias simples baseadas em tiro. Enquanto alguns outros bots ( Spock , Coward ) terão como alvo o inimigo menos saudável, eles também complicam suas estratégias com outras ações. Este não. Como o Simple Shooter , ele tem uma definição clara do alvo e o mantém implacavelmente. Será interessante ver onde ele se encaixa nos resultados.
Esta é uma versão simplificada e levemente modificada do meu século XXI e meio anterior e compartilha sua invocação:
fonte
Zaenille - C
Prioridades:
Ajuntar com
gcc <filename.c>
.Corra com
./a.out <parameters>
.fonte
InputAnalyzer
A chave de um jogo como esse é analisar como todos os seus oponentes estão jogando para responder de acordo. Meu bot fará exatamente isso usando algoritmos complicados que resultarão no uso de meus oponentes, para minha vantagem, dando uma vitória decisiva!
Edit: Eu agora
Compile o bot com o seguinte comando (Precisa ter o ghc)
O comando Shell para executar deve ser o seguinte
Nota: Eu testei no Windows, por isso, se você tiver algum problema em relação à conformidade / execução, diga-o nos comentários e farei o possível para descobrir o comando correto.
fonte
Cão chamado Coragem
Primeira coisa - atire nos bandidos à vista. Esquive-se aleatoriamente até que alguém prepare uma granada. Então, quando todos atirarem nele, prepare minha própria granada e jogue-a em alguém. Mas o homem da distração.
Edit: Agora implementado como eu pensei que deveria ser. Antes, a pontuação era: 35,9
Atualizado: às vezes atira em vez de esquivar
couragethedog.py
Correr como
fonte
MAD - Java
O bot da MAD confia no poder da intimidação através da destruição mútua garantida . Sempre que ele não tem uma granada pronta, ele prepara uma. Ele então esquiva possíveis artilheiros até que alguém tente causar dano a ele ou sua granada esteja prestes a explodir. A partir do momento em que é atacado, ele lança granadas para quem tentou causar mais danos a ele neste jogo até agora. Se sua granada está prestes a explodir, ele bombardeia o jogador principal. MAD não é contra atirar em alguém quando não há nada para se esquivar ou atirar diretamente uma granada e sua granada ainda é boa por pelo menos um turno.
Esse Bot provavelmente terá um desempenho ruim, mas gostei da ideia de qualquer maneira. O MAD provavelmente se sairia melhor em um campo com bots mais inteligentes que registram o comportamento de outros bots e com mais correspondências entre 4 bots.
fonte
java MAD 43 "5 5 5 5"
parece não produzir nada.Sádico
Pitão
Sua prioridade é causar dor e granadas feridas. Ele faz o primeiro turno. Ele gosta de matar quando você não pode atacar. Ele brinca com SSSs (atiradores simples e simples), esquivando-se e puxando para prolongar o domínio. Ele até escolhe atacar quem primeiro não fez nada a ninguém.
Como ele usa granadas, ele (e todos os outros) geralmente não sobreviverão ao segundo ou terceiro turno. Se ele estiver emparelhado com outro granadeiro, todos morrerão. Isso significa que não espero vencer, mas escrevi isso para aprender python (nunca o usei antes e estou tentando fazer uma introdução a várias novas linguagens). Existem vários outros, "puxe estreias", por isso, se você achar que é muito semelhante, me avise. Os outros não parecem estar dispostos a puxar e depois desviar, no entanto.
fonte
raw_input
vai funcionar.sys.argv[2]
parece ser o consenso para entradas do Python. Você também pode encontrar uso parapop
, o que permitiria condensarthisisme=player[0];player.remove(player[0])
no mais simplesthisisme=player.pop(0)
.raw_input
recebeSTDIN
, mas o histórico do jogador é passado para o seu programa como um argumento de linha de comando, e é por isso que você precisasys.argv
. Para fins de teste, você pode configurá-lo manualmente comsys.argv = ["sadist.py", "0", "5 5 5 5"]
. Então você deve poder ligarplayer=sys.argv[2].split()
. Sesys
realmente for impossível importar , para testar, você pode até soltar o ponto e chamar a matrizsysargv
. Contanto que todo o resto funcione e você retorne àsys.argv
sua submissão, tudo ficará bem.