Stampa questa tavola tic-tac-toe!


9

Ecco una tavola tic-tac-toe:

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

Data una serie di mosse, stampa la scheda con i gettoni attivi.

L'input verrà preso come mosse separate da spazi, con ogni mossa che è:

  • Innanzitutto, il token che sta succedendo
  • Successivamente, la lettera della colonna su cui si sta spostando
  • Infine, il numero della riga su cui si sta spostando

Nota che le normali regole del tic-tac-toe non contano.

Inoltre, non è necessario stampare lettere e numeri.

Ad esempio, l'input Ob2 Xc2 Ob3 Xa1provocherebbe

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

Ricorda, questo è , quindi vince il codice con il minor numero di byte.

Classifiche

Ecco uno snippet di stack per generare sia una classifica regolare che una panoramica dei vincitori per lingua.

Per assicurarti che la tua risposta venga visualizzata, ti preghiamo di iniziare la risposta con un titolo, usando il seguente modello Markdown:

# Language Name, N bytes

dov'è Nla dimensione del tuo invio. Se si migliora il punteggio, è possibile mantenere i vecchi punteggi nel titolo, colpendoli. Per esempio:

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

Se si desidera includere più numeri nell'intestazione (ad es. Perché il punteggio è la somma di due file o si desidera elencare separatamente le penalità del flag dell'interprete), assicurarsi che il punteggio effettivo sia l' ultimo numero nell'intestazione:

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

Puoi anche rendere il nome della lingua un collegamento che verrà quindi visualizzato nello snippet della classifica:

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


Una cosa da evitare con le difficoltà di scrittura sono i formati I / O ingombranti . Rendi il tuo formato di input abbastanza flessibile. La prossima volta prova Sandbox .
Erik the Outgolfer,

1
@EriktheGolfer ingombrante? Questo formato di input è semplice ed evidente
edc65,

@ edc65 Intendevo questo, voglio ottenere input in qualsiasi formato, non solo questo, ma credo che ormai sia tardi. Penso che tu intenda che sia visivamente chiaro, ma non sono riuscito a gestirlo affatto. Perché gli spazi e non qualche altro separatore per esempio?
Erik the Outgolfer,

1
@EriktheGolfer non fraintendetemi, ma se il vostro linguaggio esoterico super extra non può gestire gli spazi vuoti, peccato ... dovrete usare qualcos'altro proprio questa volta.
edc65,

1
@ edc65 Ad esempio, in Sesos sarebbe abbastanza difficile persino caricare i dati di input. Preferirei un elenco di numeri interi (tre in per una mossa), come 1 2 3per Xb3(non deve essere esattamente quello).
Erik the Outgolfer,

Risposte:


7

JavaScript (ES6), 136 133 129 byte

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"))


5

Python (2.7), 188 180 byte

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]))

Nella terza riga puoi rimuovere gli spazi prima della 's
Daniel

Benvenuto nel golf di Python! Dai un'occhiata ai suggerimenti per il golf di Python . Puoi separare le dichiarazioni ;permettendoti di mettere tutto il codice su una riga per risparmiare sul rientro.
xnor

for y in '123'-> for y in'123'. Inoltre, ciò che xnor ha detto: puoi rendere la tua funzione un liner, usando ;istruzioni separate. Utilizzando tutti questi suggerimenti sul golf, puoi giocare a golf a 6 byte.
Erik the Outgolfer,

4

Python 2, 112 byte

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

Vengono stampate nove righe corrispondenti agli indici delle righe r. L'indice di riga viene conteggiato da 3a 11in un execciclo. Ogni riga è composta da linee verticali che |uniscono tre segmenti di 5 caratteri che si alternano tra:

  • Cinque spazi
  • Due spazi, un simbolo del giocatore, quindi due spazi
  • Cinque trattini bassi

Il tipo è fatto per ciclare con r%3, tranne per il fatto che l'ultima riga ha spazi anziché caratteri di sottolineatura, raggiunti con r%11%3.

Per trovare il simbolo del giocatore per la cella corrente, osserviamo il numero di riga r/3e la lettera della colonna cda "abc". Li concateniamo per creare una stringa di due caratteri come b3, trovarne l'indice nella stringa di input e quindi prendere il simbolo ( Xo O) un indice prima. Se nessuno dei due giocatori ha giocato lì, il findvalore predefinito sarà -1, a cui diminuisce -2. Noi hack s[-2]essere -aggiungendo due personaggi quando prendiamo in ingresso.


1

PHP, 187 byte

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

Prende l'input come stringa. Se potessi usare un array può essere ridotto a $_GET[a]anzichéexplode(" ",$_GET[a])

207 byte

<?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'idea più semplice per creare questo 194 byte

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

1

Mathematica, 205 byte

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

Questo sarebbe molto più breve se potessi usare il built-in ... (92 byte)

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

1

Java, 138 byte

Modificare:

  • -2 byte di sconto. Grazie 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-----");}

Codice:

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-----");
  }
}

o[a[1]-'a'][a[2]-'0']=a[0]può essere giocato a golf di due byte ao[a[1]-97][a[2]-48]=a[0]
Kevin Cruijssen,

ma se l'output è sbagliato, no?
norganos,

Quale errore intendi?
Roman Gräf,

Il formato di output non è lo stesso richiesto dall'OP.
seshoumara,

1

Lotto, 341 339 305 287 byte

@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

Presuppone un output coerente. Modifica: salvato 2 byte rimuovendo gli spazi non necessari. Salvato 34 byte scrivendo l'output usando un forloop. 18 byte salvati eliminando la subroutine.


0

Autovim , 110 byte (non in competizione)

Prova a guidare Autovim ... Questa è praticamente una risposta di Vimscript. Non competere perché Autovim è ancora in fase di sviluppo.

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

Per eseguirlo:

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

Ungolfed:

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

Spiegazione da seguire se c'è interesse :)


0

Groovy, 174 byte

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

ungolfed:

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

0

CJam, 62 byte

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

Provalo online

Spiegazione:

" -_ -_ - "_'-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.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.