Résultats (22 mai 2017 21:40:37 UTC)
Master
a gagné 18 rounds, a perdu 2 rounds et à égalité 0 rounds a
Save One
gagné 15 rounds, a perdu 3 rounds et a égalé 2 rounds a
Machine Gun
gagné 14 rounds, a perdu 3 rounds, et a égalé 3 rounds a
Monte Bot
gagné 14 rounds, a perdu 3 rounds et a égalé 3 rounds a
Amb Bot
gagné 12 tours, perdu 8 tours, et attachés 0 tours
Coward
gagnés 11 tours, la perte de 3 tours, et attachés 6 tours
Pain in the Nash
gagné 11 tours, a perdu 9 tours, et attachés 0 tours
Nece Bot
gagnés 10 tours, perdu 7 tours, et attachés 3 tours
Naming Things is Hard
gagnés 10 tours, perdu 7 rounds et égalité 3 rounds a
The Procrastinator
gagné 10 rounds, a perdu 8 rounds et égalité 2 rounds a
Yggdrasil
gagné 10 rounds, a perdu 10 rounds, et égalité 0 rounds a
Simple Bot
gagné 9 rounds, a perdu 4 rounds, et a égalé 7 rounds a
Table Bot
gagné 9 rounds tours et égalité 5 tours a
Prioritized Random Bot
gagné 8 tours, a perdu 7 tours et égalité 5 tours
Upper Hand Bot
a gagné 7 rounds, a perdu 13 rounds et a égalé 0 rounds a
Aggressor
gagné 6 rounds, a perdu 10 rounds, et a égalé 4 rounds a
Insane
gagné 5 rounds, a perdu 15 rounds, et a égalé 0 rounds a
The Ugly Duckling
gagné 4 rounds, a perdu 16 rounds, et a égalé 0 rounds a
Know Bot
gagné 3 rounds, perdu 14 rounds, et égalité 3 rounds a
Paranoid Bot
gagné 0 rounds, 19 défaites et 1 match nul
Panic Bot
et a égalé 1 round
Malheureusement, je n'ai pas pu tester The Crazy X-Code Randomess car je n'arrive pas à le faire fonctionner à partir de bash sous Linux. Je vais l'inclure si je peux le faire fonctionner.
Le jeu
Ceci est un jeu KoTH très simple. C'est un combat de boules de neige en tête-à-tête. Vous avez un conteneur initialement vide qui peut contenir des k
boules de neige. Vous pouvez esquiver à j
certains moments. À chaque tour, il est demandé aux deux joueurs de donner simultanément le choix du coup à effectuer. Il y a trois mouvements:
- reload: vous donne une autre boule de neige (jusqu'à
k
) - lancer: lance une boule de neige, qui tuera l'autre joueur s'il décide de recharger. Si les deux joueurs lancent une boule de neige, personne ne meurt (ils ont un si bon but qu'ils vont se toucher les uns les autres)
- canard: ne fait rien et évite de se faire toucher si l'autre joueur lance une boule de neige. Si vous n'avez plus de canards, rien ne se passe et si l'autre joueur lance une boule de neige, vous mourrez.
Objectif
Ne meurs pas
Challlenge Spécifications
Votre programme peut être écrit dans n'importe quelle langue. Vous devez prendre chacune de ces variables comme argument à chaque exécution:
[turn, snowballs, opponent_snowballs, ducks, opponent_ducks, max_snowballs]
turn
- combien de tours se sont écoulés ( 0
à la première itération)
snowballs
- combien de boules de neige vous avez
opponent_snowballs
- combien de boules de neige l'adversaire a
ducks
- combien de fois vous pouvez esquiver
opponent_ducks
- combien de fois il peut esquiver
max_snowballs
- le nombre maximum de boules de neige que vous pouvez magasin ( k
)
La sortie de la fonction clé doit être 0
pour recharger, 1
lancer et 2
canard. Vous devez sortir votre mouvement, newline terminé. Veuillez ne pas générer de mouvements non valides, mais le contrôleur est très résistant et ne se cassera pas si vous générez des mouvements non valides (même si votre mouvement n'est même pas un entier). Cependant, il doit être terminé par une nouvelle ligne. Si le coup n'est pas [0, 1, 2]
dedans, votre coup par défaut sera0
. Le gagnant sera désigné comme le joueur ayant le plus de victoires dans un tournoi à la ronde complet.
Règles
Vous pouvez lire / écrire depuis / dans un fichier pour le stockage en mémoire entre les itérations. Votre bot sera placé dans son propre répertoire afin d'éviter les conflits de noms de fichiers. Vous ne pouvez pas modifier les fonctions intégrées (telles que le générateur aléatoire). C'était assez amusant la première fois , mais ça ne le sera plus. Votre programme n'est pas autorisé à faire des choses qui ne font que blâmer l'exécution de façon flagrante. Des échappatoires standard s'appliquent .
Essai
Le code source du contrôleur peut être trouvé ici . Exemple d'utilisation: java Controller "python program1/test1.py" "python program2/test2.py" 10 5
pour 10 boules de neige et 5 canards.
Juger
Le gagnant sera choisi en sélectionnant la personne ayant le plus de victoires après un tournoi à la ronde complet. Bien que ce soit une égalité, retirez toutes les personnes qui n'ont pas le plus de victoires. Ensuite, répétez jusqu'à ce qu'une personne gagne. La norme de jugement sera de 50 boules de neige et 25 canards.
Heureux KoTHing!
EDIT : La partie sera déclarée à égalité si 1000 tours sont passés. Votre bot peut assumer cela turn < 1000
.
la source
Réponses:
Maître, C #
J'ai formé un petit réseau de neurones (en utilisant Sharpneat ). Il semble aimer ramasser des boules de neige et esquiver ...
Dans une version précédente du contrôleur, il avait même trouvé un bogue. Il est passé de 0% à 100% lorsqu'il a découvert comment tromper.
Edit: J'ai oublié de réinitialiser l'état interal des réseaux et j'ai mal formé le réseau. Le réseau nouvellement formé est beaucoup plus petit.
la source
Économisez un, Python
Lance la plupart de ses boules de neige immédiatement, mais en garde toujours une au cas où l'adversaire guettait un manque de munitions. Ensuite, il évite le plus longtemps possible (encore une fois, en enregistrant 1) avant de recharger sauf s'il existe une garantie de rechargement ou de destruction garantie.
la source
PrioritizedRandomBot, Java
Ce bot sélectionne un entier aléatoire dans la plage
0
deos + od
, puis choisit l'une touche, le canard, ou recharge, avec les seuils déterminés par le nombre actuel de boules de neige et de canards.Une chose importante à comprendre est qu’une fois qu’un bot a plus de boules de neige que l’autre a boules de neige + canards, vous pouvez forcer la victoire. À partir de là, nous pouvons proposer le concept de "points":
Si l'un ou l'autre de ces chiffres devient positif, alors ce joueur est capable de forcer une victoire.
Le tableau "Différence de points" constitue le fondement de la théorie des jeux pour cette compétition. Il ne capture pas tout à fait toutes les informations, mais il montre comment les boules de neige sont fondamentalement plus utiles que les canards (car les boules de neige sont à la fois une attaque et une défense). Si votre adversaire lance une boule de neige et que vous réussissez à l'éviter, vous êtes sur le point de remporter une victoire forcée, car votre adversaire a utilisé une ressource plus précieuse. Ce tableau décrit également ce que vous devez faire dans de nombreux cas particuliers, par exemple lorsque certaines options de déplacement ne sont pas disponibles.
Le tableau "somme des points" montre comment, avec le temps, la somme des points s'approche de zéro (les deux joueurs étant à court de canards), le premier joueur à faire une erreur (recharger quand ils n'en ont pas besoin) immédiatement perd.
Maintenant, essayons d'étendre cette stratégie de forçage à des cas où elle n'est pas forcée (comme dans, nous gagnons de loin, mais la lecture de l'esprit par l'adversaire nous battra). Fondamentalement, nous avons des
s
boules de neige mais nous devons faire boule de neige à notre adversaires+1
(ous+2
, etc.) le temps consécutif pour gagner. Dans ce cas, nous voulons soit effectuer quelques canards ou quelques recharges pour gagner du temps.Pour le moment, ce bot essaie toujours de se faufiler dans certains canards, simplement parce qu’il ne risque donc pas une perte immédiate: nous supposons que l’adversaire suit une stratégie similaire consistant à lober autant de boules de neige qu’il peut. dangereux. En outre, afin d'éviter toute prévisibilité, nous souhaitons les intégrer en suivant une distribution uniformément aléatoire: la probabilité de canardage est liée au nombre de canards à exécuter par rapport au nombre de boules de neige à lancer.
Si nous perdons mal, dans ce cas,
s + d < os + od
nous devons insérer quelques recharges en plus d'utiliser tous nos canards. Dans ce cas, nous souhaitons recharger au hasard, mais seulement autant de fois que nécessaire.C'est pourquoi nos robots établissent des priorités dans l'ordre des lancers, des canards et des recharges, et utilisent
os + od
pour générer le nombre aléatoire, car il s'agit du nombre limite de déplacements que nous devons effectuer.Le bot gère actuellement un cas d'extrémité et deux autres cas spéciaux. Le cas de bord est lorsque l'adversaire n'a ni boules de neige ni canards, et donc la randomisation ne fonctionne pas, donc nous lançons si possible, sinon nous rechargeons. Un autre cas particulier est lorsque l’adversaire ne peut pas recharger et qu’il n’ya donc aucun avantage à lancer (étant donné que l’adversaire va se baisser ou se jeter), nous évitons toujours (car sauver nos boules de neige a plus de valeur que sauver nos canards). Le dernier cas particulier est celui où l'adversaire n'a pas de boule de neige. Dans ce cas, nous le jouons en toute sécurité et le rechargeons si possible.
la source
NeceBot - Python
Voici le tableau de la théorie de jeu pour le jeu:
Où
~
signifie aucun avantage,W
gagne,L
perd,+-S
signifie qu'une boule de neige est gagnée / perdue sur l'adversaire et+-D
qu'un canard est gagnée / perdue sur l'adversaire. C'est un jeu complètement symétrique.Notez que ma solution ne prend pas ce tableau en compte. Parce que je suis mauvais en maths.
Cela s'appelle le NeceBot parce qu'il essaie de réduire ce qui est nécessaire en premier. Il a ensuite des stratégies arbitraires qui, je l’espère, fonctionneront.
la source
<3
s lol. +1 pour avoir une table de jeu et ne pas l'utiliser: P mais bonne solution :)3 + opponent_snowballs <3
cela pourrait être une erreur?<3
s rend le code assez difficile à comprendre :(Lâche - Scala
Lance, si l'adversaire n'a pas de munitions, sinon (par ordre de priorité) les canards, les lancers ou les recharges.
la source
TheUglyDuckling - Python
Esquivera toujours jusqu'à ce qu'il ne puisse plus tenter de lancer si l'adversaire est vide ou de recharger si les deux sont vides. Rechargera en dernier recours.
la source
SimpleBot - Python 2
Des trucs simples.
la source
Le bot de nommage-choses-est-difficile - VB.NET
Nommer des choses est difficile, et je ne suis pas sûr d'avoir une stratégie cohérente pour le nommer.
Essaie de jouer les premiers tours pour obtenir une victoire rapide. Après cela, joue le reste du temps en toute sécurité, en essayant de gagner par attrition.
la source
MachineGun, Python 3
Essaie de sauver les boules de neige jusqu'à ce que soit la garantie de tuer l'adversaire, soit jusqu'à ce que les canards soient épuisés (dans ce cas, il commence à tirer aveuglément toutes ses boules de neige, comme une mitrailleuse)
Il se plie également chaque fois que l'adversaire a une boule de neige, car il ne veut pas mourir.
la source
Knowbot, Python3
Garde la fréquence des coups précédents, suppose que l’adversaire fera de nouveau le plus fréquent, se défend contre cela.
** Mise à jour pour ne pas s'attendre à des coups que l'adversaire ne peut pas faire **
la source
Braingolf , l'agresseur
L'agresseur n'est pas un lâche! S'il a une boule de neige, il doit lancer! S'il n'a pas de boule de neige, il en fera plus!
Braingolf , le fou
Ce n’est pas vraiment un bot, c’est juste un programmeur que j’ai kidnappé et obligé de transférer chaque projet qu’il a réalisé jusqu’à braingolf. Il n'a plus un soupçon de santé mentale.
Génère un nombre aléatoire inférieur à 3 et génère des sorties
t % r
où t est le tour actuel et r le nombre aléatoirePour les exécuter, vous devez télécharger à
braingolf.py
partir de github, puis sauvegarder le code braingolf dans un fichier et exécuterou insérez simplement le code directement comme ceci
Les entrées sont assez peu importantes tant que le deuxième argument après le code / nom de fichier correspond à la quantité de boules de neige dont dispose Aggressor.
Note: L’agresseur se comporte de manière identique au TestBot, je voulais juste faire une entrée dans braingolf
Braingolf , The Brainy [Cassé en ce moment]
la source
TestBot - Python
Ceci est une soumission test pour vous montrer à quoi peut ressembler une soumission valide. La stratégie: alterner le rechargement et le lancement. C'est une mauvaise stratégie, mais cela vous donne une idée de la façon dont votre programme devrait fonctionner.
la source
_, turn, snowballs, opponent_snowballs, ducks, opponent_ducks, max_snowballs = sys.argv
les arguments?sys.argv[1:]
si vous ne voulez pas jouer avec ça_
UpperHandBot, Python 3
Ce bot tente de collecter plus de boules de neige que son adversaire et commence à lancer. Si UHB n'a pas plus de boules de neige que son adversaire, il:
la source
Yggdrasli, Java
J'ai nommé ce bot "Yggdrasil" parce qu'il regarde en avant dans l'arbre du jeu et effectue une évaluation de l'état, à partir duquel il peut calculer une stratégie mixte approximativement idéale. Parce qu'il repose sur des stratégies mixtes, il est très non déterministe. Je ne sais pas si cela va bien se passer en compétition réelle.
Quelques choses à propos de ce bot:
la source
Douleur dans le Nash (C ++)
Ainsi appelé parce que le fait que je devais écrire mon propre solveur d'équilibre de Nash était une vraie douleur. Je suis surpris qu'il n'y ait pas de bibliothèques de résolution de Nash facilement disponibles!
Compiler en C ++ 11 ou supérieur. Pour les performances, il est bon de compiler avec le support OpenMP (mais ceci est juste pour la vitesse, ce n'est pas obligatoire)
Ceci utilise les équilibres de Nash pour décider quoi faire à chaque tour, ce qui signifie que théorie, il gagnera ou tirera toujours à long terme (sur de nombreux jeux), quelle que soit la stratégie utilisée par l'adversaire. Que ce soit le cas dans la pratique dépend de mon erreur dans la mise en œuvre. Cependant, comme cette compétition KoTH n’a qu’un seul tour contre chaque adversaire, elle n’ira probablement pas très bien au classement.
À l’origine, mon idée était d’avoir une fonction d’évaluation simple pour chaque état de jeu (chaque balle vaut + b, chaque canard est + d), mais cela pose des problèmes évidents pour déterminer quelle devrait être cette évaluation. agir sur les rendements décroissants de la collecte de plus en plus de balles, etc. Donc, au lieu de cela, cela va analyser tout l'arbre , en revenant du tour 1000, et complétera les évaluations réelles en fonction de la façon dont chaque jeu pourrait se dérouler.
Le résultat est que je ne sais absolument pas quelle stratégie cela utilise, à part quelques comportements "évidents" codés de manière irréversible (lancer des boules de neige si vous avez plus de balles que votre adversaire n'a de balles + canards, et recharger si vous êtes tous les deux dehors de boules de neige). Si quelqu'un veut analyser l'ensemble de données qu'il produit, j'imagine qu'il y a un comportement intéressant à découvrir!
Tester cela contre "Save One" montre qu’il gagne effectivement à long terme, mais seulement par une petite marge (514 victoires, 486 défaites, 0 nuls dans le premier lot de 1000 matchs, et 509 victoires, 491 défaites, 0 dessine dans la seconde).
Important!
Cela fonctionnera immédiatement, mais ce n'est pas une bonne idée. Il faut environ 9 minutes sur mon ordinateur portable moyennement développé par les développeurs pour générer l’arborescence complète du jeu. Mais cela enregistrera les probabilités finales dans un fichier une fois qu'elles seront générées. Après cela, chaque tour générera simplement un nombre aléatoire et le comparera à 2 octets, ce qui le rend ultra rapide.
Pour raccourcir tout cela, il suffit de télécharger ce fichier (3,5 Mo) et de le placer dans le répertoire contenant l'exécutable.
Ou vous pouvez le générer vous-même en exécutant:
Ce qui sauvera un fichier par tour, jusqu'à la convergence. Notez que chaque fichier fait 3,5 Mo et qu'il convergera au tour 720 (soit 280 fichiers, environ 1 Go), et comme la plupart des jeux ne se rapprochent pas du tour 720, les fichiers de pré-convergence ont une très faible importance.
la source
Swift - TheCrazy_XcodeRandomness
Malheureusement, cela ne peut être exécuté que localement, dans Xcode, car il contient le
Foundation
module et sa fonctionarc4random_uniform()
,. Cependant, vous pouvez à peu près dire en quoi consiste l'algorithme:la source
swift
commande et ensuite vérifiez si cela fonctionneFoundation
, désolé: /TableBot, Python 2
Appelé TableBot parce qu'il a été créé en implémentant cette table:
Un 1 signifie avoir 1 ou plus, un 0 signifie n'en avoir aucun.
Le bot:
Essayez-le en ligne!
la source
AmbBot - Schéma de la raquette
Je voulais surtout essayer d'utiliser
amb
, parce que c'est cool. Ce bot ordonne au hasard les options (recharger, lancer et esquiver), filtre celles qui n’ont pas de sens et choisit la première option. Mais avecamb
, on arrive à utiliser des continuations et des retours en arrière!J'ai également fait un petit programme de test pour exécuter deux de ces bots l'un contre l'autre. On a l'impression que le deuxième bot gagne plus souvent, alors j'ai peut-être commis une erreur quelque part.
la source
MonteBot, C ++
J'ai essentiellement pris le code de ce koth et l' ai modifié pour ce défi. Il utilise l'algorithme de recherche d'arbres Monte Carlo UCT découplé. Il devrait être assez proche de l'équilibre nash.
Instructions de compilation pour Linux:
Enregistrer dans
MonteBot.cpp
.Courir
g++ -o -std=c++11 MonteBot MonteBot.cpp
.Commande à exécuter:
./MonteBot <args>
la source
Le procrastinateur - Python 3
Le procrastinateur va tergiverser en jouant en sauvegarde les deux premiers tours. Soudain, le monstre panique veut éviter de perdre la guerre des ressources en contrant le coup le plus utilisé par ses adversaires.
la source
ParanoidBot et PanicBot - ActionScript3 ( RedTamarin )
D’un langage de niche peu adapté (avec des extensions pour fournir des arguments en ligne de commande), c’est Skullish ParanoidBot et son ennuyeux allié, PanicBot.
ParanoidBot
ParanoidBot a perdu la tête et doit compter sur une stratégie inutilement spécifique. Premièrement, il lance des boules de neige jusqu’à atteindre un seuil et en garde quelques-unes en réserve. Après trois canards prudents, la paranoïa s'installe et le bot tente de stocker plus de boules de neige entre des canards aléatoires. Après avoir reconstitué son stock, ParanoidBot recommence à lancer à l'aveuglette. En raison des voix dans sa tête, ParanoidBot peut dire s'il est assuré de gagner ou de perdre, et va "élaborer des stratégies" en conséquence.
Les bretelles sont un peu débiles pour aider à condenser la taille
PanicBot
PanicBot, déjà devenu fou, réagit par peur instinctive. Après avoir manqué de peur, PanicBot lance aveuglément toutes ses boules de neige, puis fabrique et lance désespérément d'autres boules de neige jusqu'à ce qu'il soit (probablement) vaincu.
Il s'agit d'une des moins de 15 autres entrées utilisant AS3 ici sur PPCG. Un jour, peut-être que cette langue sans doute exotique trouvera une énigme à dominer.
la source
snow.as
, les éléments suivants doivent fonctionner dans le$ ./redshell snow.as -- 0 50 50 25 25
chmod +x redshell
est votre ami ici ...Defender, Python
Recharge quand aucun joueur n'a de boule de neige. Si elle a des boules de neige, elle jette. S'il n'a pas de boule de neige, mais que l'adversaire en a une, elle se cache si elle le peut, sinon elle recharge.
Note: pas encore testé
la source