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 .
la source
Réponses:
Bob - C ++
Compiler:
Courir:
la source
Statisticiens, Python 3
Les statisticiens travaillent toujours ensemble. Au premier tour, ils retournent au camp lorsque les deux tiers de leurs adversaires l'ont fait. Lors des tours suivants, ils s'appuient sur les données qu'ils ont collectées lors des tours précédents pour prédire les habitudes des autres domestiques et essayer de retourner au camp au dernier moment sûr.
Programme
Comme vous pouvez le voir, j'ai volé sans vergogne la structure du programme à @Mike Sweeney.
Commander
EDIT: correction d'un bug dans le chèque de retour à la maison. Ils devraient mieux fonctionner maintenant.
EDIT 2: Les statisticiens sont maintenant plus intelligents qu'avant: ils gardent une trace des domestiques qui sont retournés au camp dans la journée en cours et ajustent leurs prévisions en conséquence. De plus, ils prennent plus de risques, retournant au camp quand il reste 3/4 des serviteurs mourants. Cela les pousse vers le haut (à peine; Bob est devenu très dangereux).
la source
Ivrognes, Perl 5
Un peu trop d'alcool et ils ne retrouveront jamais le chemin du camp.
Cette entrée est principalement un exemple, mais participera.
Programme
Commander
la source
$status[$i] eq 'A' ? 'S' : 'D';
être$status[$i] eq 'A' ? 'S' : 'N';
conforme aux spécifications?Oiseaux du matin
L'oiseau en avance attrape le vers!!!
Edit: fait en sorte que n'importe qui puisse facilement le sous-classer. Redéfinissez simplement
doMove(int playerNumber)
votre propre bot. J'ai ajouté plusieurs champs et méthodes utiles. Je l'ai testé intensivement. Il n'enregistre pas les statuts des simulations précédentes. Veuillez me dire s'il y a des problèmes.Compiler avec:
javac ./players/MorningBirds/MorningBirds.java
Courir avec:
java players.MorningBirds.MorningBirds
la source
R
) un jour donné mourra toujours ce jour-là.Randomiseurs - Ruby
Juste pour gâcher les bots statistiques, les randomiseurs sont assez imprévisibles. Ils reviennent tous en même temps, à un tour aléatoire pour tenter de bloquer les autres.
(Pas influencé par les autres joueurs.)
la source
Fous errants, Python 2
Il s'agit d'un simple robot Python qui envoie les serviteurs jusqu'à ce qu'une heure "goback" prédéfinie soit atteinte, puis ils essaient d'entrer dans le camp et de rester jusqu'au lendemain.
C'est également un cadre de base pour des robots plus complexes que d'autres pourraient souhaiter utiliser. Il n'est cependant pas testé avec le moteur de jugement, alors faites-moi savoir si j'ai fait une erreur.
Programme
Commander
Modifier: modification du code de décision de l'action après clarification des règles.
la source
Évolué
J'ai utilisé la programmation génétique (via JGAP) pour créer ce bot. Il est venu avec une réponse simple qui bat tous les autres (à peine).
Compiler avec:
javac players/Evolved/Evolved.java
Courir avec:
java players.Evolved.Evolved
Edit: Grrr ... Bob m'a foiré !!!
Edit: Ouais !!! Bob, a été tué par une peste désagréable !!!
la source
SlowReturners - Ruby
Renvoie un serviteur tous les 5 tours.
la source
Peste
La peste est une maladie. Ce n'est pas rationnel. C'est prévisible. Les maladies ne peuvent pas collecter de trésors, ni se soucier des trésors. La peste rend les autres joueurs malades. Les sages restent à la maison et oublient le trésor. Les insensés sont toujours stupides et n'obtiendront jamais beaucoup de trésors. Evolved est (heureusement) immunisé contre la peste. Il est également sage. Il va chercher des trésors et ne meurt pas.
Compiler avec:
javac players/Plague/Plague.java
Courir avec:
java players.Plague.Plague
Bob et les statisticiens résistent désormais à la peste.
la source