In futuro, quando Time Travel (abbreviato in TT) sarà comune, il lancio delle monete diventerà un serio sport mentale. Per prepararci al futuro, creiamo un concorso per programmi in cui il viaggio nel tempo avverrà realmente dal punto di vista delle voci.
La competizione è un King of the Hill in stile round robin che consiste in partite di lancio di monete tra le classi Java.
Regole della partita di lancio delle monete
- Ci sono due giocatori e 100 round.
- In ogni round viene lanciata una moneta e in base al risultato uno dei giocatori ottiene 1 punto. Ogni giocatore ha il 50% di probabilità di segnare un punto.
- Dopo il lancio entrambi i giocatori hanno la possibilità di controllare il tempo tirando le leve.
- Se si tira una leva blu (ripristino del fermo) non è possibile alcun TT sul round in cui è stata utilizzata la leva o su qualsiasi round precedente. Il tentativo di TT di partecipare a questi round non avrà alcun effetto.
- Se si tira una leva rossa (reverter), si tenta di ripristinare il tempo precedente a un round precedente. Se riesce, la memoria dell'avversario verrà ripristinata nella sua memoria prima del round scelto e anche i risultati del lancio della moneta a partire dal round scelto verranno eliminati . L'unico segno possibile per il tuo avversario riguardo al TT sarà il numero delle sue leve inutilizzate che non verranno ripristinate.
- Ogni giocatore ha 5 leve blu e 20 rosse inutilizzate all'inizio della partita. Queste leve non sono influenzate dai TT.
- Se non si verifica alcun TT alla fine di un centesimo round, il gioco termina e vince il giocatore con il punteggio più alto.
Dettagli
- I round hanno un'indicizzazione basata su 1 (modulo da 1 a 100).
- Prima del giro
x
ti viene fornito il numero di leve blu e rosse disponibili, il lancio della moneta risulta fino al turnox
(incluso) e il ricordo del tuo (ultimo)x-1
round. - Tirando una leva blu in tondo si
x
ferma qualsiasi TT che abbia una destinazione in tondox
o prima (blocca un TT se accade anche nello stesso round esatto). - Ripristinare il round
x
significa che il round successivo sarà roundx
. - Se entrambi i giocatori scelgono di tornare alla fine di un round, il tempo viene riportato alla destinazione precedente che non è bloccata. I giocatori che hanno cercato di tornare a questo momento manterranno la loro memoria.
Dettagli tecnici
- È necessario scrivere una classe Java che implementa l'interfaccia Bot fornita.
- Aggiungi il tuo bot al progetto.
- Aggiungi un'istanza del tuo Bot al
Bot
fileController.java
. - La tua classe non dovrebbe conservare informazioni tra le chiamate . (Nella maggior parte dei casi avere solo
final
variabili al di fuori delle funzioni soddisfa questo requisito.) - È possibile fornire informazioni al controller nel
memory
campoAction
dell'oggetto restituito . Questo ti verrà restituito nel prossimo turno se non è successo alcun TT. Se si verifica un TT, riceverai la tua precedente memoria corrispondente. - È possibile utilizzare il
totalScore()
metodo dellaGame
classe per ottenere il punteggio di una stringa di cronologia.
Protocollo
Ad ogni turno il tuo
takeTurn(...)
metodo viene chiamato con 5 argomenti:- il numero di leve blu non utilizzate
- il numero di leve rosse non utilizzate
- la storia del lancio della moneta, una stringa composta da 1 e 0 che segna le tue vincite e perdite nei round precedenti. Il primo personaggio corrisponde al primo lancio della moneta. (Nel primo giro la lunghezza della stringa sarà
1
.) - una stringa, la memoria memorizzata del round precedente
- l'indice basato su 1 di questo round
Ad ogni turno il tuo metodo restituisce un
Action
oggetto contenenteun numero intero nel
move
campo che descrive la tua azione:0
per nessuna azione-1
per tirare una leva blu e bloccare il TT che sta attraversando questo round- un numero intero positivo
x
, non più grande del round corrente, per tirare una leva rossa e provare a tornare al roundx
- Gli interi non validi vengono considerati come
0
.
una stringa contenente la tua memoria di questo round che vuoi conservare. Notare che l' archiviazione della memoria non è una parte cruciale della sfida . È possibile effettuare buone voci senza memorizzare dati utili nella stringa. Al primo giro la stringa sarà una stringa vuota.
Il tuo metodo non dovrebbe richiedere più di 10 ms per round in media in una partita.
- Il fallimento regolare del termine comporta la squalifica.
punteggio
- Vincere una partita guadagna 2 punti e un pareggio guadagna 1 punto per entrambi i giocatori. La perdita non guadagna punti.
- Il punteggio di un bot sarà il numero totale di punti raccolti.
- Il numero di partite giocate tra ciascuna coppia di concorrenti dipenderà dal numero di voci e dalla loro velocità.
Due semplici robot di esempio vengono pubblicati come risposte.
Il controller e i primi due robot sono disponibili qui .
Risultati dei test con robot inviati fino al 3 novembre .:
Punteggi totali:
Oldschool: 3163
Random: 5871
RegretBot: 5269
Nostalgia: 8601
Little Ten: 8772
Analyzer: 17746
NoRegretsBot: 5833
Oracle: 15539
Deja Vu: 5491
Bad Loser: 13715
(Il controller si basa sul controller della sfida Cat catcher . Grazie per @flawr che lo ha fornito come base per questo.)
Bonus: un bel film di 6 minuti basato su un concetto simile.
If you pull a blue lever (revert stopper) no TT is possible to the round the lever was used or any earlier round anymore. TT's attempting to go to these rounds will have no effect.
If you pull a blue lever (revert stopper) no TT is possible through that round anymore. TT's attempting to go through the round will have no effect.
Cosa significa "passare per un round"?