Cetak papan tic-tac-toe ini!

9

Inilah papan tic-tac-toe:

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

Dengan serangkaian gerakan, cetak papan dengan token menyala.

Input akan diambil sebagai gerakan yang dipisahkan oleh spasi, dengan setiap gerakan menjadi:

  • Pertama, token yang terjadi
  • Selanjutnya, huruf kolom itu bergerak
  • Terakhir, jumlah baris yang digunakan

Perhatikan bahwa aturan tic-tac-toe yang normal tidak masalah.

Juga, tidak perlu mencetak huruf dan angka.

Misalnya, input Ob2 Xc2 Ob3 Xa1akan menghasilkan

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

Ingat, ini adalah , jadi kode dengan jumlah byte terkecil menang.

Papan peringkat

Berikut ini adalah Stack Snippet untuk menghasilkan leaderboard biasa dan gambaran umum pemenang berdasarkan bahasa.

Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:

# Language Name, N bytes

di mana Nukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:

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

Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:

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

Anda juga dapat membuat tautan nama bahasa yang kemudian akan muncul di cuplikan papan peringkat:

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

Oliver Ni
sumber
Satu hal yang harus dihindari dengan tantangan penulisan adalah format I / O yang rumit . Harap buat format input Anda cukup fleksibel. Lain kali coba Sandbox .
Erik the Outgolfer
1
@EriktheGolfer rumit? Format input ini sederhana dan jelas
edc65
@ edc65 Maksud saya, saya ingin mendapatkan input dalam format apa pun, bukan hanya yang ini, tapi saya kira sudah terlambat sekarang. Saya pikir maksud Anda jelas secara visual, tetapi saya tidak bisa mengatasinya sama sekali. Mengapa spasi dan bukan pemisah lainnya misalnya?
Erik the Outgolfer
1
@EriktheGolfer jangan salah paham, tetapi jika bahasa esoterik Anda yang super ekstra tidak dapat menangani ruang kosong, sayang sekali ... Anda harus menggunakan sesuatu yang lain kali ini saja.
edc65
1
@ edc65 Misalnya, dalam Sesos akan sangat sulit untuk memuat data input. Saya lebih suka daftar bilangan bulat (tiga int untuk satu gerakan), seperti 1 2 3untuk Xb3(tidak harus persis seperti itu).
Erik the Outgolfer

Jawaban:

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
sumber
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]))
Joshua David
sumber
Di baris ketiga Anda dapat menghapus spasi sebelum tanggal 's
Daniel
Selamat datang di golf python! Lihatlah tips golf Python . Anda dapat memisahkan pernyataan dengan ;memungkinkan Anda meletakkan semua kode Anda pada satu baris untuk menghemat lekukan.
xnor
for y in '123'-> for y in'123'. Juga, apa yang dikatakan xnor: Anda dapat membuat fungsi Anda menjadi satu-liner, gunakan ;untuk memisahkan pernyataan. Dengan menggunakan semua tips golf ini, Anda dapat golf 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

Sembilan baris dicetak sesuai dengan indeks baris r. Indeks baris dihitung dari 3ke 11dalam satu execlingkaran. Setiap baris terdiri dari garis-garis vertikal yang |menggabungkan tiga segmen 5-karakter yang berputar antara:

  • Lima ruang
  • Dua spasi, simbol pemain, lalu dua spasi
  • Lima garis bawah

Jenis ini dibuat dengan siklus r%3, kecuali baris terakhir memiliki spasi daripada garis bawah, dicapai dengan r%11%3.

Untuk menemukan simbol pemain untuk sel saat ini, kita melihat nomor baris r/3dan huruf kolom cdari "abc". Kami menggabungkan mereka untuk membuat string dua karakter seperti b3, menemukan indeksnya di string input, dan kemudian mengambil simbol ( Xatau O) satu indeks sebelumnya. Jika tidak ada pemain yang bermain di sana, findakan default untuk -1, yang menurun ke -2. Kami hack s[-2]untuk menjadi -dengan menambahkan dua karakter ketika kita mengambil input.

Tidak
sumber
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;

Mengambil input sebagai string. Jika saya bisa menggunakan array, itu bisa dikurangi menjadi $_GET[a]bukanexplode(" ",$_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;

Ide paling sederhana untuk membuat 194 Bytes ini

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

Ini akan menjadi jauh lebih pendek jika saya bisa menggunakan built-in ... (92 bytes)

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

Java, 138 byte

Edit:

  • Off -2 byte. Terima kasih kepada @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-----");}

Kode:

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
sumber
o[a[1]-'a'][a[2]-'0']=a[0]dapat o[a[1]-97][a[2]-48]=a[0]
bermain golf
tetapi jika itu output yang salah, bukan?
norganos
Kesalahan apa yang Anda maksud?
Roman Gräf
Format output tidak sama dengan yang diminta oleh OP.
seshoumara
1

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

Mengasumsikan output yang konsisten. Sunting: Disimpan 2 byte dengan menghapus spasi yang tidak perlu. Disimpan 34 byte dengan menulis output menggunakan forloop. Disimpan 18 byte dengan menghilangkan subrutin.

Neil
sumber
0

Autovim , 110 byte (tidak bersaing)

Tes mengemudi Autovim ... Ini cukup banyak jawaban Vimscript. Tidak bersaing karena Autovim masih dikembangkan.

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

Untuk menjalankannya:

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

Tidak Disatukan:

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

Penjelasan untuk mengikuti jika ada minat :)

Christian Rondeau
sumber
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
sumber
0

CJam, 62 byte

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

Cobalah online

Penjelasan:

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