Créez le programme le plus court pour vérifier qui a gagné dans un jeu n d tic tac toe.
Votre programme devrait fonctionner lorsque n
(largeur) et d
(numéro de dimension) se trouvent dans ces plages:
n∈[3,6]∩ℕ ie a number from this list: 3,4,5,6
d∈[2,5]∩ℕ ie a number from this list: 2,3,4,5
n = 3; d = 2
(3 2 soit 3 par 3):
[][][]
[][][]
[][][]
n = 3; d = 3
(3 3 soit 3 par 3 par 3):
[][][]
[][][]
[][][]
[][][]
[][][]
[][][]
[][][]
[][][]
[][][]
n = 6; d = 2
(6 2 soit 6 par 6):
[][][][][][]
[][][][][][]
[][][][][][]
[][][][][][]
[][][][][][]
[][][][][][]
Etc.
Gagner (Si vous avez joué suffisamment de tic tac toe multidimensionnel, c'est la même chose.)
Pour qu'il y ait une victoire, un joueur doit avoir toutes les cases adjacentes le long d'une ligne. Autrement dit, ce joueur doit avoir des n
mouvements sur une ligne pour être gagnant.
Adjacent:
- chaque tuile est un point; par exemple (0,0,0,0,0) est un point
d=5
- les tuiles adjacentes sont des tuiles telles qu'elles sont les deux points sur la même unité d-cube. En d'autres termes, la distance de Chebyshev entre les tuiles est de 1.
- en d'autres termes, si un point
p
est adjacent à un pointq
, alors chaque coordonnée enp
s coordonnée correspondante en neq
diffère pas de plus d'un. De plus, au moins sur la paire de coordonnées diffère exactement d'un.
Lignes:
- Les lignes sont définies par des vecteurs et une tuile. Une ligne est chaque tuile frappée par l'équation:
p0 + t
<
some vector with the same number of coordinates as p0>
Entrée :
L'entrée sera vers STDIN. La première ligne de saisie sera composée de deux nombres n
et d
sous la forme n,d
.
Après cela sera une ligne composée de coordonnées spécifiant les mouvements qui ont été effectués. Les coordonnées seront listés sous la forme: 1,1;2,2;3,3
. Le coin supérieur gauche est l'origine (0,0 pour 2D). Dans le cas général, cette liste sera comme 1,2,...,1,4;4,0,...,6,0;...
où le premier nombre représente la gauche-droite-ness, la deuxième haut-bas-ness, la troisième à la 3ème dimension, etc. Notez que la première coordonnée est X
s premier tour, la seconde c'est O
le premier tour, ....
L'entrée sera suivie d'une nouvelle ligne.
Sortie :
La sortie sera vers STDOUT. Indiquez simplement qui a gagné si quelqu'un a gagné ou s'il s'agit d'une égalité. Si ce n'est ni une égalité ni une victoire, ne produisez rien.
De plus, indiquez s'il y a un conflit de mouvements, c'est-à-dire s'il y a au moins deux mouvements au même endroit.
S'il y a eu une victoire / match nul avant la fin de la saisie, votre programme peut faire ce qu'il veut.
Cas de test (quelqu'un veut-il suggérer plus?):
Contribution:
4,3
0,0,0;1,1,1;1,0,1;2,0,2;0,0,1;2,0,0;2,0,1;3,0,2;3,0,1
Exemple de sortie:
X wins
Une autre sortie possible (nécessite une explication):
1
la source
n
mouvements sur une ligne pour gagner. (Désolé de ne pas avoir posté ces remarques dans le bac à sable, mais je n'ai même pas eu le temps de le voir là-bas car il a été publié si peu de temps après le bac à sable.)Réponses:
Python,
745578 caractèresJ'ai fait quelques changements et je l'ai réduit un peu. Notez qu'un retour de True signifie que x a gagné, False signifie y a gagné et signifie qu'un mouvement invalide a été effectué.
la source
import *
pourimport*
. Utilisez1
pour True et0
pour False (supprimerT
etF
).return -1
peut êtrereturn-1
(consultez la suppression des espaces). Renommez vos méthodes en méthodes à caractère unique. Consultez les conseils pour plus d'optimisations.if l<>q:
place deif not l==q:
.Pas une réponse - Java
J'étais curieux de voir combien de façons différentes de gagner pour un n, d donc j'ai écrit ce code pour les énumérer toutes.
Je l'ai testé à la main sur n, d = 2..3,2..3 et cela semble fonctionner ... après cela, le nombre de façons possibles de gagner augmente rapidement, comme indiqué ci-dessous:
Après avoir généré tous les sets gagnants, j'ai pu étendre le programme pour vérifier l'entrée donnée par rapport aux sets gagnants mais, bien sûr, cette méthode ne gagnerait jamais le golf. Je me suis donc contenté de m'arrêter ici - sauf qu'il semblait que je pouvais trouver une solution de forme fermée pour le nombre de façons de gagner en fonction de n et d ... C'est Nombre de façons de gagner = 0,5 ((n + 2) ^ d - n ^ d).
la source
C ++ 794
849caractèresLa sortie est: "X" (X gagne), "O" (O gagne) ou "!" (tentative de déplacement illégale).
Cela mappe simplement les points dans un tableau linéaire et vérifie tous les sous-ensembles possibles de taille n, d'abord pour être constant à X ou O, puis pour être dans une ligne. Pour vérifier leur alignement, les coordonnées des points de chaque sous-ensemble sont examinées une par une; ils doivent chacun soit augmenter de 0 à n-1, diminuer de n-1 à 0, soit être constants. Les points sont naturellement ordonnés dans le réseau linéaire, il est donc logique d'appeler une coordonnée croissante ou décroissante pour un ensemble de points donné.
Merci à Howard d'avoir signalé une grave erreur dans la première version.
En solidarité avec Quincunx, je dois souligner que ce serait une parodie si une réponse C ++ gagne
la source
X wins
ouO wins
. Il est parfaitement légitime de produire1
ou2
(ou une autre variante) tant que vous expliquez dans votre réponse ce qu'ils représentent. Comme je l'ai dit (je souligne): " indiquez qui a gagné".