King of the Hill: Bank Heist

15

Ejemplo de ejecución agregado 4/11

Aclaración de las Reglas 4/8: Todas las presentaciones competirán en un torneo gigante gratuito que consiste en tantos partidos como pueda realizar mi computadora en 48 horas.

Cualquiera que haya pasado algún tiempo viendo transmisiones en Twitch es consciente de la prevalencia de DeepBot , y tal vez incluso esté familiarizado con su juego de apuestas Bank Heist . Este torneo de King of the Hill está directamente inspirado en ese juego. Sin embargo, no te preocupes. Creo que he lanzado suficientes problemas adicionales en esta versión para mantener las cosas interesantes.

Un ejemplo rapido

#####GAME 13: 16 players######

Round 1:
gunHeCK bet 0.
PassivePanga bet 69.
SnitcherKing bet 1.
Lurker bet 0.
OC'sRandomTpyos bet 1.
MonisAddiction bet 69.
RaysFive01K bet 28.
LimeadeSneaktar bet 1.
KaylorrCriterion bet 0.
HardHatUmar bet 0.
HeCKuSumer bet 185.

Round 2
HeCKuSumer decided to !guncheck.
LimeadeSneaktar decided to double cross.
MonisAddiction decided to all in.
OC'sRandomTpyos decided to acquire intel.
RaysFive01K decided to deposit.
SnitcherKing decided to finger.
PassivePanga decided to !guncheck.

Results
PassivePanga failed. :(
SnitcherKing failed. :(
OC'sRandomTpyos was successful, and may gain ¥0
MonisAddiction failed. :(
RaysFive01K was successful, and may gain ¥0
LimeadeSneaktar was successful, and may gain ¥1
HeCKuSumer failed. :(

Results:
0. KaylorrCriterion: 3600
1. Lurker: 3600
2. gunHeCK: 3600
3. SnitcherKing: 3586
4. PassivePanga: 2634
5. LimeadeSneaktar: 2496
6. HeCKuSumer: 1909
7. HardHatUmar: 490
8. RaysFive01K: 255
9. OC'sRandomTpyos: 170
10. MonisAddiction: 0

(In this round, 7 players joined the heist, but the dice only rolled right for 3 of them. Of those, only LimeadeSneaktar brought any home--having stolen it from OcsRandomTpyos. RaysFive01K won significantly more, but deposited it all at the bank before leaving. At this point, the players who did not heist are doing well, living off their day jobs.)

#####GAME 14: 231 players######

Round 1:
Lurker bet 0.
HeCKuSumer bet 190.
KaylorrCriterion bet 0.
HardHatUmar bet 0.
MonisAddiction bet 0.
OC'sRandomTpyos bet 1.
gunHeCK bet 0.
LimeadeSneaktar bet 1.
RaysFive01K bet 25.
PassivePanga bet 69.
SnitcherKing bet 1.

Round 2
PassivePanga decided to !guncheck.
OC'sRandomTpyos decided to buy guard.
HeCKuSumer decided to !guncheck.
SnitcherKing decided to finger.
RaysFive01K decided to deposit.
LimeadeSneaktar decided to double cross.

Results
HeCKuSumer failed. :(
OC'sRandomTpyos failed. :(
LimeadeSneaktar failed. :(
RaysFive01K failed. :(
PassivePanga failed. :(
SnitcherKing failed. :(

Results:
0. KaylorrCriterion: 3840
1. Lurker: 3840
2. gunHeCK: 3840
3. SnitcherKing: 3825
4. PassivePanga: 2805
5. LimeadeSneaktar: 2495
6. HeCKuSumer: 1959
7. HardHatUmar: 490
8. MonisAddiction: 240
9. RaysFive01K: 229
10. OC'sRandomTpyos: 161

Six players heisted--but should have been paying more attention to the rabble and backed out, because the probabilities dropped too low to win, and all failed.


#####GAME 15: 300 players######

Round 1:
OC'sRandomTpyos bet 1.
Lurker bet 0.
SnitcherKing bet 1.
MonisAddiction bet 69.
LimeadeSneaktar bet 1.
gunHeCK bet 0.
HardHatUmar bet 0.
RaysFive01K bet 22.
KaylorrCriterion bet 0.
HeCKuSumer bet 195.
PassivePanga bet 69.

Round 2
HeCKuSumer decided to !guncheck.
OC'sRandomTpyos decided to buy guard.
MonisAddiction decided to all in.
PassivePanga decided to !guncheck.
LimeadeSneaktar decided to double cross.
RaysFive01K decided to deposit.
SnitcherKing decided to finger.

Results
OC'sRandomTpyos failed. :(
SnitcherKing failed. :(
MonisAddiction was successful, and may gain ¥0
LimeadeSneaktar failed. :(
RaysFive01K failed. :(
HeCKuSumer failed. :(
PassivePanga failed. :(

And here, the probabilities dropped too low to win again--except for MonisAddiction, who went all in, and therefore avoided the probability modification incurred by the rabble backing out. No winnings are listed here, because a player who wins going all in immediately adds all winnings to its holdings without any possible modification by other players' actions.

Reglas del juego

Torneo / Estructura del juego

  • El torneo constará de una serie de juegos seleccionados al azar uniformemente entre 1000 y 1100, en el que cada grave presentación estará compitiendo simultáneamente en un país libre para todos.
  • Cada jugador comienza el primer juego con 240 créditos y cada juego posterior con el número de créditos que tenía al final del juego anterior.
  • Cada juego continúa en 2 rondas, y en cada ronda, los jugadores son llamados en un orden determinado de manera uniforme al azar para tomar una decisión:
    • En la primera ronda, un jugador puede pagar cualquier número entero de créditos entre 0 y sus tenencias de crédito actuales para participar en un atraco al banco.
    • En la segunda ronda, cada jugador que eligió participar en el atraco apostando al menos un crédito (en lo sucesivo denominados "heisters") puede decidir dejar que su apuesta funcione (y, al hacerlo, posiblemente realizar alguna otra acción), optar por el atraco, o ir con todo adentro. (Estas opciones se describen con más detalle a continuación).
  • Según el número de atracadores y el número total de créditos que pagaron, se selecciona uno de los cinco bancos para realizar un atraco. Esta selección afecta la probabilidad individual de victoria y las probabilidades por las cuales se determina el pago. (Los bancos se describen a continuación).
  • Cada jugador que no se haya excluido, con la probabilidad (modificada) del banco, ganará su apuesta multiplicada por las probabilidades de apuesta (modificadas) del banco (redondeadas hacia abajo), o perderá su apuesta. Tenga en cuenta que el éxito o el fracaso de cada jugador se determina individualmente; algunos triunfarán donde otros fracasen.
  • Todos los jugadores, participaron o no, tuvieron éxito o fracasaron, luego reciben un cheque de pago (con las excepciones que se describen a continuación).
  • Tenga en cuenta que es imposible abandonar permanentemente el juego. En el peor de los casos, un jugador puede tener que esperar un juego para recibir su próximo cheque de pago.
  • Después de todos los juegos de 1000-1100, el jugador con la mayor cantidad de créditos será declarado ganador de ese torneo.
  • El torneo se repetirá un número no especificado de veces (tantas como se pueda calcular en 48 horas) y las ganancias del jugador en todos los torneos se sumarán para determinar el ganador general de este concurso.

La segunda ronda de apuestas

  • Cualquier jugador que haya apostado una apuesta positiva en la primera ronda puede participar en la segunda ronda.
  • En esta ronda, un jugador puede:
    • responde con la cadena "retroceder" para cancelar su apuesta Esto establecerá su apuesta a cero para el atraco actual y también disminuirá ligeramente la probabilidad de que los jugadores que quedan en el atraco tengan éxito. Al tomar esta opción, un jugador renuncia al cheque de pago de 240 créditos que sigue al atraco como castigo por poner en riesgo a los restantes jugadores. (Los restantes heisters tendrán éxito con una probabilidad igual a la probabilidad del banco multiplicada por la fracción de heisters que no "retrocedieron").
    • responda con la cadena "all in" para volar todas sus tenencias de crédito, y obtenga un préstamo de día de pago en su próximo cheque de pago de 240 créditos, para comprar todo el mejor equipo e información para un atraco e ir solo, con las armas encendidas, sin confiando en nadie. La probabilidad de victoria de ese jugador no puede verse afectada por otros jugadores que abandonan el atraco, ni sus ganancias pueden ser robadas por los traficantes de cruces. Los pagos ganadores se determinarán como si su apuesta fuera todas sus tenencias de crédito más 240, mientras que la pérdida establecerá sus tenencias en cero.
    • Responda con cualquier otra cadena (incluida la cadena vacía) para seguir con la apuesta anterior y continuar con el atraco como de costumbre. (Respuesta recomendada: "! Guncheck"). Ciertas respuestas tendrán efectos secundarios adicionales:
      • Una respuesta de "cambiar trabajos" hará que el jugador abandone su trabajo. Al comenzar esta ronda, al final de cada ronda, el jugador tendrá un 5% de posibilidades de ser contratado en una nueva posición. Si esto tiene éxito, el jugador es contratado e inmediatamente recibe su primer cheque de pago. Se garantiza que cada nuevo trabajo pagará exactamente un 5% más que el anterior (redondeado hacia abajo). Esta acción tendrá éxito tanto si el atraco tiene éxito como si no.
      • Una respuesta de "adquirir información" hará que, si el atraco tiene éxito, el jugador gaste todas sus ganancias de ese atraco para obtener un 0.00001 adicional por crédito gastado en las probabilidades para el banco que fue robado para ese jugador solamente . Esta modificación de probabilidades es permanente. Como ejemplo, si un jugador elige esta acción cuando roba el banco 1 y gana 6969 créditos en un atraco, las probabilidades del banco 1 para ese jugador aumentarán permanentemente en 0.06969 y el jugador no recibirá nada de ese atraco.
      • Una respuesta de "comprar guardia" hará que el jugador compre a uno de los guardias de seguridad en el banco que está siendo robado. A cambio de una reducción permanente de 1 crédito en el cheque de pago de ese jugador (el soborno regular del guardia), el jugador recibirá una probabilidad de victoria aumentada "permanente" en ese banco (debido a que el guardia "olvida mencionar" ese jugador a los policías cuando preguntó). La probabilidad aumentará exactamente un 1% de la diferencia entre la probabilidad de victoria actual del jugador en ese banco y el 100%. Esta acción tendrá éxito incluso si el atraco falla. NOTA: Si en algún momento, un jugador no tiene suficientes créditos para pagar todos sus sobornos de guardia, pierde de forma inmediata y "permanente" tantos bonos de probabilidad como la cantidad de sobornos que no se pudieron pagar,
      • Una respuesta de "depósito", si el atraco tiene éxito, dejará todas las ganancias de un jugador en una cuenta en el banco atrapado. Los créditos no serán accesibles para ningún propósito ni se contarán para el puntaje de un jugador hasta que sean retirados. Esta cuenta pagará intereses a una tasa del 0.14% por juego.
      • Una respuesta de "retirada", si el atraco tiene éxito, agregará a las ganancias de un jugador todo el contenido de su cuenta en el banco atrapado. La cuenta se pondrá a cero como resultado. Tenga en cuenta que estas ganancias adicionales pueden ser robadas por los cruzadores dobles.
      • Una respuesta de "doble cruz" hará una de dos cosas:
        • Si el número de atracadores que jugaron "doble cruz" es como máximo 1/10 (redondeado hacia abajo) del número total de atracadores que no son parte de la chusma que decidieron continuar con el atraco (o exactamente uno si hay menos de 10 de esos jugadores) ), el jugador recibirá ganancias adicionales iguales a las ganancias totales de todos los que no son dobles cruzados dividido por el número de dobles cruces (redondeado hacia abajo). Todos los que no hacen doble cruce en este caso reciben 0 créditos del atraco. En otras palabras, los traficantes cruzados roban los créditos de todos los demás y lo dividen equitativamente entre ellos.
        • Si el número de atracadores que jugaron "doble cruz" excede el umbral, el jugador no recibirá ganancias (si su atraco fue exitoso), se reducirá su cheque a la mitad y será despedido de su trabajo. (Ver "cambiar de trabajo".) En este caso, todos los que no son dobles cruzados (incluida la chusma) recibirán un pago de bonificación de las ganancias totales de todos los dobles cruces dividido por el número total de no dobles cruces. En otras palabras, la conspiración se hizo demasiado grande como para guardar un secreto, los conspiradores fueron desarraigados y excluidos del atraco, y todos dividieron sus apuestas por el castigo, y su reputación de trato sucio también les hizo perder su trabajo.
      • Una respuesta de "dedo" (como en "digitación de una rata sinvergüenza de doble cruce"), si el golpe tiene éxito, le dará al jugador ocho oportunidades (dibujo uniforme con reemplazo del conjunto de los no-rabble) para identificar un doble crosser que aún no ha sido identificado .
        • Cada traficante doble identificado de esta manera pagará inmediatamente al dedo el 25% de sus tenencias de crédito actuales (redondeado) en lugar de recibir un disparo, perder su trabajo y reducir su cheque de pago a la mitad (porque el jefe no tolerará el mal comportamiento) , y pierde el 5% de su probabilidad de victoria en el banco que está siendo robado (ya que otros herederos son más sospechosos en el futuro y es probable que lo arrojen debajo del autobús si las cosas se ponen difíciles). Los cruces dobles identificados de esta manera no afectan si el cruce doble fue exitoso para otros cruces dobles, pero no reciben ninguno de los créditos robados del cruce doble, y dichos créditos robados se redistribuirán de regreso a los no cruces dobles.
        • Si no se identifican cruces dobles de esta manera, el soplón recibirá puntos por perder el tiempo de todos, y también pagará la mitad de sus ganancias del atraco actual, recibirá un recorte del 5% en su cheque de pago (el jefe corta las horas de la batalla) y pierde 5% de sus probabilidades de apuesta en el banco actual (ya que otros jugadores son menos propensos a ser generosos / justos con sus ganancias en el futuro). La mitad de sus ganancias así perdidas se distribuirán a los cruces dobles sin dedos si los cruces dobles tuvieron éxito, o los no cruces dobles (incluida la chusma) si los cruces dobles fallaron.

Los bancos

El banco se selecciona utilizando el índice numheisters + int(totalamountbet/100000), donde numheisters es el número de jugadores que apostaron una apuesta positiva en la ronda 1 y totalamountbet es la suma de las apuestas de todos esos jugadores. En otras palabras, cien mil créditos es tan bueno como 1 heister adicional. Según este índice, se elegirá uno de los siguientes bancos, el banco con el umbral más alto que el índice cumple o supera:

Bank             Index Threshold   Victory Prob.  Bet Odds
----             ---------------   -------------  --------
0:Municipal                    0           0.540      0.80
1:City                        20           0.488      1.10
2:State                       40           0.425      1.30
3:National                    60           0.387      1.65
4:Federal Reserve             80           0.324      1.95

Tenga en cuenta que a medida que continúa un torneo, aumentará la probabilidad de alcanzar el nivel bancario más alto, ya que la cantidad que cada jugador puede apostar tiende hacia arriba. Tenga en cuenta también que estas son solo probabilidades y probabilidades iniciales , antes de que hayan sido modificadas por cualquier acción de "adquirir inteligencia" o "comprar un guardia". Con las probabilidades y probabilidades iniciales, solo la ciudad y los bancos nacionales han esperado ganancias superiores a las pérdidas esperadas.

La chusma

  • El torneo también contiene otros 500 jugadores, llamados la "chusma", que participan como jugadores regulares en los atracos, pero al final no se puntúan. Estos sirven para hacer que cada juego sea diferente y algo menos predecible, y hacen posible llegar a los bancos más riesgosos / más gratificantes incluso con solo unos pocos jugadores "reales".
  • Cada juego incluirá algún subconjunto de la chusma para participar elegido de manera uniforme al azar sobre todos los subconjuntos de la chusma.
  • Toda la chusma usa la siguiente estrategia:
    • Elija aleatoriamente apostar con una probabilidad igual a la probabilidad de tener éxito en el banco que se seleccionaría en función de las decisiones de los jugadores que ya han tomado su decisión en esta ronda .
    • Si apuesta una cantidad distinta de cero, elija la mayor de las siguientes cantidades que no excedería sus tenencias actuales: 69, 420, 6969, 80085.
    • En la segunda ronda, "retrocede" con una probabilidad igual al 5% más el 50% de la proporción de apostantes que ya se han retirado, de lo contrario, el golpe es normal. (Tenga en cuenta que esto significa que los primeros jugadores en la segunda ronda que retrocedan pueden tener enormes efectos en cascada entre la chusma: preste atención y esté listo para que el atraco se derrumbe incluso antes de que comience).

Entradas y salidas

En ambas rondas, los programas recibirán la siguiente información, exactamente en este orden, como argumentos de línea de comando . A menos que se indique lo contrario, todos los valores son enteros que no contienen decimales.

  1. El número de juego actual (indexado a cero)
  2. El número de ronda del juego actual (1 o 2)
  3. El número de jugadores en el juego actual (incluida la chusma).
  4. El número de jugadores que ya se han turnado esta ronda.
  5. El número de heisters que han cometido una apuesta positiva hasta ahora. (En la segunda ronda, este será el número total de asaltantes que compraron en la primera ronda).
  6. El número total de créditos invertidos hasta el momento. (En la segunda ronda, esta será la cantidad total de créditos invertidos en la primera ronda, en particular, no incluye más que las apuestas iniciales de los "todo en" y incluye las apuestas de "retroceder" heisters.)
  7. El número de atracadores que han confirmado en la segunda ronda (es decir, no "retrocedieron"). Esto será cero durante la primera ronda.
  8. El número (indexado a cero) del banco que se robará (durante la primera ronda, el banco que se robaría si nadie más apostara)
  9. El número de créditos actualmente disponibles para el jugador.
  10. El número de créditos que el jugador apostó en la primera ronda. (Esto siempre es cero en la primera ronda).
  11. El número de créditos que recibirá el jugador en su cheque de pago al final de cada juego.
  12. 1 si el jugador recibe actualmente un cheque de pago, 0 si el jugador está desempleado
  13. El rango del jugador en la tabla de clasificación (sin incluir la chusma) al final del juego anterior, 1 indexado. (Definido como 1 + el número de jugadores con estrictamente más créditos en ese momento. Por ejemplo, durante el primer juego, todos los jugadores tienen rango 1.)
  14. El número medio de créditos de todos los jugadores (sin incluir la chusma) (representado como un número decimal)
  15. La desviación media absoluta en el número de créditos de todos los jugadores (sin incluir la chusma) (representada como un número decimal)
  16. El número máximo de créditos en poder de cualquier jugador (es decir, el número de créditos en poder de un jugador de rango 1, sin incluir la chusma)
  17. El número de créditos que el jugador ha almacenado en la cuenta del banco 0
  18. Cuenta del banco 1
  19. Cuenta del banco 2
  20. Cuenta del banco 3
  21. Cuenta del banco 4
  22. La probabilidad individual de victoria del jugador en el banco 0
  23. Probabilidad del banco 1
  24. Probabilidad del banco 2
  25. Probabilidad del banco 3
  26. Probabilidad del banco 4
  27. Probabilidades de pago individuales del jugador tras un atraco exitoso en el banco 0
  28. Probabilidades del banco 1
  29. Probabilidades del banco 2
  30. Cuotas del banco 3
  31. Probabilidades del banco 4

En la primera ronda de un juego, un programa de jugador debe imprimir para obtener un número entero entre 0 y el número total de créditos en la cuenta de ese jugador. Cualquier monto de apuesta mayor que el saldo de crédito disponible se considera una apuesta máxima. Cualquier otra salida (o condición de error) se interpretará como una apuesta cero.

En la segunda ronda de un juego, un programa de jugador debe imprimir para producir una cadena como se describe en la sección "La segunda ronda de apuestas" más arriba. Aquí se considera que una condición de error es la acción predeterminada: realice el atraco de manera normal.

Controlador

El torneo se ejecutará con este controlador . Bot ejemplos allí también. Aún siendo probado. Más código por venir. Siéntase libre de enviar correcciones de errores (en github). Se actualizará si alguna regla cambia también.

Para ejecutar un solo torneo en su propia máquina, agregue una línea a competidores.txt y luego use:

python bankheist.py 1000

Las reglas del concurso

  • Los jugadores pueden enviar cualquier número de programas de jugador en cualquier idioma disponible libremente, cuyos programas pueden recibir argumentos de línea de comando.
  • Los envíos deben incluir instrucciones bastante explícitas sobre cómo compilar programas y ejecutarlos en mi PC, incluidos los nombres de las herramientas necesarias y los comandos exactos que se emitirán. El envío debe incluir al menos un comando que ejecute el programa y puede tener argumentos de línea de comando agregados directamente a él.
  • Los envíos también deben tener un nombre único para identificarlos (que no contiene espacios).
  • Los programas deben ejecutarse en un período de tiempo razonablemente corto. (No estoy estableciendo un límite superior en lo que constituye razonable. Más bien, simplemente le recomendaré al creador cualquier entrada que parezca tener un tiempo de ejecución descomunal para acelerarla).
  • Los programas no pueden leer ni escribir en archivos. Tampoco pueden usar ningún otro método para almacenar información entre ejecuciones. El objetivo de este desafío es tomar decisiones complejas sobre la base de información limitada / resumida.
  • Todas y cada una de estas reglas están sujetas a cambios en cualquier momento si es necesario. Se agregará un mensaje en la parte superior de esta publicación indicando dichos cambios.
  • Este concurso finaliza a más tardar una semana después de que el último usuario envíe sus publicaciones por primera vez . Se permiten modificaciones de los envíos existentes en cualquier momento hasta que finalice el concurso. Haré todo lo posible para mantener actualizada la fecha límite actual en un mensaje en la parte superior de esta publicación.
  • Este concurso finaliza a más tardar una semana después de la última vez que se modificaron las reglas, si corresponde. Haré todo lo posible para dejar comentarios a los usuarios afectados por cualquier cambio en las reglas.
  • Será mejor que apueste a que yo mismo participaré en este concurso. ;)
quintapia
fuente
Los comentarios no son para discusión extendida; Esta conversación se ha movido al chat .
Dennis
Tal vez porque no estoy familiarizado con la contracción o el juego de atraco, pero hay muchas reglas que se pueden demostrar mejor con un pequeño ejemplo (s) trabajado (s). Por el momento no parece muy accesible.
Moogie
¿Rey de la colina? No he escuchado ese nombre en años.
Beta Decay

Respuestas:

6

Algunos ejemplos "malos" de programas.

Estos son algunos bots que he escrito para probar el controlador. En su mayoría, solo hacen lo mínimo necesario para probar un tipo específico de acción. Dependiendo del nivel de participación en este KotH, se incluirán desde unos pocos hasta todos en el torneo final, ya que gran parte de la estrategia en el juego vendrá de lidiar con los comportamientos de muchos bots diferentes.

Los incluyo todos aquí principalmente como ejemplos de "uso".

Mirón

Nunca apuestes. Si no estás superando esto, reconsidera tu estrategia.

print 0

PasivaPanga

Siempre apuesta 69.

import sys


round = int(sys.argv[2])
myyattas = int(sys.argv[9])
if round == 1:
    if myyattas > 69:
        print "69"
    else:
        print "0"
else:
    print "!guncheck"

KaylorrCriterion

Haga una apuesta Kelly si y solo si se cumple el Criterio Kelly. Como esto rara vez ocurre al hacer algo de "adquirir inteligencia" y "comprar guardia" primero, generalmente obtiene el mismo resultado que Lurker.

import sys
import ast
game,round,numplayers,alreadyplayed,numbet,yattasbet,numready,bankid,myyattas,mybet,mypayment,hired,myrank,mu_yattas,sigma_yattas,max_yattas = map(ast.literal_eval,sys.argv[1:17])
bankholdings = map(int,sys.argv[17:22])
bankprobs = map(float,sys.argv[22:27])
bankodds = map(float,sys.argv[27:32])

def get_bank(bettors,credits):
    selector = min(4,int(bettors+int(credits/100000.)/20))
    return bankprobs[selector],bankodds[selector]



if round == 1:
    if alreadyplayed < 0.37*numplayers or numbet==0:
        print 0
        #sys.stderr.write("1: %d,%d\n"%(alreadyplayed,numbet))
    else:
        ratiosofar = numbet/float(alreadyplayed)
        bettors = ratiosofar * numplayers
        ratesofar = yattasbet/float(numbet)
        credits = bettors*ratesofar
        p,b = get_bank(bettors,credits)
        f = (p*(b+1)-1)/b
        print max(int(f*myyattas),0)
        #sys.stderr.write("2: %d,%d\n"%(p,b))
else:
    if alreadyplayed < 0.37*numbet or numbet==0:
        print "!guncheck"
    else:
        p,b = get_bank(numbet,yattasbet)
        realp = p*numready/float(alreadyplayed)
        f = (realp*(b+1)-(1-240./(myyattas+240.)))/b
        print "!guncheck" if f>0 else "back out"

gunHeCK

Haga una apuesta de Kelly si y solo si el número de jugadores vistos hasta el momento indica que la apuesta cumplirá con el criterio de Kelly (pero no retroceda si está equivocado). Por lo general, es peor que Lurker

import sys
import ast
game,round,numplayers,alreadyplayed,numbet,yattasbet,numready,bankid,myyattas,mybet,mypayment,hired,myrank,mu_yattas,sigma_yattas,max_yattas = map(ast.literal_eval,sys.argv[1:17])
bankholdings = map(int,sys.argv[17:22])
bankprobs = map(float,sys.argv[22:27])
bankodds = map(float,sys.argv[27:32])

def get_bank(bettors,credits):
    selector = min(4,int(bettors+int(credits/100000.)/20))
    return bankprobs[selector],bankodds[selector]

if round == 1:
    if alreadyplayed < 0.37*numplayers or numbet==0:
        print 0
        #sys.stderr.write("1: %d,%d\n"%(alreadyplayed,numbet))
    else:
        ratiosofar = numbet/float(alreadyplayed)
        bettors = ratiosofar * numplayers
        ratesofar = yattasbet/float(numbet)
        credits = bettors*ratesofar
        p,b = get_bank(bettors,credits)
        f = (p*(b+1)-1)/b
        print max(int(f*myyattas),0)
        #sys.stderr.write("2: %d,%d\n"%(p,b))
else:
    print "!gunHeCK"

La adicción de Moni

Ir "all in" a menos que ya esté ganando.

import sys
import random


round = int(sys.argv[2])
myrank = int(sys.argv[13])
mybet = int(sys.argv[10])

if round == 1:
    if random.random()<0.1:
        print 1
    else:
        print 69
else:
    if myrank>1:
        print "all in"
    else:
        if mybet==1:
            print "back out"
        else:
            print "!guncheck"

HeCKuSumer

Siempre apuesta una pequeña fracción constante de las tenencias.

import sys

round = int(sys.argv[2])
myyattas = int(sys.argv[9])

if round==1:
    print int(0.1*myyattas)
else:
    print "!guncheck"

OC'sRandomTpyos

Cambia mucho de trabajo al principio del torneo. Gaste todo ese dinero mejorando las probabilidades y las probabilidades. Luego, pasa los últimos juegos yendo todo adentro. Esto probablemente sería mucho mejor sin entrar todo a menos que ya esté en un primer lugar.

import sys
import ast
import random

game,round,numplayers,alreadyplayed,numbet,yattasbet,numready,bankid,myyattas,mybet,mypayment,hired,myrank,mu_yattas,sigma_yattas,max_yattas = map(ast.literal_eval,sys.argv[1:17])
bankholdings = map(int,sys.argv[17:22])
bankprobs = map(float,sys.argv[22:27])
bankodds = map(float,sys.argv[27:32])

if round == 1:
    if game<800 or myrank>3:
        print 1
    else:
        print myyattas/4
else:
    if game<800:
        if hired:
            print "change jobs"
        else:
            print random.choice(["acquire intel","buy guard"])
    else:
        if myrank>3:
            print "all in"
        else:
            print "!guncheck"

HardHatUmar

Cambia de trabajo siempre que sea posible durante la mayor parte del torneo. Evita apostar más del mínimo necesario. Hace decentemente bien, pero no genial.

import sys

game = int(sys.argv[1])
round = int(sys.argv[2])
hired = int(sys.argv[12])

if round==1:
    if game < 900 and hired:
        print 1
    else:
        print 0
else:
    print "change jobs"

LimeadeSneaktar

Cambia de trabajo siempre que sea posible durante la primera parte del torneo. Pasa cada otro juego cruzando dos veces. Hace decentemente bien incluso contra SnitcherKing. Probablemente les irá peor una vez que muchos otros robots se crucen y digiten. Si no, las reglas pueden necesitar un cambio.

import sys
import ast

game,round,numplayers,alreadyplayed,numbet,yattasbet,numready,bankid,myyattas,mybet,mypayment,hired,myrank,mu_yattas,sigma_yattas,max_yattas = map(ast.literal_eval,sys.argv[1:17])
bankholdings = map(int,sys.argv[17:22])
bankprobs = map(float,sys.argv[22:27])
bankodds = map(float,sys.argv[27:32])

if round==1:
    print 1
else:
    if hired and game<900:
        print "change jobs"
    else:
        print "double cross"

SnitcherKing

Siempre apuesta al mínimo, y siempre con el dedo. Lo hace bastante bien en pequeños torneos que incluyen LimeadeSneaktar.

import sys

round = int(sys.argv[2])

if round == 1:
    print 1
else:
    print "finger"

RaysFive01K

Un poco más complicado y, por lo tanto, bastante bueno. La mayor parte de su ventaja proviene de depositar todas las ganancias en el torneo temprano (protegiéndolas de los cruces dobles) mientras aumenta sus probabilidades de ganar (y cambia de trabajo para pagar todos esos guardias y atracos), y luego los retira al final del juego ( una vez que se han ganado un interés serio y la probabilidad de no retirarse es lo suficientemente baja, aunque aquí las pérdidas para los cruzadores dobles es un riesgo grave). Esto definitivamente estará en el torneo, y puede o no ser un contendiente serio.

import sys
import ast
import random
game,round,numplayers,alreadyplayed,numbet,yattasbet,numready,bankid,myyattas,mybet,mypayment,hired,myrank,mu_yattas,sigma_yattas,max_yattas = map(ast.literal_eval,sys.argv[1:17])

bankholdings = map(int,sys.argv[17:22])
bankprobs = map(float,sys.argv[22:27])
bankodds = map(float,sys.argv[27:32])

if round ==1:
    if game < 900:
        print myyattas/10
    else:
        print 1
else:
    if game < 500 and hired:
        print random.choice(["change jobs","finger","buy guard"])
    elif game < 900:
        print "deposit"
    elif bankholdings[bankid]>0:
        print "withdraw"
    else:
        if alreadyplayed/float(numplayers)<0.5:
            print "finger"
        else:
            print "back out"
quintapia
fuente
Apruebo estos nombres <insertar memes de Twitch y Panga>
CAD97
2

John solitario

import sys
import ast

game,round,numplayers,alreadyplayed,numbet,creditsbet,numready,bankid,mycredits,mybet,mypayment,hired,myrank,mu_credits,sigma_credits,max_credits = map(ast.literal_eval,sys.argv[1:17])

bankholdings = map(int,sys.argv[17:22])
bankprobs = map(float,sys.argv[22:27])
bankodds = map(float,sys.argv[27:32])

if round == 1:
    if mycredits > 100 or hired:
        print(int(mycredits)/2)
    else:
        print(0)
else:
    if bankprobs[int(bankid)] > 0.6:
        print("all in")
    elif int(mypayment) > 50 :
        print("buy guard")
    elif int(mycredits) > 200 and int(game) < 900 and hired == "1":
        print("change jobs")
    elif bankprobs[int(bankid)] * (float(numready)+1)/(float(alreadyplayed)+1) < 0.30:
        print "withdraw"
    else:
        print "!guncheck"

Soborna a los guardias hasta que tenga la probabilidad de ganar, luego entra todo. Solo.

Cambia de trabajo cuando necesita más dinero para sobornar a los guardias.

MegaTom
fuente
¿Cómo se llama este jugador?
quintopia
@quintopia ops! ¡Olvidé que tenía todo el camino para publicarlo! Nombre y expulsión añadidos.
MegaTom
Agradable. Solo como un consejo, no necesita hacer todos esos tipos de letra. Todo ya es del tipo correcto desde ser evaluado de inmediato. Lo que significa que la condición hired == "1"siempre será falsa y nunca cambiará de trabajo.
quintopia
Simplemente lo corrí en una sola ronda contra todos los demás que hice. Llegó en último lugar. Mala suerte :(
quintopia