À l'avenir, lorsque le voyage dans le temps (abrégé en TT) sera courant, le lancer de pièces deviendra un sport mental sérieux. Pour préparer l'avenir, nous créons un concours de programmes où les voyages dans le temps se feront vraiment du point de vue des participants.
Le concours est un tournoi à la ronde King of the Hill consistant à lancer des matchs entre les classes Java.
Règles du match de lancer de pièces
- Il y a deux joueurs et 100 tours.
- À chaque tour, une pièce est lancée et en fonction du résultat, l'un des joueurs marque 1 point. Chaque joueur a 50% de chances de marquer un point.
- Après le lancer, les deux joueurs ont la possibilité de contrôler le temps en tirant sur les leviers.
- Si vous tirez sur un levier bleu (butée de retour), aucun TT n'est possible pour le tour auquel le levier a été utilisé ou pour tout tour précédent. La tentative de TT d'aller à ces tours n'aura aucun effet.
- Si vous tirez sur un levier rouge (inverseur), vous essayez de ramener le temps à un ancien tour. En cas de réussite, la mémoire de l' adversaire sera rétablie dans sa mémoire avant le tour choisi et les résultats du tirage au sort à partir du tour choisi seront également supprimés . Le seul signe possible pour votre adversaire au sujet du TT sera le nombre de ses leviers inutilisés qui ne seront pas inversés.
- Chaque joueur dispose de 5 leviers bleus et 20 rouges inutilisés au début du match. Ces leviers ne sont pas affectés par les TT.
- Si aucun TT ne se produit à la fin d'un 100e tour, la partie se termine et le joueur avec le score le plus élevé gagne.
Détails
- Les rondes ont une indexation basée sur 1 (de 1 à 100).
- Avant le tour,
x
vous disposez du nombre de leviers bleus et rouges disponibles, le résultat du lancer de pièces jusqu'au tourx
(inclus) et la mémoire de votre (dernier)x-1
tour. - Tirer un levier bleu en round
x
arrête tous les TT qui ont une destination au roundx
ou avant (cela bloque un TT si cela se produit également sur ce même round). - Revenir au tour
x
signifie que le prochain tour sera rondx
. - Si les deux joueurs choisissent de revenir à la fin d'un tour, le temps revient à la destination précédente qui n'est pas bloquée. Le ou les joueurs qui ont tenté de revenir à cette heure garderont leur mémoire.
Détails techniques
- Vous devez écrire une classe Java implémentant l'interface Bot fournie.
- Ajoutez votre bot au projet.
- Ajoutez une instance de votre Bot au
Bot
fichierController.java
. - Votre classe ne doit pas conserver d'informations entre les appels . (Dans la plupart des cas, le fait de n'avoir que des
final
variables en dehors des fonctions satisfait à cette exigence.) - Vous pouvez donner des informations au contrôleur dans le
memory
champ de votreAction
objet retourné . Cela vous sera rendu au tour suivant si aucun TT ne s'est produit. Si un TT se produit, vous recevrez votre mémoire antérieure correspondante. - Vous pouvez utiliser la
totalScore()
méthode de laGame
classe pour obtenir le score d'une chaîne d'historique.
Protocole
A chaque tour, votre
takeTurn(...)
méthode est appelée avec 5 arguments:- le nombre de leviers bleus inutilisés
- le nombre de leviers rouges inutilisés
- l'historique de lancer de pièces, une chaîne composée de 1 et de 0 marquant vos victoires et vos pertes lors des tours précédents. Le premier caractère correspond au premier lancer de pièces. (Au premier tour, la longueur de la chaîne sera
1
.) - une chaîne, votre mémoire stockée du tour précédent
- l'indice basé sur 1 de ce tour
A chaque tour, votre méthode retourne un
Action
objet contenantun entier dans le
move
champ décrivant votre action:0
pour aucune action-1
pour tirer un levier bleu et bloquer les TT qui traversent ce tour- un entier positif
x
, pas plus grand que le tour en cours, pour tirer un levier rouge et essayer de revenir au tourx
- Les entiers non valides sont traités comme
0
.
une chaîne contenant votre mémoire de ce tour que vous souhaitez conserver. Notez que le stockage de la mémoire n'est pas une partie cruciale du défi . Vous pouvez faire de bonnes entrées sans stocker de données utiles dans la chaîne. Au premier tour, la chaîne sera une chaîne vide.
Votre méthode ne devrait pas prendre plus de 10 ms par tour en moyenne dans un match.
- Le non-respect régulier du délai entraîne la disqualification.
Notation
- Gagner un match rapporte 2 points et un match nul rapporte 1 point aux deux joueurs. La perte ne rapporte aucun point.
- Le score d'un bot sera le nombre total de points qu'il a collectés.
- Le nombre de matchs joués entre chaque paire de candidats dépendra du nombre de participations et de leur vitesse.
Deux exemples de robots simples sont affichés comme réponses.
Le contrôleur et les deux premiers robots sont disponibles ici .
Résultats des tests avec des bots soumis jusqu'au 3 novembre:
Scores totaux:
Oldschool: 3163
Random: 5871
RegretBot: 5269
Nostalgia: 8601
Little Ten: 8772
Analyzer: 17746
NoRegretsBot: 5833
Oracle: 15539
Deja Vu: 5491
Bad Loser: 13715
(Le contrôleur est basé sur le contrôleur du défi Cat catcher . Merci pour @flawr de le fournir comme base pour celui-ci.)
Bonus: un joli film de 6 minutes basé sur un concept similaire.
la source
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.
Qu'est-ce que "passer par un tour"?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.
Réponses:
Analyseur
Cela analyse le passé pour faire les meilleures prévisions pour l'avenir.
EDIT: évite les temps de levier bleus. Utilise efficacement les leviers bleus. Utilise plus efficacement les leviers rouges. Ajout de la peur pour la saison d'Halloween.
EDIT: corrigé par 1 erreur.
EDIT:
computeWinningProbability
Fonction améliorée . Utilise désormais des leviers rouges et bleus plus agressivement.Score (depuis le 2 novembre):
la source
Nostalgie
Non testé, juste un coup rapide pour essayer de faire un bot difficile à bloquer (car il décide quand tirer le levier rouge principalement au hasard) mais qui prend des décisions décentes.
Edit: j'ai raté cette règle:
Cela semble être une bonne raison d'utiliser de la mémoire - si vous vous souvenez avoir essayé de TT à un tour donné, vous avez peut-être échoué, vous ne devriez donc pas essayer de revenir à ce tour. J'ai édité mon bot pour essayer d'éviter cela.
la source
Oracle
J'ai copié sans vergogne du code à partir d'Analyzer (pour analyser la mémoire). Cette soumission essaie de tirer un levier bleu au début, puis renforce lentement son avance. Je pense que les performances de ce bot compensent le code laid :)
la source
RegretBot
À la fin de
notre viele match, nous regrettons nos échecs passés, et essayons de revenir en arrière et de les réparer.la source
Little Ten
Little Ten multiplie et divise beaucoup par 10, en utilisant des nombres qui sont des multiples de 10, et en revenant aux tours qui sont des multiples de 10.
Edit: modification de la mécanique un peu maintenant que l'explication de ce qui se passe lorsqu'un levier bleu est tiré est plus claire. A également fait un peu de rééquilibrage.
la source
Aléatoire
La stratégie de Random est la suivante:
la source
NoRegretsBot
la source
Mauvais perdant
Ce bot n'utilise aucune mémoire et est étonnamment bon (mais il ne bat pas Analyzer ou Oracle).
la source
Vieille école
Ce bot ne fait jamais aucune action car Oldschool ne croit pas au voyage dans le temps.
la source
Deja Vu Bot
Ce bot essaie de suivre quand il tire le bleu pour éviter que le rouge ne tire dans cette région. Ne tirera les leviers rouges qu'en cas de retard significatif dans le score.
la source