Bounties
N ° 1 ( attribué )
Je jetterai 50 répétitions pour la première réponse valide
N ° 2 ( attribué )
Je vais ajouter 100 autres représentants pour la réponse valide la plus courte.
N ° 3 ( ouvert aux soumissions )
Je jetterai 200 rep pour le premier avec une réponse valide plus courte significative. Significatif représentant au plus 45% de la réponse actuellement la plus courte ( 564 octets x 0,45 = max 254 octets ).
Le jeu
Vous vous souvenez du jeu classique " Nine Men's Morris " ou simplement " Mill "? Il y a une variation appelée Three Men's Morris qui est un peu comme un tic-tac-toe mutable.
Règles
Voici le tableau blanc du jeu:
a b c
1 [ ]–[ ]–[ ]
| \ | / |
2 [ ]–[ ]–[ ]
| / | \ |
3 [ ]–[ ]–[ ]
[ ]
est un champ et |–/\
représente les routes entre ces champs.
Le jeu est joué par deux joueurs 1
et 2
qui placent chacun 3 jetons sur le plateau. Cela s'est déjà produit et nous sommes dans le coup. La partie est gagnée si un joueur peut former une mill
qui est une rangée verticale ou horizontale des 3 jetons du joueur.
Les jetons peuvent être déplacés sur le plateau le long des lignes de connexion, selon cette règle:
Vers toute position vide adjacente (c'est-à-dire d'une position de bord au centre, ou du centre à une position de bord, ou d'une position de bord à une position de bord adjacente
Un joueur doit effectuer un mouvement à moins qu'il n'y ait aucune position vide adjacente, auquel cas le mouvement est ignoré.
Le défi
Vous êtes joueur 1
et votre coup est le suivant. Écrivez un programme ou une fonction qui détermine si:
- vous pouvez forcer une victoire avec 2 coups ou moins ( victoire définitive )
- vous pouvez gagner avec 2 coups ou moins, si votre adversaire fait une erreur ( victoire possible )
- vous ne pouvez pas gagner avec 2 coups ou moins, car vous aurez besoin de plus de coups ou parce que les coups forcés conduisent votre adversaire à gagner ( impossible de gagner )
Exigences
- Même si vous gagnez définitivement lorsque vous ennuyez votre adversaire à mort, votre programme doit se terminer dans un temps fini.
- Vous pouvez écrire un programme ou une fonction.
Contribution
Les joueurs sont représentés par 1
et 2
. 0
définit un champ libre. Vous pouvez prendre l'entrée comme une matrice ou un tableau.
Précis
A B C D
2 1 0 | 2 1 0 | 1 0 1 | 1 2 2
2 1 2 | 0 1 0 | 1 0 2 | 2 1 O
0 0 1 | 2 2 1 | 0 2 2 | O O 1
A: [2,1,0,2,1,2,0,0,1]
B: [2,1,0,0,1,0,2,2,1]
C: [1,0,1,1,0,2,0,2,2]
D: [1,2,2,2,1,0,0,0,1]
Possible
A B C
1 0 1 | 1 0 1 | 1 2 2
1 2 2 | 1 2 0 | 0 0 1
2 0 0 | 2 0 2 | 2 1 0
A: [1,0,1,1,2,2,2,0,0]
B: [1,0,1,1,2,0,2,0,2]
C: [1,2,2,0,0,1,2,1,0]
Impossible
A B
1 0 0 | 1 2 0
1 2 2 | 2 1 0
2 0 1 | 1 2 0
A: [1,0,0,1,2,2,2,0,1]
B: [1,2,0,2,1,0,1,2,0]
Production
Votre programme devrait afficher / renvoyer un smiley:
- Victoire définitive:
:)
- Victoire possible:
:|
- Impossible de gagner:
:(
Exemples
Victoire définitive en deux coups:
[2][1][ ] 1. [2][1][ ]
[2][1][2] -> [2][1][2]
[ ][ ][1] [ ][1][ ]
[2][1][ ] 1. [2][1][ ] [ ][1][ ] 2. [ ][ ][1]
[ ][1][ ] -> [ ][ ][1] -> [2][ ][1] -> [2][ ][1]
[2][2][1] [2][2][1] [2][2][1] [2][2][1]
[1][ ][1] 1. [ ][1][1] [ ][1][1] 2. [1][1][1]
[1][ ][2] -> [1][ ][2] -> [1][ ][2] -> [ ][ ][2]
[ ][2][2] [ ][2][2] [2][ ][2] [2][ ][2]
Victoire possible en deux coups:
[1][ ][1] 1. [ ][1][1] [ ][1][1] 2. [1][1][1]
[1][2][ ] -> [1][2][ ] -> [1][2][2] -> [ ][2][2]
[2][ ][2] [2][ ][2] [2][ ][ ] [2][ ][ ]
[1][ ][1] 1. [ ][1][1] [ ][1][1] 2. [1][1][1]
[1][2][ ] -> [1][2][ ] -> [1][2][2] -> [ ][2][2]
[2][ ][2] [2][ ][2] [2][ ][ ] [2][ ][ ]
[1][2][2] 1. [ ][2][2] [2][ ][2] 2. [1][2][2]
[ ][ ][1] -> [1][ ][1] -> [1][ ][1] -> [1][1][1]
[2][1][ ] [2][1][ ] [2][1][ ] [2][ ][ ]
Impossible de gagner en deux coups:
[1][ ][ ]
[1][2][2]
[2][ ][1]
Prime
Dans le cas où une victoire définitive est possible et que votre programme génère les mouvements d'une manière vers le succès ainsi que a1:a2
(1 mouvement) ou a1:a2,a3:b2
(2 mouvements), vous pouvez retirer 30% de votre nombre d'octets.
C'est le golf de code - donc la réponse la plus courte en octets l'emporte. Les failles standard ne sont pas autorisées.
Merci à Peter Taylor qui a corrigé quelques défauts et amélioré la formulation dans le bac à sable .
la source
[1,0,0,2,1,0,2,2,1]
, le joueur 2 ne peut pas bouger - est-ce une victoire pour le joueur 1?Réponses:
Haskell,
580564441 octetsC'est jusqu'où je peux jouer au golf pour l'instant. Je ne sais pas si les autres langues peuvent le battre.
Appelez
m
sur une liste de listes comme[[2,1,0],[2,1,2],[0,0,1]]
(Definite A).Code de test:
mapM_ m al
Retour:la source
C # -
739663 octetsProgramme complet, lit les entrées de argv et semble fonctionner. Exécutez-le comme
Si cette méthode de saisie est inacceptable, je serai heureux de la changer (jamais comme utiliser argv).
J'étais peu enclin à publier cela hier, parce que je n'ai pas pu le faire beaucoup (pas beaucoup de temps, et je pourrais être hors de l'entraînement), mais comme il n'y a pas encore eu de réponse, je ' Je le posterai de toute façon, je ne m'attends certainement pas à la prime, je préfère qu'il soit remis à quelqu'un qui a mis un peu plus d'effort dans le leur avant de poster!
Edit: a remplacé tous les bools par des ints, ce qui m'a permis de mieux utiliser Linq et a réussi à réduire les deux boucles foreach, ce qui a permis de réaliser de grosses économies. Je suis légèrement étonné que le
h
compteur fonctionne ... ++ est un utilitaire si subtil.Le programme est très simple, il explore simplement tous les mouvements possibles (stocke l'état de la carte dans une chaîne []). Il itère sur tous nos mouvements possibles (les planches qui en résultent), et compte le nombre de réponses de notre adversaire que nous pouvons battre avec succès (
G
) (c'est-à-dire celles que nous gagnons, et il ne le fait pas). Il compte également le nombre de réponses possibles (h
). Si nous pouvons en gagner, alors c'est possible, et nous ajoutons 1 à la somme, si nous pouvons tous les gagner, c'est un certain, et nous ajoutons 2 à la somme. Le maximum est donc notre meilleur résultat possible, et nous indexons dans la chaîne "(|))" pour retourner le visage approprié. Notez que nous avons besoin de l'extra ")" car la somme peut être de 2 ou 3 si c'est un certain (il est possible que nous ne semblions pas pouvoir battre les réponses ayant déjà gagné au premier coup, donc le contrôle possible est un peu trompeur).Le programme recherche une victoire en produisant une chaîne à partir du tableau, c'est-à-dire des lignes et des colonnes séparées par des espaces, et recherche simplement une chaîne de 3 caractères du joueur dans cette chaîne (par exemple "201 201 021 220 002 111" est un gagner pour nous)
Voici mon script de test:
Quelles sorties
la source
PowerShell
576550 octetsJe ne serai pas si facilement dissuadé - si je ne peux pas obtenir un C # inférieur à 631 octets, je devrai utiliser un autre langage à la place! J'espère que Leif Willerts supprimera 5 octets de sa réponse, parce que j'ai décidé que je n'aimais pas trop PowerShell, peut-être que je dois le regarder objectivement en termes de nombre d'octets ...
Ceci est un script, vous l'exécutez
. .\mill.ps1 "201102021"
. C'est plutôt une copie de ma réponse C #, uniquement dans un langage avec lequel j'ai peu d'expérience. Je n'ai pas fait trop d'efforts pour jouer au golf, car il a fallu si longtemps pour commencer à travailler, et il est déjà raisonnablement compact.Edit: ne pouvait pas simplement laisser ces
[Math]::Floor
appels là-dedansSi vous avez une description de la façon dont cela fonctionne ... la réponse C # est pour vous, mais j'espère que les commentaires la rendent suffisamment claire. Les points-virgules peuvent ne pas correspondre parfaitement à la commande sur une seule ligne, je ne sais pas encore où ils sont nécessaires et ne le sont pas, et je ne les ai pas recopiés lorsque j'ai mis le tout sur une seule ligne.
Script de test (PowerShell):
Sortie de celui-ci:
la source
Python 3,
566557 octetsJe vais devoir voir si je peux jouer plus loin, ou si je peux obtenir le bonus de 30%, mais après beaucoup de procrastination, voici ma réponse.
Non golfé:
la source