Drucken Sie dieses Tic-Tac-Toe-Board!

9

Hier ist ein Tic-Tac-Toe-Board:

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

Drucken Sie bei einer Reihe von Zügen die Tafel mit den Token aus.

Die Eingabe wird als durch Leerzeichen getrennte Züge ausgeführt, wobei jeder Zug wie folgt lautet:

  • Erstens das Token, das geht
  • Als nächstes der Buchstabe der Spalte, in der er sich bewegt
  • Zuletzt die Nummer der Zeile, in der es sich bewegt

Beachten Sie, dass normale Tic-Tac-Toe-Regeln keine Rolle spielen.

Außerdem müssen die Buchstaben und Zahlen nicht gedruckt werden.

Zum Beispiel Ob2 Xc2 Ob3 Xa1würde die Eingabe ergeben

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

Denken Sie daran, dies ist , also gewinnt der Code mit der geringsten Anzahl von Bytes.

Bestenlisten

Hier ist ein Stack-Snippet, mit dem Sie sowohl eine regelmäßige Rangliste als auch eine Übersicht der Gewinner nach Sprache erstellen können.

Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift unter Verwendung der folgenden Markdown-Vorlage:

# Language Name, N bytes

Wo Nist die Größe Ihrer Einreichung? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:

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

Wenn Sie dort mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder Sie die Strafen für Dolmetscherflaggen separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:

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

Sie können den Sprachnamen auch zu einem Link machen, der dann im Leaderboard-Snippet angezeigt wird:

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

Oliver Ni
quelle
Eine Sache, die Sie beim Schreiben vermeiden sollten, sind umständliche E / A-Formate . Bitte machen Sie Ihr Eingabeformat flexibel genug. Probieren Sie das nächste Mal die Sandbox aus .
Erik der Outgolfer
1
@EriktheGolfer umständlich? Dieses Eingabeformat ist einfach und offensichtlich
edc65
@ edc65 Ich meinte, ich möchte Eingaben in jedem Format erhalten, nicht nur in diesem, aber ich denke, es ist schon spät. Ich denke du meinst es ist visuell klar, aber ich konnte überhaupt nicht damit umgehen. Warum zum Beispiel Leerzeichen und kein anderes Trennzeichen?
Erik der Outgolfer
1
@EriktheGolfer Versteh mich nicht falsch, aber wenn deine super extra esoterische Sprache keine Leerzeichen verarbeiten kann, schade ... musst du diesmal etwas anderes verwenden.
edc65
1
@ edc65 In Sesos wäre es beispielsweise ziemlich schwierig, die Eingabedaten überhaupt zu laden. Ich würde eine Liste von ganzen Zahlen bevorzugen (drei Ints für einen Zug), wie 1 2 3für Xb3(muss nicht genau das sein).
Erik der Outgolfer

Antworten:

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

Arnauld
quelle
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
quelle
In der dritten Zeile können Sie die Leerzeichen vor dem 's
Daniel
Willkommen beim Python-Golfen! Schauen Sie sich die Python-Golftipps an . Sie können Anweisungen trennen, ;indem Sie Ihren gesamten Code in eine Zeile setzen, um Einrückungen zu vermeiden.
xnor
for y in '123'-> for y in'123'. Was xnor gesagt hat: Sie können Ihre Funktion zu einem Einzeiler machen, indem Sie ;Anweisungen trennen. Mit all diesen Golftipps können Sie 6 Bytes Golf spielen.
Erik der 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

Es werden neun Zeilen entsprechend den Zeilenindizes gedruckt r. Der Zeilenindex wird in einer Schleife von 3bis hochgezählt . Jede Zeile besteht aus vertikalen Linien11exec| die drei 5-stellige Segmente verbinden, die zwischen folgenden Elementen wechseln:

  • Fünf Felder
  • Zwei Felder, ein Spielersymbol, dann zwei Felder
  • Fünf Unterstriche

Der Typ ist für das Radfahren vorgesehen r%3, außer dass die letzte Zeile eher Leerzeichen als Unterstriche enthält, die mit erreicht werdenr%11%3 .

Um das Spielersymbol für die aktuelle Zelle zu finden, sehen wir uns die Zeilennummer r/3und den Spaltenbuchstaben cvon an "abc". Wir verketten sie, um eine zweistellige Zeichenfolge zu erstellen b3, finden den Index in der Eingabezeichenfolge und nehmen dann das Symbol ( Xoder O) einen Index früher. Wenn keiner der Spieler dort gespielt hat, findwird standardmäßig -1der Wert verwendet, der sich verringert -2. Wir hacken s[-2], -indem wir zwei Zeichen anhängen, wenn wir Eingaben machen.

xnor
quelle
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;

Nimmt die Eingabe als Zeichenfolge. Wenn ich ein Array verwenden könnte, könnte es auf $_GET[a]statt reduziert werdenexplode(" ",$_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;

Die einfachste Idee, diese 194 Bytes zu erstellen

<?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
quelle
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@#]&

Dies wäre viel kürzer, wenn ich die eingebaute ... (92 Bytes) verwenden könnte.

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

Java, 138 Bytes

Bearbeiten:

  • -2 Bytes aus. Vielen Dank an @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
quelle
o[a[1]-'a'][a[2]-'0']=a[0]kann von zwei Bytes biso[a[1]-97][a[2]-48]=a[0]
Kevin Cruijssen
aber wenn es die falsche Ausgabe ist, nicht wahr?
Norganos
Welchen Fehler meinst du?
Roman Gräf
Das Ausgabeformat stimmt nicht mit dem vom OP angeforderten überein.
Seshoumara
1

Batch, 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

Nimmt eine konsistente Ausgabe an. Bearbeiten: 2 Bytes durch Entfernen unnötiger Leerzeichen gespeichert. Sparte 34 Bytes durch Schreiben der Ausgabe mit einer forSchleife. 18 Bytes durch Eliminieren des Unterprogramms gespeichert.

Neil
quelle
0

Autovim , 110 Bytes (nicht konkurrierend)

Probefahrt mit Autovim ... Dies ist so ziemlich eine Vimscript-Antwort. Kein Wettbewerb, da Autovim noch in der Entwicklung ist.

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

Um es auszuführen:

./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

Erklärung bei Interesse :)

Christian Rondeau
quelle
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}}

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
    }
}
norganos
quelle
0

CJam, 62 Bytes

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

Probieren Sie es online aus

Erläuterung:

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