introduction
Vous êtes coincé sur une île déserte avec quelques serviteurs et vous cherchez un trésor. Plus on cherche, plus on trouve de trésor. Moins il y a de personnes qui cherchent, plus chaque personne en trouve.
En raison d'un approvisionnement limité, le chef de file a décidé que quelques personnes, jusqu'à un quart du groupe, devraient mourir chaque nuit. Il a décidé de ne dire à personne exactement combien de personnes mourront un jour donné à l'avance.
Vous contrôlez un petit groupe de 5 personnes qui s'aventureront hors du camp pour trouver un trésor pour vous.
Objectif
L'objectif de ce concours est d'amasser autant de trésors que possible. Chaque tour que vos serviteurs n'essaient pas de retourner au camp, ils trouveront un certain nombre de pièces de trésor. Vos serviteurs peuvent retourner au camp à des moments différents.
Chaque tour qu'un travailleur reste à la recherche d'un trésor, le travailleur trouve des 1+R
morceaux de trésor, oùR
trouve le nombre de travailleurs (sur tous les robots) déjà de retour dans le camp. Les robots morts ne sont pas pris en compte dans ce calcul.
Au début de chaque journée, un nombre aléatoire ( n
) de 2
à max(3, floor(num_live_players/4))
sera choisi. (Pour 10 joueurs le jour 1, c'est 2
à max(3,50/4)=12
. Pour 20 joueurs le jour 1, ce serait 2
demax(3,100/4)=25
.) Ce nombre représente le nombre de joueurs qui seront laissés pour mourir ce jour-là et ne seront pas donnés à votre programme .
Si un serviteur est l'une des dernières n
personnes à revenir, il mourra et ne pourra pas transférer le trésor qu'il a trouvé en votre possession. De plus, le domestique ne pourra pas participer à la chasse au trésor pour le reste de l'aventure.
Votre score final est le montant moyen de trésor que vous avez obtenu par aventure (course du contrôleur).
Si plus de personnes tentent de retourner au camp au même tour qu'il n'y a de places libres, des nombres aléatoires détermineront qui entre et qui meurt.
Une journée sur cette île du lever au coucher du soleil dure 30 tours. Comme il y a beaucoup d'animaux dangereux la nuit, le fait de ne pas revenir au coucher du soleil signifie que vous ne serez pas autorisé à entrer dans le camp.
Entrée sortie
Votre programme doit s'exécuter pour l'intégralité de la simulation.
Au début de la simulation, INDEX I
sera entré, où I
est l'indice de votre bot (cet indice est compté à partir de 1).
Au début de chaque journée, START_DAY D/N
sera entré dans votre programme, où D
est le numéro du jour (à partir de 1
), et N
est égal à max(3, floor(num_live_players/4))
, qui est le nombre maximum de personnes qui peuvent mourir ce jour-là.
Au début de chaque tour, START_TURN T
sera entré dans votre programme, où T
est le numéro du tour (à partir de1
).
Une fois que votre programme a reçu cela, il devrait répondre avec une liste des mouvements de vos serviteurs, chacun séparé par une virgule.
Les mouvements valides sont:
R
: Essayez de retourner au camp.S
: Restez à la recherche de trésors.N
: Le serviteur est déjà mort ou dans le camp.
La saisie d'un mouvement invalide sera interprétée comme S
si le bot était vivant et non dans le camp, et N
autrement.
À la fin de chaque tour, une chaîne doit être transmise à votre programme:
END_TURN [Turn #] [Bot 1 Moves] [Bot 2 Moves] ...
où les mouvements des serviteurs de chaque bot sont séparés par des virgules.
Ces mouvements seront l'un des suivants:
R
: Retour au camp réussi ce tour-ci.r
: Impossible de retourner au camp ce tour-ci.S
: Toujours à la recherche d'un trésor.D
: Décédé lors d'un tour précédent.N
: Déjà de retour au camp.
Les robots et les serviteurs restent dans le même ordre pendant toute la simulation.
Par exemple:
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
Ici, vous êtes le deuxième bot ( r,r,r,r,r
), qui a tenté de rendre les quatre serviteurs encore en vie (et malheureusement, ils ont échoué sur les quatre). Les serviteurs de Bot 1 sont tous de retour au camp. Le bot 3 a trois serviteurs morts, un de plus dans le camp et un cinquième serviteur qui est revenu avec succès. Le Bot 4 a un serviteur qui est resté (et mourra, car c'est le dernier tour d'une journée), un serviteur dans le camp et trois serviteurs morts.
Après chacune de ces chaînes, à moins qu'une chaîne signalant la fin de la journée n'ait également été émise (voir ci-dessous), votre programme consiste à émettre les prochains mouvements de vos serviteurs, séparés par des virgules. Tous les serviteurs doivent être comptabilisés (avec N
s'ils sont déjà dans le camp et D
s'ils sont déjà morts). Les mouvements invalides seront traités comme S
si le serviteur n'était pas déjà dans le camp / mort. Exemple:
N,N,S,S,R
ce qui signifie:
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.
À la fin d'une journée, la chaîne suivante doit être passée après la END
chaîne du dernier tour , informant tout le monde sur qui est vivant:
END_DAY [Day #] [Bot 1 Status] [Bot 2 Status]
où le statut est une liste séparée par des virgules A
(vivante) ou D
(morte). Le lendemain commence immédiatement après.
La simulation se termine lorsqu'il y a moins de 6 serviteurs vivants. Votre programme recevra les informations suivantes à la fin de la simulation:
EXIT
Règles / Détails
- Ce n'est que dans les virages où se situe votre action
S
que vous trouverez un trésor. - Nombre de simulations exécutées: 1000 fois
- Votre programme ne devrait pas prendre plus d'une seconde pour déterminer les mouvements.
- Votre programme ne doit pas quitter prématurément; il sera démarré exactement une fois.
- Assurez-vous que le tampon de sortie (le cas échéant) est vidé après chaque sortie.
- Les fichiers peuvent être écrits dans le dossier de votre bot (
./players/BotName/
). Le nom de votre bot est celui que vous nommez votre bot, avec tous les caractères non alphanumériques supprimés et écrits dans CamelCase. Les entrées peuvent enregistrer des données entre les exécutions du contrôleur, car les exécutions sont effectuées séquentiellement. - Votre programme doit quitter après réception
EXIT
. - Les programmes qui ne parviennent pas à compiler ou à lancer des erreurs ou à produire du texte non valide (pas au format de 5 caractères séparés par des virgules) peuvent être exclus du concours. Une nouvelle ligne doit suivre chaque sortie.
- Le contrôleur se trouve sur GitHub .
Veuillez inclure le nom du bot, la langue + la version, le code et la commande pour compiler (le cas échéant) et exécuter votre bot.
Exemple
Le texte émis par le programme est ici précédé d'un >
. Votre programme ne doit pas produire ce caractère.
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
Les scores de l'exemple ci-dessus sont:
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
Le gagnant est donc le joueur, bot 2. Notez que le gagnant n'a pas à survivre jusqu'au bout. (Notez également que le joueur aurait pu rester jusqu'au tour 30 le jour 1, car le camp ne serait pas plein jusqu'à ce que le joueur renvoie un autre bot).
Les scores
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
Les journaux sont disponibles sur GitHub . Les résultats de chaque essai sont disponibles sur cette feuille de calcul Google .