Esempio di esecuzione aggiunto 4/11
Chiarimento delle regole 4/8: tutte le proposte saranno in competizione in un gigantesco torneo gratuito composto da tutte le partite che il mio computer può svolgere in 48 ore.
Chiunque abbia trascorso del tempo a guardare i flussi su Twitch è a conoscenza della prevalenza di DeepBot e forse ha persino familiarità con il suo gioco di scommesse Bank Heist . Questo torneo di King of the Hill è direttamente ispirato a quel gioco. Non preoccuparti, però. Penso di aver gettato abbastanza nodi in questa versione per mantenere le cose interessanti.
Un rapido esempio
#####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.
Regole del gioco
Struttura del torneo / gioco
- Il torneo consisterà in un numero di partite scelte in modo uniforme a caso tra 1000 e 1100, in cui ogni invio serio si sfiderà simultaneamente in un free-for-all.
- Ogni giocatore inizia la prima partita con 240 crediti e ogni partita successiva con il numero di crediti che aveva alla fine della partita precedente.
- Ogni partita procede in 2 round e in ogni round i giocatori vengono chiamati in un ordine determinato in modo uniforme a caso per prendere una decisione:
- Nel primo turno, un giocatore può pagare qualsiasi numero intero di crediti tra 0 e le sue posizioni creditizie correnti per partecipare alla partecipazione in una rapina in banca.
- Nel secondo turno, ogni giocatore che ha scelto di partecipare alla rapina scommettendo almeno un credito (di seguito denominato "sbandate") può decidere di lasciar correre la propria scommessa (e, nel frattempo, eventualmente eseguire qualche altra azione), rinuncia alla rapina o vai all-in. (Queste opzioni sono ulteriormente descritte di seguito.)
- In base al numero di colpi e al numero totale di crediti pagati, viene selezionata una delle cinque banche su cui organizzare un colpo. Questa selezione influenza la probabilità individuale di vittoria e le probabilità con cui viene determinato il pagamento. (Le banche sono descritte di seguito.)
- Ogni errore che non ha rinunciato, con la probabilità (modificata) della banca, vincerà la sua puntata moltiplicata per le probabilità (modificate) della banca (arrotondate per difetto), altrimenti perderà la sua puntata. Nota che il successo o il fallimento di ogni giocatore è determinato individualmente - alcuni avranno successo laddove altri falliscono.
- Tutti i giocatori, che abbiano partecipato o meno, hanno avuto esito positivo o negativo, quindi ricevono una busta paga (con le eccezioni descritte di seguito).
- Nota che è impossibile lasciare definitivamente il gioco. Nel peggiore dei casi, un giocatore potrebbe dover attendere una partita per ricevere la busta paga successiva.
- Dopo tutte le 1000-1100 partite, il giocatore con il maggior numero di crediti sarà dichiarato il vincitore di quel torneo.
- Il torneo verrà ripetuto un numero non specificato di volte (quante ne possono essere calcolate in 48 ore) e i guadagni dei giocatori in tutti i tornei vengono sommati al fine di determinare il vincitore complessivo di questo concorso.
Il secondo giro di scommesse
- Qualsiasi giocatore che ha scommesso una puntata positiva nel primo turno può partecipare al secondo turno.
- In questo round, un giocatore può:
- rispondere con la stringa "back out" per annullare la sua scommessa. Questo azzererà la sua scommessa per la rapina attuale e ridurrà leggermente la probabilità che i giocatori che restano nella rapina abbiano successo. Prendendo questa opzione, un giocatore rinuncia alla busta paga di 240 crediti che segue la rapina come punizione per aver messo a rischio i rimanenti colpi. (I restanti heister avranno successo con una probabilità pari alla probabilità della banca moltiplicata per la frazione di heister che non si sono "ritirati".)
- rispondere con la stringa "all in" per far esplodere tutte le sue posizioni creditizie - e sottoscrivere un prestito di giorno di paga sul prossimo 240 stipendio di credito - per acquistare tutte le migliori attrezzature e informazioni per una rapina ed entrare da solo, pistole ardenti, senza basandosi su chiunque. La probabilità di vittoria di un giocatore del genere non può essere influenzata dalla caduta di altri talloni dalla rapina, né le sue vincite possono essere rubate dai doppi cross. I pagamenti vincenti saranno determinati come se la sua scommessa fosse tutta la sua posizione creditizia più 240, mentre la perdita metterà le sue posizioni a zero.
- Rispondi con qualsiasi altra stringa (inclusa la stringa vuota) al fine di mantenere la puntata precedente e proseguire con la rapina normalmente. (Risposta consigliata: "! Guncheck"). Alcune risposte avranno effetti collaterali aggiuntivi:
- Una risposta di "cambia lavoro" farà sì che il giocatore abbandoni il proprio lavoro. A partire da questo round, alla fine di ogni round, il giocatore avrà una probabilità del 5% di essere assunto in una nuova posizione. Se ciò riesce, il giocatore viene assunto e riceve immediatamente il suo primo stipendio. Ogni nuovo lavoro è garantito per pagare esattamente il 5% in più rispetto all'ultimo (arrotondato per difetto). Questa azione avrà successo indipendentemente dal successo della rapina.
- Una risposta di "acquisisci informazioni", se la rapina avrà successo, farà sì che il giocatore spenda tutte le sue vincite da quella rapina per ottenere un ulteriore 0,00001 per credito, quindi speso per le quote per la banca che è stata razziata solo per quel giocatore . Questa modifica delle probabilità è permanente. Ad esempio, se un giocatore sceglie questa azione quando passa la banca 1 e vince 6969 crediti in una rapina, le probabilità della banca 1 per quel giocatore saranno permanentemente aumentate di 0,06969 e il giocatore non riceverà nulla da quella rapina.
- Una risposta di "buy guard" farà sì che il giocatore riacquisti una delle guardie di sicurezza della banca che viene rapinata. In cambio di una riduzione permanente di 1 credito sulla busta paga di quel giocatore (bustarella regolare della guardia), il giocatore riceverà una probabilità di vittoria aumentata "permanente" presso quella banca (a causa della guardia che "dimentica di menzionare" quel giocatore alla polizia quando chiesto). La probabilità aumenterà esattamente dell'1% della differenza tra l'attuale probabilità di vittoria del giocatore in quella banca e il 100%. Questa azione avrà successo anche se la rapina fallisce. NOTA: se in qualsiasi momento, un giocatore non ha abbastanza crediti per pagare tutte le sue bustarelle di guardia, perde immediatamente e "permanentemente" tutti i bonus di probabilità quanti il numero di bustarelle che non è stato possibile pagare,
- Una risposta di "deposito", se la rapina avrà successo, lascerà tutte le vincite di un giocatore in un conto presso la banca investita. I crediti non saranno accessibili per nessuno scopo né saranno conteggiati per il punteggio di un giocatore fino a quando non saranno ritirati. Questo account pagherà gli interessi ad un tasso dello 0,14% per partita.
- Una risposta di "prelievo", se la rapina avrà successo, aggiungerà alle vincite di un giocatore l'intero contenuto del suo conto presso la banca investita. Di conseguenza, l'account verrà azzerato. Nota che queste vincite aggiuntive possono essere rubate dai doppi incrociatori.
- Una risposta di "doppia croce" farà una delle due cose:
- Se il numero di heister che hanno giocato "double cross" è al massimo 1/10 (arrotondato per difetto) del numero totale di heister non rabbiosi che hanno deciso di passare con il colpo (o esattamente uno se ci sono meno di 10 giocatori di questo tipo ), il giocatore riceverà vincite aggiuntive pari al totale delle vincite di tutti i non-cross incrociati diviso per il numero di double-cross (arrotondato per difetto). Tutti i non double crosser in questo caso ricevono 0 crediti dalla rapina. In altre parole, i doppi incrociatori rubano i crediti di tutti gli altri e li dividono equamente tra di loro.
- Se il numero di colpi che hanno giocato a "doppia croce" supera la soglia, il giocatore non riceverà vincite (se la sua rapina ha avuto successo), la sua busta paga viene dimezzata e viene licenziata dal suo lavoro. (Vedi "cambia posto di lavoro"). In questo caso, tutti i non-double-crosser (inclusa la rabble) riceveranno un pagamento bonus del totale delle vincite di tutti i double-cross diviso per il numero totale di non-cross-cross. In altre parole, la cospirazione è diventata troppo grande per mantenere un segreto, i cospiratori sono stati sradicati ed esclusi dalla rapina, e tutti hanno diviso la posta in gioco per la punizione - e la loro reputazione per gli affari sporchi li ha persi anche il loro lavoro.
- Una risposta di "dito" (come nella "diteggiatura di un topo furfante a doppio incrocio"), se la rapina avrà successo, darà al giocatore otto opportunità (disegnando uniformemente con la sostituzione dal set di vesciche non rabbiose) per identificare un doppio- crosser che non è già stato identificato .
- Ogni double crosser identificato in questo modo pagherà immediatamente al fingerer il 25% delle sue attuali posizioni creditizie (arrotondato per difetto) invece di essere colpito, perderà il lavoro e si farà tagliare la busta paga a metà (perché il boss non tollererà comportamenti scorretti) , e perde il 5% della probabilità di vittoria in banca mentre viene rapinato (dato che altri furti sono ancora più sospetti in futuro e probabilmente lo getteranno sotto l'autobus se le cose diventano pelose). I double crosser identificati in questo modo non influiscono sul fatto che il double cross abbia avuto successo per gli altri double crosser, ma non ricevono alcuno dei crediti rubati dal doppio cross e tali crediti rubati verranno ridistribuiti al non doppio crossers.
- Se non vengono identificati doppi incroci in questo modo, il boccino riceverà punti per perdere tempo a tutti - e pagherà anche metà delle sue vincite dalla rapina corrente, prenderà un taglio del 5% sulla sua busta paga (il boss taglia le ore del tattletale) e perderà 5% delle sue probabilità di scommessa presso la banca corrente (poiché gli altri heister hanno meno probabilità di essere generosi / equi con le loro vincite in futuro). La metà delle sue vincite così perse sarà distribuita ai double crossers non vincolati se i double crossers hanno avuto successo, o ai non double crossers (inclusa la rabbia) se i double crossers falliscono.
Le banche
La banca viene selezionata usando l'indice numheisters + int(totalamountbet/100000)
, dove numheisters è il numero di giocatori che hanno scommesso una puntata positiva nel round 1 e totalamountbet è la somma delle puntate di tutti quei giocatori. In altre parole, centomila crediti equivalgono a 1 altro heister. Sulla base di questo indice verrà scelta una delle seguenti banche, la banca con la soglia più alta che l'indice soddisfi o superi:
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
Tieni presente che man mano che un torneo continua, la probabilità di raggiungere il livello più alto in banca aumenterà, poiché l'importo che ciascun giocatore può puntare verso l'alto. Si noti inoltre che queste sono solo quote e probabilità iniziali , prima che siano state modificate da qualsiasi azione "acquisisci informazioni" o "acquista una guardia". Con le probabilità e le probabilità iniziali, solo le città e le banche nazionali hanno previsto vincite superiori alle perdite previste.
The Rabble
- Il torneo contiene anche altri 500 giocatori, chiamati "rabble", che partecipano come giocatori abituali alle rapine, ma alla fine non vengono segnati. Questi servono a rendere ogni gioco diverso e un po 'meno prevedibile, e consentono di raggiungere le banche più rischiose / più gratificanti anche con solo pochi giocatori "reali".
- Ogni gioco includerà alcuni sottogruppi di rabble per partecipare scelti in modo uniforme a caso su tutti i sottogruppi di rabble.
- Tutte le armi usano la seguente strategia:
- Scegli casualmente di scommettere con probabilità pari alla probabilità di successo in banca che verrebbero selezionate in base alle decisioni dei giocatori che hanno già preso la loro decisione in questo round .
- Se scommetti un importo diverso da zero, scegli il più grande dei seguenti importi che non supererebbero le sue attuali partecipazioni: 69, 420, 6969, 80085.
- Nel secondo round, "back out" con probabilità pari al 5% più il 50% della percentuale di scommettitori che hanno già ritirato, altrimenti rapina come di consueto. (Nota che questo significa che i primi giocatori del secondo round che ritirano possono avere enormi effetti a cascata tra la rabbia: presta attenzione e preparati a far crollare la rapina prima ancora che inizi.)
Ingressi e uscite
In entrambi i round, ai programmi verranno fornite le seguenti informazioni, esattamente in questo ordine, come argomenti della riga di comando . Salvo diversa indicazione, tutti i valori sono numeri interi che non contengono decimali.
- Il numero di gioco corrente (indicizzato zero)
- Il numero del round del gioco corrente (1 o 2)
- Il numero di giocatori nella partita corrente (inclusa la lotta).
- Il numero di giocatori che hanno già fatto i loro turni in questo round.
- Il numero di sbandate che finora hanno impegnato una partecipazione positiva. (Nel secondo round, questo sarà in realtà il numero totale di heister che hanno acquistato nel primo round.)
- Il numero totale di crediti investiti finora. (Nel secondo turno, questo sarà effettivamente il numero totale di crediti investiti al primo turno - in particolare, non si comprende più della posta in gioco iniziali di "All in" rapinatori e non comprendono la posta in gioco di "tornare indietro" rapinatori.)
- Il numero di heister che hanno confermato al secondo turno (cioè non si sono "ritirati"). Questo sarà zero durante il primo round.
- Il numero (zero indicizzato) della banca da razziare (durante il primo round, la banca che verrebbe razziata se nessun altro scommettesse)
- Il numero di crediti attualmente disponibili per il giocatore.
- Il numero di crediti che il giocatore ha scommesso nel primo turno. (Questo è sempre zero nel primo round.)
- Il numero di crediti che il giocatore riceverà nella sua busta paga alla fine di ogni partita.
- 1 se il giocatore riceve attualmente una busta paga, 0 se il giocatore è disoccupato
- Rango del giocatore in classifica (esclusa la rabbia) alla fine della partita precedente, indicizzato 1. (Definito come 1 + il numero di giocatori con rigorosamente più crediti in quel momento. Ad esempio durante la prima partita, tutti i giocatori hanno il grado 1).
- Il numero medio di crediti detenuti da tutti i giocatori (esclusa la rabbia) (rappresentato come un numero decimale)
- La deviazione assoluta media nel numero di crediti detenuti da tutti i giocatori (esclusa la rabbia) (rappresentato come un numero decimale)
- Il numero massimo di crediti detenuti da qualsiasi giocatore (ovvero il numero di crediti detenuti da un giocatore di livello 1, esclusa la rabbia)
- Il numero di crediti che il giocatore ha archiviato nel conto bancario 0
- Conto bancario 1
- Conto bancario 2
- Conto bancario 3
- Conto bancario 4
- Probabilità individuale di vittoria del giocatore sulla banca 0
- Banca 1 probabilità
- Probabilità della banca 2
- Probabilità della banca 3
- Banca 4 probabilità
- La vincita individuale del giocatore si basa su una rapina di successo nella banca 0
- Quote della banca 1
- Probabilità di Bank 2
- Bank 3 odds
- Bank 4 odds
Nel primo round di una partita, un programma giocatore deve stampare su stdout un numero intero compreso tra 0 e il numero totale di crediti nel conto di quel giocatore. Qualsiasi importo di scommessa superiore al saldo del credito disponibile viene considerato come una scommessa massima. Qualsiasi altro output (o condizione di errore) verrà interpretato come una scommessa zero.
Nel secondo turno di una partita, un programma giocatore deve stampare per stdout una stringa come descritto nella sezione "Il secondo giro di scommesse" sopra. Una condizione di errore qui è considerata l'azione predefinita: procedere normalmente con la rapina.
controllore
Il torneo si svolgerà utilizzando questo controller . Esempi di bot anche lì. Ancora in fase di test. Più codice a venire. Sentiti libero di inviare correzioni di errori (su github). Verrà aggiornato in caso di modifica delle regole.
Per eseguire un singolo torneo sul tuo computer, aggiungi una linea a concorrenti.txt e quindi utilizza:
python bankheist.py 1000
Regole del concorso
- I giocatori possono presentare un numero qualsiasi di programmi giocatore in qualsiasi lingua liberamente disponibile i cui programmi possono ricevere argomenti dalla riga di comando.
- Le presentazioni devono includere istruzioni abbastanza esplicite su come compilare i programmi ed eseguirli sul mio PC, inclusi i nomi degli strumenti necessari e i comandi esatti da emettere. L'invio deve includere almeno un comando che esegue il programma e può avere argomenti della riga di comando aggiunti direttamente ad esso.
- Gli invii devono inoltre avere un nome univoco per identificarli (che non contiene spazi).
- I programmi devono essere eseguiti in tempi ragionevolmente brevi. (Non sto impostando un limite superiore su ciò che costituisce ragionevole. Piuttosto, consiglierò semplicemente al creatore qualsiasi voce che sembra avere un tempo di esecuzione fuori misura per accelerarlo.)
- I programmi non possono leggere o scrivere su file. Né possono usare nessun altro metodo per memorizzare informazioni tra le esecuzioni. Il punto di questa sfida è prendere decisioni complesse sulla base di informazioni limitate / riassunte.
- Qualsiasi e tutte queste regole sono soggette a modifiche in qualsiasi momento, se necessario. Nella parte superiore di questo post verrà aggiunto un messaggio che indica tali cambiamenti.
- Questo concorso termina non appena una settimana dopo che l'ultimo utente ha inviato i suoi post per la prima volta . Le modifiche degli invii esistenti sono consentite in qualsiasi momento fino al termine del concorso. Farò del mio meglio per mantenere aggiornata la scadenza attuale in un messaggio nella parte superiore di questo post.
- Questo concorso termina non prima di una settimana dopo l'ultima modifica delle regole, se presenti. Farò del mio meglio per lasciare commenti per tutti gli utenti interessati da eventuali modifiche alle regole.
- È meglio scommettere che parteciperò a questo concorso da solo. ;)