Wydrukuj tę grę w kółko i krzyżyk!

9

Oto deska do gry w kółko i krzyżyk:

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

Biorąc pod uwagę zestaw ruchów, wydrukuj planszę z włączonymi żetonami.

Dane wejściowe będą pobierane jako ruchy oddzielone spacjami, przy czym każdy ruch będzie:

  • Najpierw token, który idzie
  • Następnie litera kolumny, po której się porusza
  • Na koniec numer wiersza, w którym się porusza

Pamiętaj, że normalne zasady gry w kółko i krzyżyk nie mają znaczenia.

Ponadto nie ma potrzeby drukowania liter i cyfr.

Na przykład dane wejściowe Ob2 Xc2 Ob3 Xa1spowodują

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

Pamiętajcie, że to jest , więc wygrywa kod o najmniejszej liczbie bajtów.

Liderów

Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka.

Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

# Language Name, N bytes

gdzie Njest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:

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

Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:

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

Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie tabeli wyników:

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

Oliver Ni
źródło
W przypadku problemów z pisaniem należy unikać nieporęcznych formatów we / wy . Uczyń format wejściowy wystarczająco elastycznym. Następnym razem wypróbuj Sandbox .
Erik the Outgolfer
1
@EriktheGolfer uciążliwy? Ten format wejściowy jest prosty i oczywisty
edc65
@ edc65 Chodziło mi o to, że chcę uzyskać dane wejściowe w dowolnym formacie, nie tylko tym, ale chyba już się spóźnia. Myślę, że masz na myśli, że jest wizualnie przejrzysty, ale nie mogłem sobie z tym poradzić. Dlaczego na przykład spacje, a nie jakiś inny separator?
Erik the Outgolfer
1
@EriktheGolfer nie zrozum mnie źle, ale jeśli twój super ekstra ezoteryczny język nie radzi sobie ze spacjami, szkoda ... tym razem będziesz musiał użyć czegoś innego.
edc65,
1
@ edc65 Na przykład w Sesos załadowanie danych wejściowych byłoby dość trudne. Wolałbym listę liczb całkowitych (trzy liczby całkowite na jeden ruch), na przykład 1 2 3dla Xb3(nie musi tak być).
Erik the Outgolfer

Odpowiedzi:

7

JavaScript (ES6), 136 133 129 bajtów

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
źródło
5

Python (2.7), 188 180 bajtów

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
źródło
W trzeciej linii możesz usunąć spacje przed 's
Daniel
Witamy w golfie python! Spójrz na wskazówki dotyczące golfa w Python . Można oddzielić instrukcje, ;pozwalając umieścić cały kod w jednym wierszu, aby zaoszczędzić na wcięciach.
xnor
for y in '123'-> for y in'123'. Ponadto, co powiedział xnor: możesz uczynić swoją funkcję jednowierszową, używając ;do oddzielania instrukcji. Korzystając z tych wszystkich wskazówek golfowych, możesz zagrać w golfa 6 bajtów.
Erik the Outgolfer
4

Python 2, 112 bajtów

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

Drukowanych jest dziewięć wierszy odpowiadających indeksom wierszy r. Indeks wiersza jest liczony od 3do 11w execpętli. Każdy rząd składa się z pionowych linii |łączących trzy 5-znakowe segmenty, które przełączają się między:

  • Pięć spacji
  • Dwie spacje, symbol gracza, a następnie dwie spacje
  • Pięć znaków podkreślenia

Ten typ jest cyklicznie zmieniany r%3, z tym że ostatni wiersz ma spacje, a nie podkreślenia, osiągane za pomocą r%11%3.

Aby znaleźć symbol odtwarzacza dla bieżącej komórki, patrzymy na numer wiersza r/3i literę kolumny cod "abc". Łączymy je, aby utworzyć dwuznakowy ciąg znaków b3, znaleźć jego indeks w ciągu wejściowym, a następnie pobrać symbol ( Xlub O) jeden indeks wcześniej. Jeśli żaden z graczy tam nie grał, finddomyślnie zostanie ustawiona wartość -1, która zostanie zmniejszona -2. Włamujemy s[-2]się -, dodając dwa znaki, gdy wprowadzamy dane.

xnor
źródło
1

PHP, 187 bajtów

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

Pobiera dane wejściowe jako ciąg. Gdybym mógł użyć tablicy, można ją zmniejszyć do $_GET[a]zamiastexplode(" ",$_GET[a])

207 bajtów

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

Najprostszy pomysł na utworzenie 194 bajtów

<?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
źródło
1

Mathematica, 205 bajtów

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

Byłoby to znacznie krótsze, gdybym mógł użyć wbudowanego ... (92 bajty)

Grid@SparseArray[{LetterNumber@#2,FromDigits@#3}->#&@@@Characters/@StringSplit@#,{3,3},"-"]&
JungHwan Min
źródło
1

Java, 138 bajtów

Edytować:

  • -2 bajty wyłączone. Dzięki @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-----");}

Kod:

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
źródło
o[a[1]-'a'][a[2]-'0']=a[0]można o[a[1]-97][a[2]-48]=a[0]
zagrać w
ale jeśli jest to zły wynik, prawda?
norganos
Który błąd masz na myśli?
Roman Gräf,
Format wyjściowy nie jest taki sam jak żądany przez PO.
seshoumara,
1

Partia, 341 339 305 287 bajtów

@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

Zakłada spójny wynik. Edycja: Zapisano 2 bajty, usuwając niepotrzebne spacje. Zapisano 34 bajty, zapisując dane wyjściowe za pomocą forpętli. Zaoszczędzono 18 bajtów, eliminując podprogram.

Neil
źródło
0

Autovim , 110 bajtów (nie konkuruje)

Testuj jazdy Autovim ... To prawie odpowiedź na Vimscript. Nie konkuruje, ponieważ Autovim jest wciąż rozwijany.

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

Aby uruchomić:

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

Nie golfowany:

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

Wyjaśnienie do naśladowania, jeśli istnieje zainteresowanie :)

Christian Rondeau
źródło
0

Groovy, 174 bajtów

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

bez golfa:

{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
źródło
0

CJam, 62 bajty

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

Wypróbuj online

Wyjaśnienie:

" -_ -_ - "_'-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
źródło