Contexte
Hex est un jeu de stratégie abstrait à deux joueurs joué sur un K×K
losange de tuiles hexagonales. Deux côtés opposés du losange sont de couleur blanche, et les deux autres noirs, et les deux joueurs, noir et blanc, se relaient en plaçant un jeton de leur couleur sur une tuile inoccupée. Le joueur qui réussit le premier à construire un chemin entre les côtés opposés de sa couleur est le gagnant. Il est connu que le jeu ne peut pas se terminer par un match nul et que le premier joueur a une stratégie gagnante quelle que soit la taille du plateau (voir la page Wikipedia pour plus de détails).
La tâche
Dans ce défi, nous fixons la taille de la carte à K = 4
et représentons la carte comme la grille suivante. Les lignes épaisses indiquent les tuiles adjacentes.
Votre tâche consiste à produire une stratégie gagnante pour le premier joueur, que vous pouvez choisir d'être noire ou blanche. Cela signifie que quels que soient les mouvements légaux du joueur adverse, votre jeu doit aboutir à une victoire. Votre entrée est une position de jeu (l'arrangement des jetons sur le plateau) et votre sortie est un mouvement légal, dans le format spécifié ci-dessous. Si vous voulez trouver vous-même une stratégie gagnante, ne lisez pas ce spoiler:
Esquisse d'une stratégie gagnante possible, en supposant que le blanc passe en premier. Sélectionnez d'abord 5. Après cela, si vous avez un chemin de 5 à la ligne inférieure OU le noir sélectionne 0 ou 1 à tout moment, répondez en sélectionnant celui de 0 ou 1 qui est vacant. Si le noir sélectionne 9 ou 13, sélectionnez 10, puis celui de 14 ou 15 est vacant. Si le noir ne sélectionne pas 9, 13 ou 14, sélectionnez 9 et le suivant, le 13 ou le 14 étant vacant. Si le noir sélectionne 14, répondez en sélectionnant 15. Ensuite, sélectionnez 10 s'il est vacant; si le noir sélectionne 10, répondez par 11. Si le noir sélectionne alors 6, répondez par 7, et le suivant de 2 ou 3 est vacant. Si le noir ne sélectionne pas 6, sélectionnez-le, vous avez donc un chemin de 5 à la ligne du bas.
Entrée et sortie
Votre entrée est une chaîne de 16 caractères WBE
, qui signifie blanc, noir et vide. Ils représentent les tuiles du plateau, comme énuméré ci-dessus. Vous pouvez choisir la méthode d'entrée (qui détermine également votre méthode de sortie) parmi les options suivantes:
- Entrée depuis STDIN, sortie vers STDOUT.
- Entrez comme un argument de ligne de commande, sortie vers STDOUT.
- Entrer en tant que 16 arguments de ligne de commande à un caractère, sortir sur STDOUT.
- Entrée comme argument de la fonction nommée, sortie comme valeur de retour.
Votre sortie représente la tuile sur laquelle vous placez votre prochain jeton, car c'est à votre tour de vous déplacer. Vous pouvez choisir parmi les formats de sortie suivants:
- Un index basé sur zéro (comme utilisé dans l'image ci-dessus).
- Un index à base unique.
- La chaîne d'entrée avec une
E
remplacée par celleW
ou celle queB
vous avez choisie pour votre lecteur.
Règles
Votre stratégie doit être déterministe. Vous n'êtes pas obligé de gérer correctement les positions de jeu qui sont inaccessibles à partir du plateau vide en utilisant votre stratégie, ou les positions qui gagnent déjà pour l'un ou l'autre joueur, et vous pouvez planter dessus. À l'inverse, sur les tableaux accessibles à l'aide de votre stratégie, vous devez retourner un coup légal.
C'est le code-golf, donc le nombre d'octets le plus bas l'emporte. Les failles standard ne sont pas autorisées.
Essai
J'ai écrit un contrôleur Python 3 pour valider les entrées, car il serait extrêmement fastidieux de le faire à la main. Vous pouvez le trouver ici . Il prend en charge les trois premiers formats d'entrée et les fonctions Python 3 (les fonctions dans d'autres langues doivent être intégrées dans des programmes), les trois formats de sortie et les deux lecteurs. Si une stratégie ne gagne pas, elle produira une partie perdante trouvée, vous pouvez donc modifier votre programme.
Incorrect response 'WWWWWWWWBBBBBBBB' to message 'WWWWWWWWBBBBBBBB'.
J'aurais dû gagner depuis longtemps, ou je me trompe?Réponses:
Marbelous, 973b
Il s'agit d'une mise en œuvre naïve de la stratégie suggérée dans la question. Il s'attend à ce que la carte soit fournie en tant que 16 paramètres de ligne de commande / carte mère comme
hex.mbl B W E E E W E E E B E E E E E E
et il affichera la position indexée zéro du prochain mouvement du blanc.Je pense que je peux probablement jouer au golf à environ 200 caractères avec une meilleure ramification et l'élimination de la réutilisation du code.
la source
Python 3, 100b
La stratégie consiste à rechercher d'abord un
B
sur le tableau. S'il n'y en a pas, cela revient-1
, ce qui en python est le même quelast index
. Ainsi, sur un plateau vide, mon premier index seraindex=-1
, c'est là que je commence à bouger.Si le champ à ma gauche (
index-1
) est libre, mon prochain mouvement y va. Si c'est pris, je monte à gauche. Je n'ai jamais à monter: si je le fais, je perds le rythme et je perdrai la partie.En pension complète (nulle
E
part), je ne bouge pas.Le
print
semble un peu bizarre au début: je dois construire le nouveau conseil d' administration (ce que je fais par découpage en tranches) , mais je dois couper 16 caractères. C'est une relique car je travaille avec des indices négatifs etb[i+1:]
je vais donc retourner la planche de trous et le reste que j'attends, ce qui rend important de couper le reste. Une autre façon aurait été de travailler avec des indices positifs, par exemple en prenant(b.find('B')+16)%16
, mais(+16)%16
c'est un octet de plus que()[:16]
.Non golfé:
Tester
Lors de l'exécution de la suite de tests du contrôleur hexadécimal, j'ai rencontré un comportement étrange:
Je pense que j'aurais dû gagner après le 4ème tour ou répondre avec la même planche à une pension complète devrait être une réponse correcte. Je ne sais pas ce qui ne va pas là-bas, je n'ai pas plongé beaucoup plus profondément - je voulais juste vérifier si j'avais couvert tous les cas "spéciaux". Mais comme je n'ai pas à dissimuler des situations où quelqu'un commence sur l'espace 4 ou plus, cela n'a pas d'importance de toute façon.
85b
Cependant, si je m'autorise à ne pas rechercher une carte complète (c'est-à-dire en laissant de côté le
'E' in b
je peux simplifier davantage le code pour n'utiliser que 85 octets:Cela conduira cependant aux éléments suivants:
Cela pourrait ou non être compté, et puisque j'ai trouvé que ce n'était pas un mouvement valide, j'ai décidé d'aller chercher la réponse plus longue mais plus correcte.
la source