¡Imprima este tablero de tres en raya!

9

Aquí hay un tablero de tres en raya:

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

Dado un conjunto de movimientos, imprime el tablero con las fichas.

La entrada se tomará como movimientos separados por espacios, siendo cada movimiento:

  • Primero, el token que va
  • Luego, la letra de la columna en la que se mueve
  • Por último, el número de la fila en la que se mueve

Tenga en cuenta que las reglas normales de tres en raya no importan.

Además, no es necesario imprimir las letras y los números.

Por ejemplo, la entrada Ob2 Xc2 Ob3 Xa1daría como resultado

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

Recuerde, este es el , por lo que gana el código con el menor número de bytes.

Tablas de clasificación

Aquí hay un fragmento de pila para generar una tabla de clasificación regular y una descripción general de los ganadores por idioma.

Para asegurarse de que su respuesta se muestre, comience con un título, usando la siguiente plantilla de Markdown:

# Language Name, N bytes

¿Dónde Nestá el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:

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

Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:

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

También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento de la tabla de clasificación:

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

Oliver Ni
fuente
Algo que debe evitarse al escribir desafíos son los formatos de E / S engorrosos . Haga que su formato de entrada sea lo suficientemente flexible. La próxima vez prueba el Sandbox .
Erik the Outgolfer
1
@EriktheGolfer engorroso? Este formato de entrada es simple y obvio
edc65
@ edc65 Quise decir eso, quiero recibir información en cualquier formato, no solo en este, pero supongo que ya es tarde. Creo que quieres decir que es visualmente claro, pero no pude manejarlo en absoluto. ¿Por qué espacios y no algún otro separador por ejemplo?
Erik the Outgolfer
1
@EriktheGolfer no me malinterpretes, pero si tu lenguaje esotérico súper extra no puede manejar espacios en blanco, lástima ... tendrás que usar algo más esta vez.
edc65
1
@ edc65 Por ejemplo, en Sesos sería bastante difícil incluso cargar los datos de entrada. Preferiría una lista de enteros (tres entradas para un movimiento), como 1 2 3para Xb3(no tiene que ser exactamente eso).
Erik the Outgolfer

Respuestas:

7

JavaScript (ES6), 136 133 129 bytes

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
fuente
5

Python (2.7), 188 180 bytes

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
fuente
En la tercera línea puede eliminar los espacios antes de la 's
Daniel
¡Bienvenido a python golfing! Eche un vistazo a los consejos de golf de Python . Puede separar las declaraciones ;permitiéndole poner todo su código en una línea para ahorrar sangría.
xnor
for y in '123'-> for y in'123'. Además, lo que dijo xnor: puede hacer que su función sea una línea, utilizando ;para separar declaraciones. Con todos estos consejos de golf, puede jugar al golf 6 bytes.
Erik el Outgolfer
4

Python 2, 112 bytes

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

Se imprimen nueve filas correspondientes a los índices de fila r. El índice de la fila se cuenta desde 3hasta 11en un execbucle. Cada fila consta de líneas verticales que |unen tres segmentos de 5 caracteres que alternan entre:

  • Cinco espacios
  • Dos espacios, un símbolo de jugador, luego dos espacios
  • Cinco guiones bajos

El tipo está hecho para ciclar r%3, excepto que la última fila tiene espacios en lugar de guiones bajos, logrados con r%11%3.

Para encontrar el símbolo del jugador para la celda actual, miramos el número de fila r/3y la letra cde la columna "abc". Los concatenamos para hacer una cadena de dos caracteres como b3, encontrar el índice en la cadena de entrada y luego tomar el símbolo ( Xo O) un índice antes. Si ninguno de los jugadores jugó allí, el findvalor predeterminado será -1, que disminuye a -2. Hackeamos s[-2]estar -añadiendo dos personajes cuando tomamos entrada.

xnor
fuente
1

PHP, 187 bytes

<?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;

Toma la entrada como cadena. Si pudiera usar una matriz, se puede reducir a en $_GET[a]lugar deexplode(" ",$_GET[a])

207 bytes

<?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;

La idea más simple para crear estos 194 Bytes

<?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
fuente
1

Mathematica, 205 bytes

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

Esto sería mucho más corto si pudiera usar el incorporado ... (92 bytes)

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

Java, 138 bytes

Editar:

  • -2 bytes desactivados. Gracias a @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-----");}

Código:

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
fuente
o[a[1]-'a'][a[2]-'0']=a[0]se puede jugar golf por dos bytes ao[a[1]-97][a[2]-48]=a[0]
Kevin Cruijssen
pero si la salida es incorrecta, ¿no?
norganos
¿A qué error te refieres?
Roman Gräf
El formato de salida no es el mismo solicitado por el OP.
seshoumara
1

Lote, 341 339 305 287 bytes

@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

Asume salida consistente. Editar: guardado 2 bytes eliminando espacios innecesarios. Ahorró 34 bytes escribiendo la salida usando un forbucle. Ahorró 18 bytes al eliminar la subrutina.

Neil
fuente
0

Autovim , 110 bytes (no compite)

Prueba de conducción de Autovim ... Esta es más o menos una respuesta de Vimscript. No compite porque Autovim todavía se está desarrollando.

ñ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…

Para ejecutarlo:

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

Sin 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

Explicación a seguir si hay interés :)

Christian Rondeau
fuente
0

Groovy, 174 bytes

{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}}

sin 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
fuente
0

CJam, 62 bytes

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

Pruébalo en línea

Explicación:

" -_ -_ - "_'-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
fuente