Voici un problème intéressant auquel j'ai pensé l'autre jour, qui implique des bits de code en concurrence avec d'autres bits de code non seulement dans une propriété du code, mais en jouant à un jeu contre ces autres bits de code.
Votre tâche consiste à créer un programme qui prend l'état actuel d'une planche Go et détermine le mouvement à effectuer ou à passer.
Votre programme acceptera les éléments suivants en entrée:
19 lignes, chacune avec 19 caractères, représentant les pièces actuellement sur le plateau Go. Un caractère
0
représente un carré vide,1
est noir et2
blanc.Deux nombres représentant le nombre de pièces de prisonnier que possède chaque joueur (noir, puis blanc).
Un nombre représentant à qui il revient de se déplacer (noir ou blanc). Comme ci-dessus,
1
est noir et2
blanc.
et sortez l'un des éléments suivants:
Une paire de coordonnées
a b
représentant les coordonnées auxquelles se déplacer.1 1
est le carré en haut à gauche, et les premier et deuxième nombres représentent respectivement le déplacement vers le bas et vers la droite.La chaîne
pass
, qui représente un mouvement à passer.
Par exemple, le programme peut recevoir l'entrée suivante:
0000000000000000000
0000000000000000000
0000000000000000000
0001000000000002000
0000000000000000000
0000000000000000000
0001210000000000000
0000100000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0002000000000001000
0000000000000000000
0000000000000000000
0000000000000000000
0 0 1
qui représente un jeu où seuls quelques coups ont été joués.
Ensuite, le programme pourrait sortir 6 5
, ce qui signifie "mettre une pierre noire sur le point 6e du haut et 5e de la gauche". Cela capturerait la pierre blanche à 7 5
. L'état du conseil changerait alors en:
0000000000000000000
0000000000000000000
0000000000000000000
0001000000000002000
0000000000000000000
0000100000000000000
0001010000000000000
0000100000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0002000000000001000
0000000000000000000
0000000000000000000
0000000000000000000
1 0 2
(Notez que bien qu'une pierre blanche ait été capturée, elle compte comme prisonnier pour du noir.)
Votre code doit en outre satisfaire les propriétés suivantes:
Si votre programme reçoit le même état d'entrée, il doit toujours produire la même sortie. C'est le déterminisme du Go AI. Il ne doit pas avoir de composante aléatoire.
Votre programme ne doit pas prendre plus de 60 secondes environ pour déterminer quel mouvement effectuer. Cette règle ne sera pas strictement appliquée en raison des variations de la puissance de calcul, mais elle doit se déplacer dans un délai raisonnable.
Le code source de votre programme ne doit pas dépasser un total de 1 mégaoctet (1 048 576 octets).
Votre programme doit toujours faire des démarches légales. Votre programme ne peut pas faire un mouvement là où une pierre existe déjà, et ne peut pas placer un morceau qui entraînerait la capture d'un groupe de ses propres pierres. (Une exception aux règles aux fins de ce défi est qu'un programme est autorisé à créer un poste qui était à l'origine là-bas - parce qu'il n'est donné que la position actuelle d'un tableau, il ne peut pas être prévu de stocker les mouvements qui ont été effectués avant.)
Votre soumission jouera alors dans un tournoi tout jouer contre toutes les autres soumissions, dans une partie de Go où l'état du plateau commence comme vide, et chaque programme à tour de rôle est alimenté à la position du plateau et fait un mouvement .
Chaque paire de soumissions jouera deux tours - un tour avec chaque joueur étant noir. Étant donné que les IA de ce problème sont complètement déterministes, deux des mêmes IA jouant ensemble entraîneront toujours exactement le même jeu.
Les conditions pour gagner sont les suivantes:
Si votre programme se joue jusqu'à la fin de la partie, les règles de score chinois de Go seront utilisées pour déterminer le gagnant. Aucun komi ne sera appliqué.
Si votre programme est lu au point qu'un état antérieur est atteint, provoquant ainsi une boucle infinie, les deux programmes seront déclarés liés.
Votre soumission sera notée par le nombre de points qu'elle marque par rapport aux autres soumissions. Une victoire vaut 1 point et une égalité vaut un demi-point. La soumission avec le plus de points est le gagnant général.
Il s'agit d'un défi de taille, dans lequel n'importe qui peut publier une nouvelle inscription à tout moment, et le classement sera réévalué périodiquement lorsque cela se produira.
la source
Réponses:
Voici mon entrée pour lancer ce défi. Code Python:
Selon vos règles, toujours jouer "pass" est une stratégie valide (quoique mauvaise).
la source
Java: choisissez un endroit, n'importe quel endroit
Choisit simplement les taches sur le tableau pour tester la validité. Il utilise le PRNG, mais avec une graine définie, c'est donc déterministe. Il utilise différents segments du cycle PRNG en fonction du nombre de tours passés.
Pour chaque poste candidat, il vérifie que c'est un coup valide (mais pas que c'est un coup intelligent ). Si ce n'est pas le cas, il passe au candidat suivant. S'il ne trouve pas de coup valide après 1000 essais, il passe.
la source
Certains Scala:
En lisant Wikipédia, je pense que cela battra la solution actuelle.
la source
1 1
etpass
).1 1
, car le programme est toujours exécuté à chaque fois que la carte change.Java
Choisit le premier espace vide. Victoires contre l'une des IA au moment de la publication.
la source
1 1
serait capturée par des blancs (maintenant vides) et ne pourrait pas être jouée par des noirs au tour suivant.