Imprimez cette planche tic-tac-toe!

9

Voici une planche tic-tac-toe:

   a     b     c
      |     |     
1  -  |  -  |  -  
 _____|_____|_____
      |     |     
2  -  |  -  |  -  
 _____|_____|_____
      |     |     
3  -  |  -  |  -  
      |     |     

Étant donné un ensemble de mouvements, imprimez le tableau avec les jetons.

Les entrées seront prises comme des mouvements séparés par des espaces, chaque mouvement étant:

  • Tout d'abord, le jeton qui va
  • Ensuite, la lettre de la colonne sur laquelle elle se déplace
  • Enfin, le numéro de la ligne sur laquelle il se déplace

Notez que les règles normales de tic-tac-toe n'ont pas d'importance.

De plus, il n'est pas nécessaire d'imprimer les lettres et les chiffres.

Par exemple, l'entrée Ob2 Xc2 Ob3 Xa1entraînerait

     |     |     
  X  |  -  |  -  
_____|_____|_____
     |     |     
  -  |  O  |  X  
_____|_____|_____
     |     |     
  -  |  O  |  -  
     |     |     

N'oubliez pas qu'il s'agit de , donc le code avec le plus petit nombre d'octets l'emporte.

Classements

Voici un extrait de pile pour générer à la fois un classement régulier et un aperçu des gagnants par langue.

Pour vous assurer que votre réponse apparaît, veuillez commencer votre réponse avec un titre, en utilisant le modèle Markdown suivant:

# Language Name, N bytes

Nest la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores dans le titre, en les rayant. Par exemple:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Si vous souhaitez inclure plusieurs nombres dans votre en-tête (par exemple, parce que votre score est la somme de deux fichiers ou que vous souhaitez répertorier les pénalités de drapeau d'interprète séparément), assurez-vous que le score réel est le dernier numéro de l'en-tête:

# Perl, 43 + 2 (-p flag) = 45 bytes

Vous pouvez également faire du nom de la langue un lien qui apparaîtra ensuite dans l'extrait de classement:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes

Oliver Ni
la source
Une chose à éviter avec les défis d'écriture est les formats d'E / S encombrants . Veuillez rendre votre format d'entrée suffisamment flexible. La prochaine fois, essayez le Sandbox .
Erik the Outgolfer
1
@EriktheGolfer encombrant? Ce format d'entrée est simple et évident
edc65
@ edc65 Je voulais dire que, je veux obtenir des entrées dans n'importe quel format, pas seulement celui-ci, mais je suppose qu'il est tard maintenant. Je pense que vous voulez dire que c'est visuellement clair, mais je ne pouvais pas du tout le supporter. Pourquoi des espaces et pas un autre séparateur par exemple?
Erik the Outgolfer
1
@EriktheGolfer ne me prends pas mal, mais si votre langage super ésotérique super ne peut pas gérer les espaces vides, tant pis ... vous devrez utiliser autre chose juste cette fois.
edc65
1
@ edc65 Par exemple, dans Sesos, il serait assez difficile de même charger les données d'entrée. Je préférerais une liste d'entiers (trois pouces pour un mouvement), comme 1 2 3pour Xb3(ne doit pas être exactement cela).
Erik the Outgolfer

Réponses:

7

JavaScript (ES6), 136 133 129 octets

let f =

i=>eval("for(y=9,s='';y--;s+=`\n`)for(x=18;--x;)s+=x%6-3|y%3-1?' __|'[x%6?y/3:3]||' ':i[i.search('cba'[x/6|0]+(10-y)/3)-1]||'-'")

console.log(f("Ob2 Xc2 Ob3 Xa1"))

Arnauld
la source
5

Python (2.7), 188 180 octets

def f(s):a,b=3*[' '*5],3*['_'*5];c,d,e=[['  '+dict((m[1:],m[0])for m in s.split(' ')).get(x+y,'-')+'  'for x in'abc']for y in'123'];print'\n'.join(map('|'.join,[a,c,b,a,d,b,a,e,a]))
Joshua David
la source
Dans la troisième ligne, vous pouvez supprimer les espaces avant le 's
Daniel
Bienvenue au golf python! Jetez un œil aux conseils de golf Python . Vous pouvez séparer les instructions en ;vous permettant de mettre tout votre code sur une seule ligne pour économiser sur l'indentation.
2016
for y in '123'-> for y in'123'. Aussi, ce que xnor a dit: vous pouvez faire de votre fonction une ligne, en utilisant ;des instructions séparées. En utilisant tous ces conseils de golf, vous pouvez jouer au golf sur 6 octets.
Erik the Outgolfer
4

Python 2, 112 octets

s=input()+'- '
r=3;exec"print'|'.join([' '*5,'  %s  '%s[s.find(c+`r/3`)-1],'_'*5][r%11%3]for c in'abc');r+=1;"*9

Neuf lignes sont imprimées correspondant aux indices de ligne r. L'index de ligne est compté de 3à 11en execboucle. Chaque ligne se compose de lignes verticales |reliant trois segments de 5 caractères qui alternent entre:

  • Cinq espaces
  • Deux espaces, un symbole joueur, puis deux espaces
  • Cinq soulignements

Le type est fait pour alterner avec r%3, sauf que la dernière ligne a des espaces plutôt que des traits de soulignement, obtenus avec r%11%3.

Pour trouver le symbole du joueur pour la cellule actuelle, nous regardons le numéro de ligne r/3et la lettre cde colonne de "abc". Nous les concaténons pour créer une chaîne de deux caractères b3, en trouver l'index dans la chaîne d'entrée, puis prendre le symbole ( Xou O) un index plus tôt. Si aucun des joueurs n'y a joué, le findsera par défaut à -1, qui diminue à -2. Nous piratons s[-2]pour être -en ajoutant deux caractères lorsque nous prenons la saisie.

xnor
la source
1

PHP, 187 octets

<?for(;$i++<162;)$s.=$i%18?($i%6?($i<144&&$i%54>36?"_":($i<144&&$i%54>18&&$i%6==3?"-":" ")):"|"):"\n";foreach(explode(" ",$_GET[a])as$t)$s[20+6*(1+($t[1]<=>b))+54*($t[2]-1)]=$t[0];echo$s;

Prend l'entrée comme chaîne. Si je pouvais utiliser un tableau, il peut être réduit à $_GET[a]au lieu deexplode(" ",$_GET[a])

207 octets

<?foreach(explode(" ",$_GET[a])as$t)$a[(1+($t[1]<=>b))+3*($t[2]-1)]=$t[0];for(;$i++<162;)$s.=$i%18?($i%6?($i<144&&$i%54>36?"_":" "):"|"):"\n";for(;$x<9;)$s[18+54*(($x/3)^0)+2+6*($x%3)]=$a[+$x++]??"-";echo$s;

L'idée la plus simple pour créer ce 194 octets

<?for(;++$i<10;)$s.=($i==9||$i%3?($i%3==2?"  -  |  -  |  -  ":"     |     |     "):"_____|_____|_____")."\n";foreach(explode(" ",$_GET[a])as$t)$s[20+6*(1+($t[1]<=>b))+54*($t[2]-1)]=$t[0];echo$s;
Jörg Hülsermann
la source
1

Mathematica, 205 octets

StringReplacePart[a="     |     |     
";b="  -  |  -  |  -  
";c="_____|_____|_____
";{a,b,c,a,b,c,a,b,a}<>"",##]&@@Transpose[{#,{#,#}&[54LetterNumber@#2+6FromDigits@#3-39]}&@@@Characters/@StringSplit@#]&

Ce serait beaucoup plus court si je pouvais utiliser la fonction intégrée ... (92 octets)

Grid@SparseArray[{LetterNumber@#2,FromDigits@#3}->#&@@@Characters/@StringSplit@#,{3,3},"-"]&
JungHwan Min
la source
1

Java, 138 octets

Éditer:

  • -2 octets éteints. Merci à @Kevin Kruijssen

Snipet:

m->{char[][]o=new char[3][3];for(char[]a:m)o[a[1]-'a'][a[2]-'0']=a[0];for(char[]a:o)System.out.println(a[0]+'|'+a[1]+'|'+a[2]+"\n-----");}

Code:

public static void tictactoe(char[][]moves){
  char[][]o=new char[3][3];
  for(char[]a:moves){
    o[a[1]-79][a[2]-48]=a[0];
  }
  for(char[]a:o){
    System.out.println(a[0]+'|'+a[1]+'|'+a[2]+"\n-----");
  }
}
Roman Gräf
la source
o[a[1]-'a'][a[2]-'0']=a[0]peut être joué par deux octets ào[a[1]-97][a[2]-48]=a[0]
Kevin Cruijssen
mais si c'est la mauvaise sortie, n'est-ce pas?
norganos
De quelle erreur parlez-vous?
Roman Gräf
Le format de sortie n'est pas le même que celui demandé par l'OP.
seshoumara
1

Lot, 341 339 305 287 octets

@for %%a in (a1 a2 a3 b1 b2 b3 c1 c2 c3)do @set %%a=-
@for %%a in (%*)do @set s=%%a&call call set %%s:~1%%=%%s:~0,1%%
@set s="     |     |     "
@for %%l in (%s% "  %a1%  |  %b1%  |  %c1%" %s: =_% %s% "  %a2%  |  %b2%  |  %c2%" %s: =_% %s% "  %a3%  |  %b3%  |  %c3%" %s%)do @echo %%~l

Suppose une sortie cohérente. Modifier: enregistré 2 octets en supprimant les espaces inutiles. Enregistré 34 octets en écrivant la sortie à l'aide d'une forboucle. Économisé 18 octets en éliminant le sous-programme.

Neil
la source
0

Autovim , 110 octets (pas en compétition)

Test de conduite Autovim ... Ceci est à peu près une réponse Vimscript. Pas de concurrence car Autovim est toujours en cours de développement.

ñ5i ␛a|␛ÿp3hr-phv0r_⌥v$kkyPPy2jPP$⌥vG$xGđkÿjp
…nsplit(@m)
ñğ0(@n[2]*3-2)j((char2nr(@n[1])-96)*6-4)lr(@n[0])
e…

Pour l'exécuter:

./bin/autovim run tictactoe.autovim -ni -@m "Ob2 Xc2 Ob3 Xa1"

Non golfé:

execute "normal 5i \<esc>a|\<esc>yyp3hr-phv0r_\<c-v>$kkyPPy2jPP$\<c-v>G$xGddkyyjp"
for @n in split(@m)
execute "normal gg0".(@n[2]*3-2)."j".((char2nr(@n[1])-96)*6-4)."lr".(@n[0]).""
endfor

Explication à suivre en cas d'intérêt :)

Christian Rondeau
la source
0

Groovy, 174 octets

{s->def r=0,o,t=[:];s.split(' ').each{t[it[1..2]]=it[0]};9.times{y->o='';17.times{x->o+=x%6==5?'|':y in [2,5]?'_':x%6==2&&y%3==1?t['abc'[r++%3]+(y+2)/3]?:'-':' '};println o}}

non golfé:

{s->
    def r=0, o, t=[:];
    s.split(' ').each{
        t[it[1..2]]=it[0]
    };
    9.times{y->
        o='';
        17.times{x->
            o+= x%6==5 ? '|' : y in [2,5]? '_' : x%6==2 && y%3==1 ? t['abc'[r++%3]+(y+2)/3]?:'-' : ' '
        };
        println o
    }
}
norganos
la source
0

CJam, 62 octets

" -_ -_ - "_'-Ser_+_@\]3*sqS/{)~\)'a-F*@+3*G+\t}/9/5/'|9*a*zN*

Essayez-le en ligne

Explication:

" -_ -_ - "_'-Ser_+_@\]3*s e# Build a 135 character string representing the 
                           e# columns of the board (top to bottom, left to right)
qS/{)~\)'a-F*@+3*G+\t}/    e# Process the input, put the tokens (O,X) in the string
                           e# The tokens have to placed at indexes 
                           e# [19 22 25 64 67 70 109 112 115]
                           e# This is done with the formula 3*(15x+y)+16,
                           e# where x is the code point of the column letter 
                           e# (minus 'a') and y is the row number.
9/5/'|9*a*zN*              e# Split into its parts, add the column separators, zip 
                           e# and join with newlines.
Neorej
la source