Jouons au golf à code!
Étant donné un état de carte tic-tac-toe (exemple :)
|x|x|o|
|x|o|x|
|o|o|x|
Déterminez si un jeu est un win
a lose
ou un cat
. Votre code doit afficher l'une de ces options en fonction d'un état. Le jeu ci-dessus devrait sortirlose
Juste pour être clair: une victoire est définie comme 3 x
s consécutifs (diagonale, horizontale, verticale). une défaite est de 3 o
s d'affilée, tandis qu'un cat
match en aucun d'affilée.
Pour rendre les choses intéressantes, vous devez déterminer votre structure d'entrée pour l'état, que vous devez ensuite expliquer. Par exemple, xxoxoxoox
est un état valide comme vu ci-dessus où chacun des caractères est lu de gauche à droite, de haut en bas. [['x','x','o'],['x','o','x'],['o','o','x']]
est le jeu en tableau multidimensionnel lu de manière similaire. Alors que 0x1a9
ce qui est hexadécimal 110101001
pourrait fonctionner comme une compression appropriée où 1
peut être manipulé pour x
s et 0
peut être manipulé pour o
.
Mais ce ne sont que quelques idées, je suis sûr que vous pourriez en avoir plusieurs.
Règles de base:
- Votre programme doit pouvoir accepter n'importe quel état viable.
- La forme d'entrée doit pouvoir représenter n'importe quel état.
- "L'état de victoire doit être déterminé à partir du tableau"
- Supposons une planche complète
Win
avantlose
par exemple dans le cas «xxxoooxxx»
Le nombre de personnages le plus bas gagne
(win|lose|cat) [xo]{9}
où le premier mot indique si le jeu est une victoire, une perte ou un chat (?) Pour le joueur x. Capable de représenter n'importe quel état.Réponses:
Ruby 2.0, 85 caractères
Voici une solution simple basée sur un masque de bits dans Ruby:
La carte est représentée par un nombre hexadécimal, composé de neuf bits correspondant aux neuf carrés. 1 est un
X
, 0 est unO
. C'est exactement comme l'0x1a9
exemple de la question, bien que le0x
soit facultatif!Il y a probablement une meilleure façon de faire les masques de bit que de coder en dur une grande liste. Je prendrai volontiers des suggestions.
Voir courir sur Ideone ici .
la source
273
deux fois. Et j'aime vraiment l'max
idée!Mathematica, 84 caractères
Format d'entrée:
{{1, 1, 0}, {1, 0, 1}, {0, 0, 1}}
la source
Tr@a
est la trace du champ (somme sur diagonale),Tr@Reverse@a
est la trace du champ inversé (certains sur anti-diagonale),Tr/@a
estTr
appliquée à chaque ligne, ce qui vous donne la somme sur chaque ligne,Total@a
vous donne la somme sur chaque colonne. Donc, fondamentalement, vous avez les 8 lignes à vérifier. Ensuite, laWhich
chose est appliquée à cela (essentiellement uneif/elseif/else
déclaration), où#
représente cette liste de 8 valeurs.if
il y a un3
vous gagnez,else if
il y a un0
vous perdez,else if 1>0
(vrai)cat
.Bash:
283262258Doté d'une interface relativement conviviale.
Éxécuter
bash tictactoe.sh O X O X O X X O X
Remarque: la liste des 9 positions est une représentation matricielle standard. Peu importe si le tableau est représenté comme une colonne majeure ou une ligne majeure, lue de gauche à droite ou de haut en bas - les jeux de noughts et de croix (ou tic tac toe si vous insistez) sont symétriques, donc l'ordre d'entrée ne devrait pas être pertinent au résultat dans chaque implémentation correcte, tant que l'entrée est linéaire.
Edit: Merci à hjk pour une suggestion de syntaxe de fonction plus courte.
la source
t() { ... }
au lieu defunction t
? Peut y sauvegarder certains personnages. :)<<<
pour enregistrer quatre autres caractères.Befunge 93 - 375
Prend une chaîne binaire en entrée.
Lit la chaîne. Bruteforce l'écrit (la bande la plus à droite verticale) comme matrice entre les
ajout d'un treillis (idk). Détermine la somme des colonnes, des lignes et de deux diagnostics. Compare ces valeurs à 3 ("gagner") ou à 0 ("perdre"), sinon si toutes les valeurs sont égales à 1 ou 2, dessinez ("chat").
la source
GolfScript, 27 caractères
Le format d'entrée est une chaîne composée de huit chiffres octaux, chacun codant (de manière redondante) trois carrés de carte consécutifs:
Pour coder une séquence (ligne / colonne / diagonale) de trois carrés en tant que chiffre octal, remplacez chaque
x
dans la séquence par un 1 et chaqueo
par un 0, et interprétez la séquence résultante de uns et de zéros comme un nombre binaire compris entre 0 et 7 compris.Ce format d'entrée est tout à fait redondante (toutes les positions du conseil d'administration sont codées au moins deux fois, la position centrale codé quatre fois), mais elle ne représente sans ambiguïté tout état possible d'un complètement rempli carte tic-tac-toe, et n'a pas directement encode la gagnant dans l'entrée.
L'entrée peut, facultativement, contenir des espaces ou d'autres délimiteurs entre les chiffres. En fait, tout le programme se soucie vraiment de savoir si la chaîne d'entrée contient ou non les chiffres
7
ou0
.Par exemple, l'exemple de carte:
peut être représenté par l'entrée:
Pour plus de commodité, voici un programme GolfScript pour convertir une disposition de tableau d'art ASCII, comme indiqué dans le défi ci-dessus, en une chaîne d'entrée adaptée à ce programme:
Ce convertisseur ignore tous les caractères autres que
x
eto
, dans les deux cas, dans son entrée. Il produit une chaîne à un chiffre (complète avec des délimiteurs d'espace comme indiqué ci-dessus) appropriée pour alimenter le programme déterminant la victoire ci-dessus, de sorte que la concaténation de ces deux programmes peut être utilisée pour déterminer le gagnant directement à partir du tableau d'art ASCII.En outre, voici un convertisseur inversé, juste pour démontrer que l'entrée représente effectivement sans équivoque la carte:
Ps. Voici une démonstration en ligne de cette solution.
la source
Python 2 - 214 octets
Je suis sûr qu'il y a des améliorations à apporter.
Courir:
qui représente ce conseil:
Quitte avec une
NameError
exception dans tous les cas saufcat
.la source
<<<
! +1 juste pour ça../whatever <<< 'blah blah blah'
est le même que,echo -n 'blah blah blah' | ./whatever
mais sans avoir un processus distinct pourecho
.echo
inbash
est en fait une fonction intégrée, donc ne crée pas de nouveau processusHaskell, 146 caractères
D'ACCORD :). Ma représentation d'un tableau est l'un de ces 126 caractères
Voici la solution en 146 caractères:
Et voici comment cela fonctionne, en tant que script haskell:
la source
JavaScript, 420 caractères
Dans cette version,
s
contient un entier qui représente l'état du plateau de jeu. Il s'agit d'un tableau de valeurs où deux bits représentent chaque carré de la carte:10
- X11
- O00
- Carré videCette solution utilise la manipulation de bits pour tester chacune des huit configurations "trois dans une rangée" possibles (elle les teste chacune deux fois, une fois pour X et une fois pour O).
Je présente cela avec une minification mineure de mon site Web Tic-Tac-Toe où cette
detectWin
fonction est utilisée dans le cadre d'un vrai jeu Tic-Tac-Toe.la source
Ruby, 84 caractères
Solution simple basée sur RegExp. Le format d'entrée est une chaîne binaire à 9 chiffres, par exemple
110101001
pour l'exemple de carte donné dans la question.Ruby, 78 caractères
Format d'entrée:
xxo_xox_oox
la source
Haskell, 169
Format d'entrée: "X" est représenté uniquement par
x
, "O" uniquement paro
. Dans chaque ligne, les caractères sont simultanés sans espaces, etc. Les lignes sont séparées par de nouvelles lignes.Génère toutes les lignes / colonnes / diagonales possibles, puis filtre
[("ooo","lose"),("xxx","win")]
par leur existence sur le tableau, puis sélectionne le deuxième mot du tuple, afin que nous sachions quels joueurs ont gagné. Nous préfixons"cat"
afin de pouvoir prendre le dernier élément de la liste comme gagnant. Si les deux joueurs ont gagné, ce"win"
sera le dernier (les compréhensions de liste maintiennent l'ordre). Puisque"cat"
c'est toujours le premier, si un gagnant existe, il sera choisi, mais sinon un dernier élément existe toujours comme pré-ajouté"cat"
garantit la non- .EDIT: Rasé 3 caractères en changeant la compréhension de la dernière liste en
map
.la source
C, 150 environ
Il est minuit ici et je n'ai fait aucun test , mais je posterai quand même le concept. J'y reviendrai demain.
L'utilisateur entre deux nombres octaux (je voulais utiliser le binaire mais pour autant que je sache, C ne prend en charge que l'octal):
a
représente le carré central, 1 pour un X, 0 pour un Ob
est un nombre à neuf chiffres représentant les carrés du périmètre, encerclant le tableau en commençant dans un coin et se terminant dans le même coin (avec répétition de ce coin uniquement), 1 pour un X, 0 pour un O.Il y a deux façons de gagner:
le carré central est X (
a
= 1) et deux carrés opposés sont également X (b&b*4096
est différent de zéro)trois carrés de périmètre adjacents sont X (
b/8 & b & b*8
est différent de zéro). Ce n'est une victoire valide que si le carré du milieu est un carré de bord, pas un carré de coin, il est donc nécessaire d'appliquer le masquem
également, pour éviter les cas de carrés de coin.La perte est détectée à l'aide de la variable c, qui est l'inverse de b.
la source
m
dans la détection de "perte" -c/8&c&c*8
. J'ai re-golfé votre code (sans tester son fonctionnement) comme suit:int a,b;t(v){return a&&v&v<<12||v/8&v&v*8&0x208208;}main(){scanf("%o%o",a,b);printf("%s",t(b)?"win":t(b^0x1249249)?"lose":"cat");}
(130 caractères). Le test répété était suffisamment long pour être extrait dans une fonction de testt()
; cela supprime le besoin dec
etm
; les constantes converties en hex pour enregistrer un char chacune.printf
n'a pas besoin d'une chaîne de format - il suffit de fournir la chaîne de résultat comme format - ouputs
cela, car la question ne demande pas de nouvelle ligne après la sortie! (enregistre 7 caractères supplémentaires).Frapper,
107103Génère et exécute un script sed.
Format d'E / S:
oxo-oox-xoo
sortieslose
(utilisez un-
pour séparer les lignes). Entrée sur stdin. Nécessite GNU sed pour lac
commande.J'ai interprété la règle 5 comme "si gagner et perdre sont possibles, choisissez gagner".
Code principal
Telle est la vraie réponse.
Rien d'intéressant vraiment. Il définit
$b
comme/cwin
pour sauver des caractères, définit alors la partie de condition de victoire du script, puis utilisesed y/x/o/\;s$b/close/
pour convertirx
ào
etcwin
àclose
(générant ainsi les conditions lose). Il envoie ensuite les deux choses etccat
(qui sortiracat
si aucune condition gagnant / perdant ne correspond) à sed.Code généré
Il s'agit du script sed généré et exécuté par le script Bash.
Dans les expressions régulières,
.
correspond à n'importe quel caractère et après euxcTEXT
imprime TEXTE et se termine si l'expression rationnelle correspond.Cela peut fonctionner comme un script sed autonome. Il fait 125 caractères, vous pouvez le compter comme une autre solution.
la source
Python 3, 45
L'entrée est en
i
, qui est une liste de nombres représentant chaque ligne, colonne et diagonale du plateau de jeu, par exemple:est représenté par
[6, 2, 1, 4, 6, 1, 7, 4]
.Code :
('cat','lose','win')[2 if 7 in i else 0 in i]
la source
Fléchette - 119
(Voir dartlang.org ).
Version originale utilisant RegExp: 151 caractères.
L'entrée sur la ligne de commande est de 11 caractères, par exemple, "xxx | ooo | xxx". Tout caractère non xo peut être utilisé comme délimiteur.
Les espaces blancs de début et les retours à la ligne doivent être omis avant de compter les caractères, mais j'ai coupé les espaces internes dans la mesure du possible. Je souhaite qu'il y ait une façon plus petite de faire la sous-chaîne.
Version à base de bits récursive: 119 caractères. L'entrée doit être un nombre de 9 bits avec 1 représentant «x» et 0 représentant «o».
la source
CJam,
39 3836 caractèresCeci est un code converti de base pour
qui fait 52 caractères.
L'entrée est simplement la représentation sous forme de chaîne de la carte à partir du coin supérieur gauche, en allant ligne par ligne. Par exemple:
ce qui se traduit par une
win
sortie. Ouce qui se traduit par une
cat
sortie, etc.Le code fait simplement les trois choses suivantes:
q3/_
- Divisez la chaîne en parties de 3, c'est-à-dire par ligne_z
- Copiez le tableau par ligne et transposez-le en tableau par colonne.__Wf%s4%
- Inversez chaque rangée et obtenez la diagonale de gauche à droite. Il s'agit de la diagonale secondaire de la carte.\s4%
- Obtenez la diagonale principale de la planche]`
- Envelopper tout dans le tableau et stringifier le tableau.Maintenant, nous avons tous les groupes possibles de 3 du conseil d'administration. Nous vérifions simplement l'existence de "ooo" et "xxx" pour déterminer le résultat.
Essayez-le en ligne ici
la source
GNU sed, 25 octets
Si l'entrée est une représentation redondante du tableau avec des vues distinctes pour les colonnes, les lignes et les diagonales, comme cela est également utilisé dans d'autres réponses, alors sed est très bien adapté pour vérifier l'état final du jeu avec le moins d'octets.
Format d'entrée:
xxx ooo xxx xox xox xox xox xox
(état de la carte tiré de la question du PO)Si le format d'entrée n'est pas redondant (
xxx ooo xxx
), le code sed ci-dessus ne fonctionne que s'il est ajouté par la ligne ci-dessous, ce qui rend le programme de 96 octets (avec l'r
indicateur nécessaire compté).la source
Bash: 208 caractères
Éxécuter
bash tictactoe.sh 0 1 0 1 0 1 1 0 1
Inspiré par cette réponse .
la source
VB.net
Avec l'exemple, est codé comme le modèle de bits suivant
Nous pouvons maintenant déterminer le résultat (ou le gagnant) en procédant comme suit.
la source
J - 97 octets
Eh bien, l'approche la plus simple disponible. L'entrée est prise comme
111222333
, où les nombres représentent des lignes. Lisez de gauche à droite. Le joueur estx
et l'ennemi l'esto
. Les cases vides peuvent être n'importe quoi saufx
ouo
.Exemples: (NB. Est un commentaire)
Code non golfé une explication
la source
Python 2, 120 octets
Ou Python, à 115 octets du shell Python (2 ou 3):
La variable board est définie au format binaire décrit dans la question:
1
pour X,0
pour O, de gauche à droite, de haut en bas. Dans ce cas,101001110
représenteCe qui conduit à une sortie:
Cat
la source
Python (
7362 caractères)L'entrée est composée de quatre chaînes minuscules représentant quatre vues distinctes de la même carte, toutes concaténées en une seule chaîne: par ligne, par colonne, diagonale droite, diagonale gauche.
MISE À JOUR
Merci à theRare de l'avoir signalé avec un bon contre-exemple! Chaque vue du tableau, ainsi que chaque segment (ligne ou colonne) d'un tableau doit être séparé par un caractère qui n'est ni un "x" ni un "o" afin que la structure du tableau soit préservée même après concaténation. Les bordures autour de chaque vue du tableau seront des crochets ("[" et "]"), et le séparateur entre les lignes / colonnes sera un caractère "|".
Cela rend l'algorithme simple - recherchez simplement "xxx" ou "ooo" pour un gain ou une perte, respectivement. Sinon c'est une cravate (chat).
Par exemple le tableau (lecture de gauche à droite, de haut en bas) ...
X | X | X X | O | X O | X | O
... est représenté par "[xxx | xox | oxo]" (par lignes) + "[xxo | xox | xxo]" (par colonnes) + "[xoo]" (diag à droite) + [xoo] "(à gauche diag) = "[xxx | xox | oxo] [xxo | xox | xxo] [xoo] [xoo]".
Cette instruction Python affiche le résultat du jeu en fonction de la variable s en entrée:
la source
OXX XOO XOX
(ce devrait être un chat)?Haskell (69 caractères)
Cela prend la même entrée que celle décrite par cette réponse . Plus précisément, l'entrée est de 8 valeurs octales, décrivant la valeur binaire de chaque ligne, colonne et diagonale. Le code fait que chaque instance de 7 "gagne", chaque instance de 0 "perd" et supprime tout le reste. Ensuite, il ajoute "chat" à la fin et prend les 4 premiers caractères du résultat.
Il y aura 4 réponses possibles: "perdre", "chat", "gagner" suivi d'un 'l' et "gagner" suivi d'un 'c', ce que les règles n'interdisent pas :)
Exemple d'utilisation:
la source
J: 83
Utilisation: ajoutez simplement une chaîne de x et o et regardez le travail magique. par exemple. «xxxoooxxx».
Le verbe intérieur
(+/@:(*./"1)@;@(;((<0 1)&|:&.>@(;|.)(,<)|:)))
essentiellement la matrice binaire d'origine, avec la transposition encadrée avec les 2 diagonales. Ces résultats sont rasés ensemble; des sommes de ligne sont prises pour déterminer les victoires, puis additionnées. plus loin, j'appellerai ce verbeInner
.Pour trouver le gagnant, la différence des scores entre les matrices binaires normales et inversées est prise par le crochet
(-&Inner -.)
.Le reste du code effectue simplement les sorties et sélectionne la bonne.
la source
JavaScript,
133, 114 caractèresL'entrée
i
est une chaîne simple avec des délimiteurs pour les lignes, c'est-à-dire100|001|100
Edit: mis à jour ma méthode pour remplacer les 1 dans l'expression régulière par des zéros pour vérifier le cas de perte.
la source
=
et les guillemets autour du littéral d'expression régulière. En outre,1...
est un caractère plus court que1.{3}
.r.test(i)
est également un caractère plus court quei.match(r)
.J - 56 (26?) Char
L'entrée reçoit une matrice 3x3 de neuf caractères, car J peut le prendre en charge en tant que type de données, LOL.
Exemples:
Si nous sommes autorisés à encoder Golfscriptish des chiffres octaux représentant de manière redondante l'état de chaque ligne, colonne et diagonale, alors ce ne sont que 26 caractères:
la source
T-SQL (2012), 110
select max(iif(@&m=0,'lose',iif(@&m=m,'win','cat')))from(VALUES(292),(146),(73),(448),(56),(7),(273),(84))z(m)
L'entrée est un nombre hexadécimal. C'est à peu près une traduction de la solution ruby en T-SQL assez agréable et soignée.
la source
Javascript 1.6, 71 caractères
Je suppose que l'entrée est un tableau
game
qui contient chaque ligne, chaque colonne et chaque diag comme une chaîne de 3 caractères. Semblable à la réponse de bob , mais il vient dans un tableau, pas comme une chaîne concaténée.EDIT @ nyuszika7h 's comment (67 caractères)
la source
~game.indexOf("xxx")
place degame.indexOf("xxx")>=0
, même pour l'autre.Java 7, 260 octets
Cas non testés et testés:
Essayez-le ici.
Production:
la source
APL (NARS), 69 caractères, 138 octets
L'entrée doit être une matrice 3x3 ou un tableau linéaire de 9 éléments qui ne peuvent être que 1 (pour X) et 0 (pour O), le résultat sera "chat" si personne ne gagne, "perd" si O gagne, "gagne "si X gagne. Il n'y a aucune vérification pour une carte non valide ou une entrée est un tableau a moins de 9 éléments ou plus ou vérifiez chaque élément <2.
Comme commentaire: il convertirait l'entrée dans une matrice 3x3 et construirait un tableau nommé "x" où les éléments sont la somme de chaque colonne de ligne et diagonale.
Certains tests voient l'exemple montré par d'autres:
la source