Défi
À partir d’un tableau de tic-tac-toe dans n’importe quel format, déterminez s’il est valide ou non. Si un tableau peut être le résultat d'un jeu de tic-tac-toe, il est alors valide. Par exemple, ce forum est valide:
XOX OXO XOXAu contraire, ce forum est invalide:
XXX XXO OOO
Contribution
- Un tableau complet (9/9) de tic tac toe (le résultat, pas le jeu).
Règles
- Le format d’entrée doit pouvoir décrire les 512 cartes d’entrée possibles. Il doit être spécifié, avec les instructions pour le créer s'il est obscur / incertain. Cependant, vous devez indiquer les marques du tableau individuellement.
- Il doit y avoir deux sorties possibles, une pour la validité et une pour la nullité.
- Vous pouvez supposer que le tableau n'a pas de places vides.
Cas de test
Valide:
XOX OXO XOX XOX XOX OXO XOO OOX OXX OXO XOX OXO
Invalide:
XXX XXX XXX OOO OOO OOO XXX OOO XXX OOO OOX XXX XXO OXO OOX
Un peu d'aide?
Un tableau est considéré comme valide (pour ce défi) si et seulement si les deux conditions suivantes sont remplies:
- Il y a 5 X et 4 O, ou 4 X et 5 O. Par exemple,
XXX OXO XXX
est considéré comme invalide, car il y a 7 X et 2 Os. - Seul le joueur avec 5 points a gagné, ou aucun d'entre eux n'a gagné. Par exemple,
XXX OOO OOX
est considéré invalide, puisque la ligne deO
s ou la ligne deX
s sera formée en premier. Les deux joueurs ne peuvent pas avoir leur tour simultanément.
Le gagnant actuel est ...
... La réponse de gelée d'ais523 , à un nombre incroyable de 26 octets!
code-golf
decision-problem
tic-tac-toe
Erik le golfeur
la source
la source
O O O
X O X
X O X
, pour montrer que le même joueur peut avoir une rangée horizontale et verticale.Réponses:
Gelée , 26 octets
Essayez-le en ligne!
Le format de saisie est un peu inhabituel; c'est une chaîne représentant le tableau, mais avec les nouvelles lignes de Windows (retour chariot suivi de nouvelle ligne). Par exemple,
XXO\r\nOXO\r\nOOX
. (En réalité, toute chaîne de remplissage de deux caractères entre les lignes fonctionne, mais les nouvelles lignes de Windows sont beaucoup plus défendables que les autres options.)L'idée de base est que nous recherchons des caractères qui apparaissent 4 fois dans l'entrée, sans que trois occurrences soient également espacées dans la chaîne d'origine. Si deux ou plusieurs caractères de remplissage sont insérés entre les lignes d'une grille 3 × 3, toutes les lignes horizontales, verticales et diagonales sont espacées de manière égale, mais aucune autre ligne également espacée ne peut comporter trois éléments.
Explication:
Les
ð
etµ
sont des séparateurs de chaîne , qui divisent le programme en plusieurs parties indépendantes. Je les ai remplacés par des espaces ci-dessous, pour rendre les choses un peu plus claires.En d’autres termes, nous trouvons la liste des caractères qui apparaissent exactement quatre fois dans l’entrée et nous faisons une liste composée de trois copies de chacune d’elles; nous trouvons la liste de toutes les sous-séquences régulièrement espacées dans la chaîne d'origine; et si nous soustrayons la seconde de la première, nous voulons que le résultat soit de longueur 1 (c'est-à-dire qu'un joueur a joué quatre fois mais n'a pas gagné). Notez que comme nous sommes sur une grille 3 × 3 et que chaque case est pleine, il est impossible que les deux joueurs aient joué quatre fois. Dans Jelly, 1 est la vérité, 0 est Falsey, nous n’avons donc rien à faire de spécial pour convertir la liste résultante en un booléen. (Le
µL
est nécessaire, cependant, parce que sinon les deux“XXX”
et“OOO”
seraient possibles des valeurs de sortie truthy, et la question exige que tous les conseils valides donnent la même sortie.)la source
JavaScript (ES6),
8887 octetsAccepte une entrée en tant que chaîne de 9
0
et les1
caractères et les rendements1
pour valide,0
pour invalide. Nous trions les personnages dans l'ordre. Si les trois personnages du milieu sont maintenant identiques, le tableau est invalide car il y en a trop d'un seul morceau. Sinon, nous convertissons la carte d'origine en binaire, en retournant les bits s'il y a plus de0
s que de1
s. À ce stade, la carte est valide si elle0
n’a pas une ligne de trois, nous testons donc simplement les huit lignes via un tableau de masques de bits. Edit: 1 octet enregistré grâce à @ETHproductions.la source
Python 3,
13112712510096 octetsPour une approche algorithmique différente (et une qui conviendra vraiment à ces langages de golf multi-octets avec compression intégrée), au lieu de calculer si la carte est valide, établissons un nombre de 512 bits où chaque bit représente si oui ou non un conseil particulier est valide ou non, et transmet une valeur binaire représentant le conseil. De plus, pour des raisons de symétrie, la seconde moitié de la table peut être éliminée, ainsi que des zéros:
La valeur de test:
Est représentée sous forme de valeur binaire
0b111010111
et la fonction renvoie une valeur non nulle si le tableau est valide.la source
a&(1<<b)
n'ont pas besoin de crochets.if b>255:b=511-b
!if
.Lot, 140 octets
Prend les entrées sous forme de neuf arguments et sorties de ligne de commande distincts
1
pour valide et0
non valide. Fonctionne en suivant le nombre de fois où il voit unO
et une ligne orthogonale deOOO
ouXXX
. De manière pratique, Batch nous permet d'effectuer indirectement des calculs arithmétiques en nombres entiers; nous n'incrémentons donc pas,%%l
mais plutôt une variable (bien que nous ne nous intéressions qu'aux trois variables mentionnées). Nous devons ensuite vérifier si laX
victoire n’a pas été gagnée et il y en a cinqO
ou bienO
quatreO
.la source
Mathematica,
82 à75 octetsMerci à Martin Ender d'avoir économisé 7 octets!
Fonction sans nom prenant une liste imbriquée 3x3 de 1 et de 0 en entrée et en sortie
True
ouFalse
.Utilise une certaine souplesse pratique de la
Total
fonction (ici mise au golft
): en donnant un exemple de tableaue = { {1,2,3} , {4,5,6} , {7,8,9} }
, la commandet[e]
additionne les trois vecteurs (ici la production{12,15,18}
); la commandet/@e
additionne chaque sous-liste individuellement (cédant ici{6,15,24}
); et la commandee~t~2
additionne les neuf éléments (cédant ici45
).Nous vérifions donc d’abord
3<(b=#~t~2)<6
si le nombre total de 1 est 4 ou 5; sinon on sort avecFalse
. Si tel est le cas, nous avons l'habitude dec=If[b>4,1-#,#]
faire en sorte qu'il y ait quatre 1, pas cinq. Ensuite, nous calculons les sommes de colonnet[c]
, les lignest/@c
, la somme de la diagonale principaleTr@c
et la somme de la diagonale opposéeTr@Reverse~c
, et~FreeQ~3
vérifions qu’il3
n’apparaît à aucun niveau dans ces sommes calculées.Note de côté amusante: contrairement à la plupart des apparences sur ce site, il
Tr
n’est pas utilisé ici pour résumer une liste unidimensionnelle, mais est utilisé comme prévu: pour calculer la trace d’une matrice à deux dimensions!la source
Pyth - 36 octets
J'inclus les diagas et utilise plutôt deux ternaires.
Suite de tests
la source
JavaScript (ES6), 101 octets
Prend les entrées sous forme de masque binaire de 9 bits où
X = 1
etO = 0
((MSB = cellule en haut à gauche, LSB = en bas à droite)).Cas de test
Afficher l'extrait de code
la source
Python 2,
1581321099291123 octetsL'entrée est une liste / un tuple de lignes, chacune trois un tuple de chaînes, par exemple:
[('X', 'O', 'X'), ('O', 'X', 'O'), ('X', 'O', 'X')]
Sauvegardé quelques octets en ignorant les diagonales dans la réponse de @ Maltysen, ce qui a également raccourci l'expression suivante.Merci @vaultah pour avoir économisé1718 octets.Vérifier les diagonales s’est avéré nécessaire, ce qui a permis de supprimer une grande partie des économies réalisées ci-dessus.
Essayez-le ici.
Explication
f
est l'entrée aplatie pour le découpage en tranches.w
contient les personnages avec les séquences gagnantes.Comptez le nombre d'occurrences de chaque personnage gagnant, qui sera soit 0 si
w
est vide, soit 5 silen(w)
est égal à 1. La somme 10 lorsque les deux ont une séquence gagnante est impossible. Le gagnant ayant 5 implique le perdant ayant 4. Vous ne pouvez pas avoir> 5 sans séquence gagnante.la source
lambda b:len({x[0]for x in b+zip(*b)if len(set(x))==1})<2and set(map(
b.count,'XO'))=={4,5}
enregistre quelques octets....and{4,5}==set(map(
b.count,'XO'))
enregistre un octet supplémentaire.R,
8882 octetsToutes les combinaisons de trois nombres entiers de 1 à 9 qui totalisent 15 sont les lignes / colonnes / diagonales du carré indiqué ci-dessous.
La fonction prend en entrée un vecteur de booléens, T pour "X", F pour "O", qui est la représentation aplatie du tableau. MAIS, ceux-ci sont réorganisés pour que leur index soit le même que le nombre dans le carré, dans l'ordre (2,7,6,9,5,1,4,3,8). Cet ordre pourrait être obtenu en aplatissant le tableau de la manière habituelle, puis en découpant par c (6,1,8,7,5,3,2,9,4). Donc ça
est représenté comme:
lequel est:
La fonction détermine d'abord s'il y a un joueur avec exactement quatre marques. Si tel est le cas, la fonction utilise les faits qui ajoutent jusqu'à 15 pour déterminer si ce joueur a trois joueurs de suite (le tableau est invalide si ce joueur en possède).
Si vous voulez utiliser un tableau aplati de manière conventionnelle, le code ressemblerait à ceci:
Je suis nouveau à cela, des conseils seraient appréciés.
la source
if()
plutôt:f=function(x)
if(sum(x)%in%4:5,all(apply(combn(which(x==(sum(x)<5)),3),2,sum)!=15),F)
. Pas complètement testé l'esprit. Les Backticks ruinent le code, mais c'estbacktick if backtick(
.x=scan();
si(sum(x)%in%4:5,all(apply(combn(which(x==(sum(x)<5)),3),2,sum)!=15),F)
et entrée comme1
et0
. 82 octets.JavaScript (ES6),
145139131127 octetsEntrée sous forme de chaîne séparée par des espaces, telle que
"XOX OXO XOX"
. Sorties1
pour une carte invalide,0
pour une carte valide. Ce n'est évidemment pas la meilleure technique, du moins pas avec JavaScript ...Ceci vérifie fondamentalement si les deux suivants tiennent:
O
s, ETLe regex est de vérifier si un jeu a été décidé. Il correspond à un tableau si tant qu'il y a des longueurs de longueur trois d'un caractère avec 0 (rangée), 2 (diagonale en bas à droite), 3 (colonne) ou 4 caractères (diagonale en bas à gauche) séparant chaque paire.
Extrait de test
Afficher l'extrait de code
la source
Ruby,
104 9991 octetsFormat de saisie: chaîne binaire de 9 symboles (0 et 1) représentant la carte, par exemple le premier cas de test
101010101
. Convertissez-le d'abord en un nombre binaire, vérifiez si popcount est égal à 4 ou 5, si 5 inversez le nombre pour obtenir toujours 4. Vérifiez si trois d'entre eux sont alignés (masquage horizontal, vertical, diagonal).TL; DR : Renvoie faux si le joueur avec 4 marques a gagné, vrai sinon.
Merci Jordan pour les commentaires,
Je ne peux pas reproduire la chaîne UTF-8, ce qui économiserait un autre octet.
la source
.select{...}[0]
avec.find{...}
."8ǀĤITđ".unpack("U*")
(au cas où quelque chose serait perdu dans la traduction, la chaîne est le résultat de l'appelpack("U*")
du tableau d'origine; elle est de 12 octets).any?
au lieu denone?
, retourner la sortie et sauvegarder un octet entier?Perl 6 ,
10399 octetsUn lambda qui accepte une liste de listes comme
(('X','O','X'), ('O','X','O'), ('X','O','X'))
, et retourne un Bool.Cela fonctionne comme ceci:
c
. (Si aucune marque n'apparaît exactement 5 fois, cela contiendra une valeur de fausseté)c
est la vérité, et chaque ligne gagnante est de typec
.la source
PHP, 125 octets
J'ai eu la même idée que Arnauld : Le conseil est valable s'il y a 4 ou 5 bits fixés et soit
X
ouO
ou personne n'a une série (mais pas les deux).Pour générer une entrée à partir de champ, remplacez
X
par1
etO
avec0
, joignez des lignes et convertissez des données binaires en décimales, en tant qu'argument de ligne de commande.impressions
1
pour valables; sortie vide pour invalide. Courez avec-r
.panne
la source
Rapide, 178 octets
la source
ES6 (Javacript),
130,138, 117 octetsEDITS:
Une approche extrêmement directe. Peut probablement être joué au golf un peu plus loin.
Accepte les entrées sous la forme de 9 arguments, 1 et 0 séparés
Arguments: 1-3 - première rangée, 4-6 - deuxième rangée, 7-9 - troisième rangée.
Golfé
"Banc d'essai" interactif
la source
[1,0,1,1,0,1,0,1,0]
(XOX XOX OXO
).a+b+c+d+e+f+g+H+i
au lieu deF.reduce((r,c)=>r+=c*1)
(à quel moment vous n’avez pas besoinF
) b) écrire.includes(C)
(et passer àC
la valeur de inline )?OOO XXX OXO
un échec?