Créer un programme déterministe pour jouer n d tic-tac-toe avec les autres participants.
Votre programme devrait fonctionner lorsque n
(largeur) et d
(numéro de dimension) se trouvent dans ces plages:
n∈[3,∞)∩ℕ ie a natural number greater than 2
d∈[2,∞)∩ℕ ie a natural number greater than 1
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.
Contribution:
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, ....
Si c'est le premier mouvement, l'entrée sera un nombre suivi d'une ligne vierge.
Par souci de cohérence, l'entrée se terminera toujours par une nouvelle ligne. Exemple d'entrée (\ n est une nouvelle ligne):
10,10\n0,0,0,0,0,0,0,0,0,0;0,2,3,4,5,6,7,8,9,0;0,1,2,3,4,5,6,7,8,9\n
Pour le premier coup:
10,10\n\n
où \n
est le caractère de nouvelle ligne.
Production:
Sortez le déplacement que vous souhaitez effectuer dans le même format que l'entrée (une liste séparée par des virgules). Un coup invalide (c'est-à-dire un coup déjà effectué) entraînera une perte pour le jeu.
Remarque: Vous pouvez utiliser un générateur de nombres aléatoires, tant que vous l'amorcez avec une valeur telle que chaque exécution serait identique dans les mêmes conditions. En d'autres termes, le programme doit être déterministe.
Remarque: seuls les déplacements valides sont autorisés.
Jeux gagnants (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>
Conditions de simulation et de gain:
Indiquez dans votre réponse si elle est prête pour le classement. Autrement dit, indiquez clairement si votre réponse est terminée ou non.
Si votre réponse est marquée comme terminée, elle ne sera notée qu'au moins 24 heures après la dernière modification du code.
Les programmes doivent fonctionner hors ligne. Si un programme est en train de tricher, il recevra automatiquement un score de
-1
, et ne sera pas noté plus loin. (Comment quelqu'un finirait-il par tricher avec ses programmes?)Si votre programme produit une sortie invalide, elle est immédiatement comptabilisée comme une perte pour le jeu
Si votre programme ne produit pas de sortie après 1 minute, il est immédiatement comptabilisé comme une perte pour le jeu. Si nécessaire, optimisez pour la vitesse. Je ne veux pas avoir à attendre une heure pour tester un programme sur un autre.
Chaque programme sera exécuté contre les autres programmes deux fois pour chacun
n
dans la plage[3,6]
et chacund
dans la plage[2,5]
, une fois au furX
et à mesureO
. Ceci est un tour.Pour chaque match gagné par un programme, il atteint
+3
son score. Si le programme est à égalité (1 victoire et 1 défaite en un seul tour ou égalité pour les deux matchs), il obtient+1
. Si le programme a perdu, il obtient+0
(c'est-à-dire aucun changement).Le programme avec le score le plus élevé gagne. En cas d'égalité, le programme avec le moins de matchs perdus (parmi les concurrents à égalité) gagne.
Remarque: Selon le nombre de réponses, j'ai peut-être besoin d'aide pour exécuter les tests.
Bonne chance! Et que les simulations fonctionnent toujours en votre faveur!
la source
Réponses:
Python 3
Il s'agit simplement d'un ai aléatoire. Il sélectionne au hasard un mouvement parmi les mouvements encore disponibles.
la source
Python 2.7
Il s'agit d'une soumission de travail en cours que je fournis pour donner un squelette / inspiration à d'autres répondeurs. Il fonctionne en répertoriant toutes les lignes gagnantes possibles, puis en appliquant une heuristique pour marquer cette ligne en fonction de sa valeur. Actuellement, l'heuristique est vide (fonctionnement super secret). J'ai également ajouté la gestion des erreurs de victoire et de conflit.
Notes sur le problème
Combien y a-t-il de lignes gagnantes? Prenons le cas unidimensionnel; il y a 2 sommets, 1 arête et 1 ligne. En 2 dimensions, nous avons 4 sommets joints par 2 lignes, et 4 arêtes jointes par 2 * n lignes. En 3 dimensions, nous avons 8 sommets joints par 4 lignes, 12 bords joints par 6 * n lignes et 6 faces jointes par des
3*n^2
lignes.En général, appelons un sommet une facette 0, une arête une facette 1, etc.
N(i)
Notons ensuite le nombre de facettes i,d
le nombre de dimensions etn
la longueur du côté. Ensuite, le nombre de lignes gagnantes est0.5*sum(N(i)*n^i,i=0..d-1)
.Par wikipedia,
N(i)=2^(d-i)*d!/(i!*(n-1)!)
la formule finale est donc:sum(2^(d-i-1) n^i d! / (i! * (n-i)!),i=0..d-1)
quel wolfram | alpha n'aime pas beaucoup. Cela devient très grand assez rapidement, donc je ne m'attends pas à ce que mon programme ait un temps d'exécution gérable pour d> 8.
Quelques résultats (désolé pour le formatage:
E / S
Pour le moment, l'entrée doit être entrée comme:
tictactoe.py <ret> n,d <ret> move;move <ret>
- notez les lignes multiples et aucune finale;
.La sortie ressemble
(x_1,x_2,x_3...)
, par exemple:tictactoe.py <ret> 6,5 <ret> <ret>
=>0, 0, 0, 0, 0
tictactoe.py <ret> 6,5 <ret> 0,0,0,0,0;0,0,0,0,5 <ret>
=>0, 0, 0, 5, 0
Edit: pour les E / S, logique ajoutée. Je crois que c'est maintenant prêt à marquer
Notez que ce commentaire était initialement un espace réservé que j'ai supprimé et restauré.
la source
Python 2
La plupart du code est exactement le même que l'IA aléatoire de Quincunx . Au lieu de sélectionner aléatoirement un coup, il sélectionne le premier coup disponible lexicographiquement (ie (0,0, ... 0), puis (0,0, ... 1), puis (0,0, ... 2) , etc.).
Il s'agit d'une stratégie assez poubelle, mais elle bat presque toujours au hasard.
la source