Separación de 4 hombres
Descripción
De alguna manera te has encontrado en un enfrentamiento de cuatro vías. Un arma cargada descansa en tus manos, y algunas granadas están enganchadas en tu cinturón.
El objetivo es tener la mayor salud al final de un enfrentamiento. Un enfrentamiento termina cuando, como máximo, una persona tiene una cantidad positiva de salud.
Cada jugador tiene 5
salud y muere cuando su salud cae a / debajo 0
. El turno que muere un jugador es el último turno en el que ese jugador puede recibir daño.
Si hay un jugador en vivo al final de un enfrentamiento, ese jugador gana. De lo contrario, el jugador con la salud menos negativa gana.
Comportamiento
Dispara : dispara a alguien.
2
daño si disparas a un enemigo vivo0
daño si dispara a un enemigo muertohealth_at_start_of_turn+2
daño si te disparas a ti mismo. (Tenga en cuenta que esto lo dejará con MÁS-2
salud).- Si un enemigo te dispara en el mismo turno en el que te disparas a ti mismo, terminarás el enfrentamiento con -4 puntos de vida (igual recibirás daño de otros jugadores el turno en que te mates).
- Su acción el siguiente turno será ignorada (y se supondrá que es
Nothing
).
Esquiva : intenta esquivar el tiro de un solo oponente.
Prepárese : desenganche su granada y prepárese para lanzarla.
- Solo tienes tres turnos para lanzarlo, antes de explotar (
6
daño a ti mismo,3
daño a todos los enemigos vivos) - Morir con una granada no lanzada es equivalente a no arrojar la granada durante tres turnos.
- Solo tienes tres turnos para lanzarlo, antes de explotar (
Lanzar : Lanza la granada hacia alguien y espera lo mejor.
- El objetivo recibe
8
daño si está vivo - Todos los demás (incluido usted) reciben
3
daño si están vivos
- El objetivo recibe
Nada : quédese de brazos cruzados y mire a todos morir.
Entrada
Su programa recibirá la siguiente información:
- La salud de cada jugador.
Una lista de las acciones tomadas por ese jugador desde el inicio del enfrentamiento A continuación se muestra el formato de la información que se pasa por jugador:
[Health],[Action 1],[Action 2],[Action 3],...
Las acciones se darán en el formato especificado en la sección Salida .
Recibirá 4 cadenas de este tipo, separadas por un espacio, y pasadas como un solo argumento. El orden de estas cadenas es:
[Player Info] [Opponent 1 Info] [Opponent 2 Info] [Opponent 3 Info]
Las cadenas se pasan como el segundo argumento. El primer argumento contiene un número entero que identifica de forma exclusiva el enfrentamiento que se está promulgando. Se garantiza que los enfrentamientos entre el mismo conjunto de jugadores no serán simultáneos. Sin embargo, se producirán múltiples enfrentamientos al mismo tiempo.
Por ejemplo:
$./Player.bash 5 "3,S2,N 5,P,N 3,S0,N -2,S3,N"
Actualmente, el jugador y el segundo oponente tienen 3 puntos de vida, el primer oponente tiene 5 puntos de vida y el tercer oponente tiene -2 puntos de vida y está muerto.
En el primer turno:
- El jugador 1 disparó al enemigo 2
- El enemigo 1 preparó una granada
- Enemigo 2 jugador de tiro
- El enemigo 3 se disparó
En el segundo turno:
- Todos los jugadores no hicieron nada. (El jugador y el enemigo 2 no pueden hacer nada ya que dispararon en el turno anterior. El enemigo 3 está muerto: lo hará
Nothing
por el resto del enfrentamiento).
El segundo argumento en el inicio de un enfrentamiento es: 5 5 5 5
.
Salida
Se debe emitir un comando en el siguiente formato. Una salida no válida se interpreta como 'Nada'. Un comando que requiere un objetivo debe ser seguido por un número entero ( 0-3
, con 0
lo que representa el jugador, y 1-3
que representa enemigos 1-3).
S[target]
: Dispara [objetivo].D[target]
: Intenta esquivar [objetivo].P
: Prepara una granada.T[target]
: Lanza la granada a [objetivo].N
: Hacer nada.
Un comando que necesita un objetivo, pero se alimenta un objetivo no entre 0
y 3
o no alimenta un objetivo totalmente será asumido a objetivo 0
(el jugador).
Puntuación
Al final de cada enfrentamiento, los jugadores reciben una puntuación calculada por la siguiente fórmula:
35 + health at end of standoff
En el caso de que un jugador pone fin a un enfrentamiento con la salud negativos, que se recibirá una puntuación por debajo de 35 . Los siguientes puntos también son recompensados como un bono:
- Mayor salud: +4 puntos
- Segundo más saludable: +2 puntos
- Tercero más salud: +1 punto.
En caso de empate, se otorga la bonificación más baja (si dos personas empatan con la mayor cantidad de salud, a ambas se les otorga +2; si hay 3 personas con la mayor cantidad de salud, +1, y si todos terminan igual, +0).
El puntaje final se determina calculando la media de todos los puntajes individuales.
Reglas / Detalles
- El orden de los eventos dentro de un turno es el siguiente:
- Todos los jugadores hacen sus acciones.
- Los jugadores que tienen 0 o menos de vida mueren.
- Las granadas no lanzadas que necesitan explotar explotarán (los jugadores que acaban de morir siguen heridos, ya que este es el turno en que murieron).
- No hay colaboración entre las entradas.
- Se producirán tres * enfrentamientos entre cada conjunto de 4 jugadores. (El orden de los jugadores puede variar con cada enfrentamiento).
- Las entradas que consuman cantidades excesivas de memoria de espacio en disco serán descalificadas.
- Leer o modificar archivos que no sean los de su entrada descalificará su entrada.
- Un camión, conducido por un borracho, atropellará a todos los jugadores vivos después del
50th
turno, si el enfrentamiento aún no ha terminado al final del50th
turno.- Este camión causa 20 daños a todos los jugadores vivos.
- Los enfrentamientos suceden rápidamente. Los programas se cortan después de 1 segundo.
- Su programa se llamará cada turno, incluso después de que haya muerto.
- Puede leer o escribir archivos en su directorio solamente (si su entrada se llama JohnDoe, puede guardar archivos en el directorio players / JohnDoe /); sin embargo, este NO será el directorio actual mientras se ejecuta su secuencia de comandos.
- Los enfrentamientos tendrán lugar en una máquina que ejecute Arch Linux (Versión 2014.08.01).
El controlador está disponible en GitHub .
Incluya lo siguiente en su publicación:
- Un nombre para tu bot
- Un comando de shell para ejecutar el bot (ej.
java Doe.java
) La entrada se pasará a través de la línea de comando como un solo argumento (java Doe.java 5 "-2,S0 -2,S1 -2,S2 5,N"
) - Código de tu bot
- Cómo debe compilarse el bot (si corresponde)
- Idioma (y versión si corresponde, especialmente para python)
* El controlador tarda demasiado para seis.
Marcador
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
Registros: en GitHub
fuente
Respuestas:
Observador
Este chico analiza a sus enemigos. El objetivo es sobrevivir hasta que solo quede un oponente "agresivo", y luego matarlo en un enfrentamiento épico.
Compilar:
javac Observer.java
Ejecutar:java Observer arg0 arg1
fuente
!player.contains("S" + id)
¿Es esta una condición necesaria en la función "isAggressive"? Un jugador suicida estará muerto de todos modosGranadero
Las armas están sobrevaloradas. Un verdadero enfrentamiento escocés es así:
Si bien esto parece trivial, probablemente no sea una estrategia terrible . Dado que las armas y las granadas tienen un ciclo de dos turnos, esta es, de lejos, la forma más eficiente de hacer daño.
Por supuesto, si los tres oponentes me disparan en la primera ronda, no es bueno. Pero tampoco mucho más sería.
Compilar / ejecutar en la forma estándar de Java:
1 nota al pie sin sentido
fuente
Regla de Asimov Número 0 Bot - Python
Bastante sencillo, atacará al primer jugador que vea sosteniendo una granada para proteger a la mayoría de los humanos. Si nadie es una amenaza para la mayoría de los humanos, no hará nada.
Ejecútalo como:
fuente
Han Solo - Python
Han disparó primero. En este caso, disparará primero eligiendo vivo el objetivo más cercano.
Ejecútalo como:
Nota : Esto es lo primero que escribí en Python, por lo que si ve alguna mala práctica específica de Python, hágamelo saber.
fuente
is_alive
EmoCowboy
¿Por qué esperar para morir? Solo mátate ahora mismo. Con suerte, el resto de los tontos se volarán entre sí hasta mucho menos que -2.
La puntuación normalmente será -2. A veces -4 si la gente decide dispararme de la nada. Raramente más que eso, lo que significa que esto debería superar varias de las presentaciones actuales.
Pitón
EDITAR: Esto no es una broma, que generalmente es la razón por la cual estas presentaciones emo están mal vistas. Esta es una estrategia legítima. Estar vivo es mortal!
fuente
Pacifista
Es un tipo genial, acaba de quedar atrapado con la multitud equivocada.
Ejecutar como
runghc pacifist.hs
, pero es posible que desee compilarlo con -O3 si la eficiencia es un problema.fuente
-O3
marcara la diferencia.runghc
lado. En realidad, es 10 veces más lento en mi caja de Linux.Monkey - Python (¡Primera entrada!)
Mono mira mono hace. Repetirá exactamente la última acción realizada por un jugador aleatorio.
Se puede ejecutar así: "python monkey.py args" No se requieren pasos adicionales.
fuente
-1
directamente.argv[2]
obtener el historial de los jugadores.Simple Shooter - Perl (error corregido)
Este bot dispara al oponente con más salud. Es una estrategia muy simple, pero creo que tiene una buena posibilidad de hacerlo bien.
Así es como ejecutarlo usando alguna entrada de ejemplo:
fuente
Spock, en Python 3.x
Este código es más bien un experimento (por lo que lleva el nombre de Spock porque ... es vulcano, y son bastante buenos en este tipo de cosas), pero de todos modos fue divertido construirlo. El principal razonamiento detrás de todo este código son los supuestos que un ser lógico y bueno, como Spock, haría si se le dieran las reglas del juego:
El objetivo de este juego es maximizar el puntaje, que sería hecho por todos simplemente parados, lo que no es posible debido al camión.
La forma en que Spock juega en el resto del juego se puede resumir en su famosa cita: " Las necesidades de muchos superan las necesidades de unos pocos ". En otras palabras, Spock tiene que asegurarse de que se sufra la menor cantidad de daño, matando a los que lo hacen. Cómo lo hace
El razonamiento es que, al apuntar a los jugadores más débiles, estamos terminando las fuentes de daño. El razonamiento detrás de las granadas es que se disparan independientemente y hacen menos daño si no se lanzan.
Y entonces este bot funciona. No he realizado pruebas exhaustivas para detectar fallas de entrada (así que, por favor, avíseme si algo sale mal), pero estoy seguro de que resolví la mayoría de los problemas. Basé una pequeña parte del código del robot HanSolo, pero en su mayor parte es un lío enredado. Disfrutar.
Ejecútalo como:
2014-08-12 - Corrección de errores menores con respecto a la detección de granadas
14-08-2014 - Corrección de errores menores con respecto al final del juego, gracias a isaacg por señalarlo antes
fuente
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]
debería serint(player[1][1])
.Pistolero políticamente correcto
Muy políticamente correcto, ya que no discrimina nada. Por lo tanto, no es muy inteligente.
Realmente ... no importa qué argumentos se le pasen y cómo.
python politicallycorrectgunman.py
fuente
random.choice(array)
?Tirador recto
Es una parte entrenada de la caballería y habla en muchos idiomas, pero, al ser parpadeado, Straight Shooter solo puede ver al enemigo frente a él. Siendo un caballo, no entiende que hay que esperar entre disparos.
Perl, Python 2/3, Ruby: este caballo realmente es una entrada poligonal.
Para una respuesta que tiene un poco más de pensamiento (y algún paradigma funcional) puesto en él, vea Siglo XXI y Medio .
fuente
Anti-granadero
Las granadas son malas. Muy mal. Entonces, si alguien está preparando uno, lo mejor es dispararles. De lo contrario, pasaremos el rato.
fuente
Ricochet - Perl
Las estrategias simples parecen funcionar decentemente en este desafío, así que aquí hay otra. Dispara a un jugador vivo al azar. Tiene la característica adicional de suicidarse al final para evitar el camión.
Corre así:
fuente
Agresor
Tira de la ronda uno, lanza al oponente con la salud más alta en la ronda 2, luego dispara al oponente con la salud más alta.
Ejecute esto como ./agg ID "5 5 5 5".
fuente
Ninja
Simplemente esquiva al azar tratando de evitar ser golpeado.
correr como
Los argumentos son innecesarios, pero se pueden agregar sin problemas.
fuente
Nombre : objetivos prioritarios
Comando de shell : ruby PriorityTargets.rb 5 [game_state]
Lenguaje : Ruby V2.1.2
Descripción : PriorityTargets intenta encontrar estilos de juego comunes. Luego decide, basándose en esos estilos de juego, a quién quiere atacar y qué arma usar.
Nota : ¡Primera presentación de Code Golf! Mucho más grande que las otras presentaciones porque me volví un poco loco.
fuente
Cobarde - Perl
Actúa muy cobarde. Cuando se siente sano, elige un enemigo que no lo siente y le dispara. Puntos de bonificación para aquellos enemigos que estaban disparando el último turno (porque se sabe que están haciendo
Nothing
este turno y, por lo tanto, están absolutamente indefensos). Cuando no se siente tan bien, corre a esconderse para salvar su escondite, disparando ocasionalmente a alguien.Código bastante estándar de Perl; guárdelo en algún archivo y luego ejecútelo
perl file argument argument [...]
. He comprobado la sintaxis y estaba bien, así que espero que no haya problemas con esto.E: eliminado un potencial de división por 0 error.
fuente
Bomberman
El bot escrito en R, la línea de comando debería ser:
Rscript Bomberman.R arg0 arg1
me di cuenta después de comenzar a escribir este bot que Geobits ya hizo un granadero, pero creo que el mío es significativamente diferente, ya que comprueba que su salud está por encima de 3 antes de preparar una granada, lo tira el último tirador primero, y el segundo más saludable, y si su salud es inferior a 3, esquivará al jugador peligroso (ni muerto ni tirador en la última ronda) o disparará a uno de los jugadores restantes.
Editar
Parece haber algún problema de comunicación entre este bot y su controlador ya que todos los registros que busqué mostraron que mi bot solo salía
N
. Entonces, aquí está el mismo bot pero reescrito en Python, con la esperanza de que si este también tiene un problema de comunicación, alguien lo verá.Para ser llamado con
python Bomberman.py arg0 arg1
.fuente
Neo
Esquiva a un jugador vivo que no disparó el último turno. Si todos los vivos dispararon el último turno, dispara a un jugador vivo al azar. Suicidio cuando ves faros.
No espero mucho de este tipo contra las granadas, pero contra los tiradores podría funcionar bastante bien. Ya veremos.
fuente
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)
Siglo veinticuatro y medio
Esta entrada de Python se agacha y esquiva hasta que solo quedan jugadores pasivos o un solo jugador agresivo, luego comienza a disparar. Espera que un marciano que pasa se haga cargo de granaderos y conductores de camiones borrachos.
A menos que haya hecho algo mal, este es Python funcional. Ciertamente no se parece al tipo de Python que escribí antes de que Haskell y sus amigos me encontraran, y no creo que haya mutado nada en el lugar. Pero si sabes más, por favor dímelo.
Correr como:
fuente
Asustado
Esta presentación tiene miedo de todos. Pero está especialmente asustado de algunas personas. Entonces descubre quién es el más peligroso y les dispara. Si varios enemigos parecen los más peligrosos, dispara a uno aleatorio.
Esto es python (2 o 3, el mismo resultado en cualquiera de los dos). Guardar como
scared.py
, ejecutar conpython3 scared.py
fuente
Bastardo manipulador - Python
Prepara y lanza granadas. Si piensa que no hay tiempo o que hay muy pocos enemigos, dispara. Si está solo, intenta burlar al otro tipo.
fuente
Osama
He estado intentando esto durante un día más o menos, ahora es tiempo de publicar y ver cómo los demás han evolucionado mientras tanto.
Compilar con
ghc -O2 osama.hs
, luego ejecutar usando./players/Osama/osama
.fuente
Francotirador - Lua
En el primer turno disparará a una persona al azar, luego disparará a cualquier jugador que pueda matar (2 o 1 de salud). Si ninguno de los dos funciona, intentará disparar al jugador que lo disparó por última vez, de lo contrario disparará a un jugador aleatorio. Corre con
lua Sniper.lua
fuente
lua Sniper.lua 3 "5,S1 3,D3 5,N 5,P"
. Es posible que deba verificar suarg
índice.lua: ./players/Sniper/Sniper.lua:38: attempt to compare nil with number
./players/Sniper/Sniper.lua:38: in main chunk
[C]: in ?
Darwin
La supervivencia del más apto significa que el menos sano debe morir.
Razón fundamental o base lógica
Mirando el lote de resultados del martes (12), parece haber tres grupos distintos: sobrevivientes; el efectivamente suicida; y lo peor que inútil. Los sobrevivientes comparten estrategias simples basadas en disparos. Mientras que un par de otros bots ( Spock , Coward ) apuntarán al enemigo menos saludable, también complican sus estrategias con otras acciones. Este no lo hace. Al igual que Simple Shooter , tiene una definición clara del objetivo y se mantiene implacable. Será interesante ver dónde encaja en los resultados.
Esta es una versión simplificada y ligeramente modificada de mi anterior siglo veinticuatro y medio y comparte su invocación:
fuente
Zaenille - C
Prioridades:
Compilar con
gcc <filename.c>
.Corre con
./a.out <parameters>
.fuente
Analizador de entrada
La clave de un juego como este es analizar cómo están jugando todos tus oponentes para responder en consecuencia. ¡Mi bot hará exactamente eso usando algoritmos complicados que resultarán en el uso de mis oponentes para mi ventaja dando una victoria decisiva!
Editar: ahora
Compila el bot con el siguiente comando (Necesito tener ghc)
El comando de shell para ejecutar debe ser el siguiente
Nota: Probé en Windows, así que si tiene algún problema con respecto a la compilación / ejecución, dígalo en un comentario y haré todo lo posible para encontrar el comando correcto.
fuente
Perro llamado Coraje
Lo primero: dispara a los malos a la vista. Luego esquiva al azar hasta que alguien prepare una granada. Luego, cuando todos le disparen, prepare mi propia granada y se la arroje a cualquiera. Pero el hombre distracción.
Editar: ahora implementado como pensé que debería ser. Antes, el puntaje era: 35,9
Actualizado: a veces dispara en lugar de esquivar
couragethedog.py
Correr como
fuente
MAD - Java
El robot MAD confía en el poder de la intimidación a través de la destrucción mutua asegurada . Cuando no tiene una granada lista, prepara una. Luego esquiva a los posibles artilleros hasta que alguien intenta infligirle daño o su granada está a punto de explotar. Desde el momento en que es atacado, arroja granadas a quien haya tratado de hacerle más daño este partido hasta ahora. Si su granada está a punto de explotar, bombardea al jugador principal. MAD no está en contra de dispararle a alguien cuando no hay nada que esquivar o directamente arrojar una granada y su granada sigue siendo buena durante al menos un turno.
Este Bot probablemente funcionará mal, pero me gustó la idea de todos modos. MAD probablemente lo haría mejor en un campo con bots más inteligentes que registran el comportamiento de otros bots y con más coincidencias ejecutadas entre 4 bots.
fuente
java MAD 43 "5 5 5 5"
parecen no generar nada.Sádico
pitón
Su prioridad es causar dolor y lastimar granadas. Él tira el primer turno. Le gusta matar cuando no puedes atacar. Él juega con SSS (tiradores simples) esquivando y tirando para prolongar la dominación. Incluso elige atacar a los primeros que no han hecho nada a nadie.
Debido a que usa granadas, él (y todos los demás) generalmente no sobrevivirán a la segunda o tercera ronda. Si está emparejado con otra granada, todos morirán. Esto significa que no espero ganar, pero escribí esto para aprender Python (nunca lo usé antes y estoy tratando de obtener una introducción a un montón de nuevos idiomas). Hay varios otros "pull firsts", así que si crees que es demasiado simular, házmelo saber. Sin embargo, los otros no parecen estar dispuestos a tirar y luego esquivar.
fuente
raw_input
vaya a funcionar.sys.argv[2]
Parece ser el consenso para las entradas de Python. También puede encontrar el uso depop
, que le permitiría condensarsethisisme=player[0];player.remove(player[0])
en el más simplethisisme=player.pop(0)
.raw_input
se retira deSTDIN
, pero el historial del jugador se pasa a su programa como un argumento de línea de comandos, por lo que necesitasys.argv
. En aras de las pruebas, puede configurarlo manualmente consys.argv = ["sadist.py", "0", "5 5 5 5"]
. Entonces deberías poder llamarplayer=sys.argv[2].split()
. Si la importaciónsys
es realmente imposible, para las pruebas, incluso podría soltar el punto y llamar a la matrizsysargv
. Mientras todo lo demás funcione y vuelvas asys.argv
tu presentación, debería estar bien.