introduzione
Sei bloccato su un'isola deserta con alcuni servi e stai cercando il tesoro. Più a lungo si cerca, più tesoro si trova. Meno persone cercano, più ogni persona trova.
A causa di scorte limitate, il leader ha deciso che alcune persone, fino a un quarto del gruppo, dovranno morire ogni notte. Ha deciso di non dire a nessuno esattamente quante persone moriranno in un dato giorno prima.
Hai il controllo di un piccolo gruppo di 5 persone, che si avventureranno fuori dal campo per trovare tesori per te.
Obbiettivo
L'obiettivo di questa competizione è quello di accumulare il maggior tesoro possibile. Ogni turno in cui i tuoi servi non tentano di tornare al campo, troveranno un certo numero di tesori. I tuoi servi possono tornare al campo in momenti diversi.
Ogni turno in cui un lavoratore rimane fuori alla ricerca di un tesoro, il lavoratore trova 1+R
pezzi di tesoro, dove si R
trova il numero di lavoratori (tra tutti i robot) già rientrati nel campo. I robot morti non tengono conto di questo calcolo.
All'inizio di ogni giorno, verrà scelto un numero casuale ( n
) da 2
a max(3, floor(num_live_players/4))
. (Per i 10 giocatori il giorno 1, questo è 2
per max(3,50/4)=12
. Per 20 giocatori in 1 giorno, questo sarebbe 2
amax(3,100/4)=25
.) Questo numero rappresenta il numero di giocatori che saranno lasciati a morire per quel giorno, e non sarà dato al vostro programma .
Se un servitore è una delle ultime n
persone a tornare, morirà e non sarà in grado di trasferire il tesoro che ha trovato in tuo possesso. Inoltre, il servitore non sarà in grado di partecipare alla caccia al tesoro per il resto dell'avventura.
Il tuo punteggio finale è la quantità media di tesori ottenuti per avventura (corsa del controller).
Se più persone tentano di tornare al campo nello stesso turno di quante sono le slot aperte, i numeri casuali determineranno chi entra e chi muore.
Una giornata su quest'isola dall'alba al tramonto dura 30 turni. Dato che ci sono molti animali pericolosi di notte, il mancato ritorno al tramonto significa che non ti sarà permesso entrare nel campo.
Input Output
Il programma dovrebbe essere eseguito per l'intera simulazione.
All'inizio della simulazione, INDEX I
verrà inserito, dove si I
trova l'indice del tuo bot (questo indice viene conteggiato da 1 in su).
All'inizio di ogni giorno, START_DAY D/N
verrà inserito nel tuo programma, dove si D
trova il numero del giorno (a partire da 1
), ed N
è uguale max(3, floor(num_live_players/4))
, che è il numero massimo di persone che possono morire in quel particolare giorno.
All'inizio di ogni turno, START_TURN T
verrà inserito il tuo programma, dove si T
trova il numero di turno (a partire da 1
).
Una volta che il tuo programma lo riceve, dovrebbe rispondere con un elenco di mosse dei tuoi servitori, ognuna separata da una virgola.
Le mosse valide sono:
R
: Prova a tornare al campo.S
: Resta in cerca di tesori.N
: Il servo è già morto o in campo.
L'immissione di una mossa non valida verrà interpretata come S
se il bot fosse vivo e non in campo, e N
altrimenti.
Alla fine di ogni turno, una stringa deve essere passata al tuo programma:
END_TURN [Turn #] [Bot 1 Moves] [Bot 2 Moves] ...
dove le mosse dei servitori di ogni bot sono separate da virgole.
Queste mosse saranno una delle seguenti:
R
: È tornato al campo con successo in quel turno.r
: Impossibile tornare al campo in quel turno.S
: Sto ancora cercando un tesoro.D
: È morto in un turno precedente.N
: Già tornato al campo.
Robot e servitori rimangono nello stesso ordine per tutta la simulazione.
Per esempio:
INDEX 2
....
END_TURN 8 N,N,N,N,N r,r,r,r,D D,D,D,N,R S,D,D,N,D
Qui, sei il secondo bot ( r,r,r,r,r
), che ha cercato di restituire tutti e quattro i servitori che sono ancora vivi (e sfortunatamente fallito su tutti e quattro). I servitori di Bot 1 sono tutti tornati al campo. Bot 3 ha tre servi morti, uno in campo e un quinto che è tornato con successo. Il Bot 4 ha un servitore che è rimasto (e morirà, poiché questo è l'ultimo turno di un giorno), un servo nel campo e tre servi morti.
Dopo ciascuna di queste stringhe, a meno che non sia stata emessa anche una stringa che segnala la fine della giornata (vedi sotto), il tuo programma è quello di produrre le mosse successive dei tuoi servitori, separate da virgole. Tutti i servitori devono essere contabilizzati (con N
se già nel campo e D
se sono già morti). Le mosse non valide verranno trattate come S
se il servitore non fosse già in campo / morto. Esempio:
N,N,S,S,R
che significa:
Servant # | Action
1 | Do nothing.
2 | Do nothing.
3 | Stay put (keep looking for treasure).
4 | Stay put (keep looking for treasure).
5 | Try to return to camp.
Alla fine di una giornata, la stringa seguente deve essere passata dopo l'ultima END
stringa del turno , informando tutti su chi è vivo:
END_DAY [Day #] [Bot 1 Status] [Bot 2 Status]
dove lo stato è un elenco separato da virgole di A
(vivo) o D
(morto). Il giorno seguente inizia immediatamente dopo.
La simulazione termina quando ci sono meno di 6 servi attivi. Il tuo programma riceverà il seguente input al termine della simulazione:
EXIT
Regole / Dettagli
- Solo nei turni in cui si trova la tua azione
S
troverai tesoro. - Numero di simulazioni eseguite: 1000 volte
- Il tuo programma non dovrebbe richiedere più di 1 secondo per determinare le mosse.
- Il tuo programma non dovrebbe uscire presto; verrà avviato esattamente una volta.
- Assicurarsi che il buffer di output (se applicabile) sia scaricato dopo ogni output.
- I file possono essere scritti nella cartella del bot (
./players/BotName/
). Il nome del tuo bot è come ti chiami, con tutti i caratteri non alfanumerici rimossi e scritti in CamelCase. Le voci possono salvare i dati tra le esecuzioni del controller, poiché le esecuzioni vengono eseguite in sequenza. - Il programma deve uscire dopo aver ricevuto
EXIT
. - I programmi che non riescono a compilare o generare errori o produrre testo non valido (non nel formato di 5 caratteri separati da virgole) possono essere esclusi dalla competizione. Una nuova riga deve seguire ogni output.
- Il controller può essere trovato su GitHub .
Includere il nome del bot, lingua + versione, codice e comando per compilare (se applicabile) ed eseguire il bot.
Esempio
Il testo emesso dal programma è preceduto da un >
. Il tuo programma non dovrebbe generare questo carattere.
INDEX 2
START_DAY 1/3
START_TURN 1
>S,S,S,S,S
END_TURN 1 S,R,S,S,S S,S,S,S,S
START_TURN 2
>S,S,S,S,S
END_TURN 2 S,N,S,R,S S,S,S,S,S
START_TURN 3
>R,R,S,S,S
END_TURN 3 R,N,R,N,R R,R,S,S,S
START_TURN 4
>N,N,S,S,S
END_TURN 4 N,N,N,N,N N,N,S,S,S
START_TURN 5
>N,N,R,R,R
END_TURN 5 N,N,N,N,N N,N,r,r,R
END_DAY 1 A,A,A,A,A A,A,D,D,A
START_DAY 2/3
START_TURN 1
>S,S,N,S,N
END_TURN 1 R,R,R,R,R S,S,D,D,N
END_DAY 2 A,A,A,A,A D,D,D,D,D
EXIT
I punteggi per l'esempio sopra sono:
Bot# Day 1 Day 2 Total
1 10 0 10
S1 1+2 0 3
S2 0 0 0
S3 1+2 0 3
S4 1 0 1
S5 1+2 0 3
2 20 0 20
S1 1+2 0 3
S2 1+2 0 3
S3 0 0 0
S4 0 0 0
S5 1+2+3+8 0 14
Il vincitore è quindi il giocatore, bot 2. Nota che il vincitore non deve sopravvivere fino alla fine assoluta. (Nota anche che il giocatore sarebbe potuto rimanere fino al turno 30 del primo giorno, poiché l'accampamento non sarebbe stato pieno fino a quando il giocatore non avesse rispedito un altro robot).
I punteggi
Bot Score
Bob 2939.422
Statisticians 2905.833
Morning Birds 1652.325
Evolved 1578.285
Slow Returners 1224.318
Wandering Fools 1065.908
Randomizers 735.313
Drunkards 0
Plague 0
I log sono disponibili su GitHub . I risultati per ciascuna prova sono disponibili su questo foglio di calcolo di Google .