In bảng tic-tac-toe này!


9

Đây là một bảng tic-tac-toe:

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

Đưa ra một bộ di chuyển, in bảng với mã thông báo trên.

Đầu vào sẽ được thực hiện dưới dạng di chuyển cách nhau bởi khoảng trắng, với mỗi lần di chuyển là:

  • Đầu tiên, mã thông báo sẽ đi
  • Tiếp theo, chữ cái của cột nó đang di chuyển
  • Cuối cùng, số hàng nó đang di chuyển

Lưu ý rằng quy tắc tic-tac-toe bình thường không thành vấn đề.

Ngoài ra, không cần phải in các chữ cái và số.

Ví dụ: đầu vào Ob2 Xc2 Ob3 Xa1sẽ dẫn đến

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

Hãy nhớ rằng, đây là , vì vậy mã có số byte nhỏ nhất sẽ thắng.

Bảng xếp hạng

Dưới đây là một Stack Snippet để tạo cả bảng xếp hạng thông thường và tổng quan về người chiến thắng theo ngôn ngữ.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

# Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh chúng qua. Ví dụ:

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

Nếu ở đó bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ phiên dịch), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:

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

Bạn cũng có thể đặt tên ngôn ngữ thành liên kết sau đó sẽ hiển thị trong đoạn trích bảng xếp hạng:

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


Một điều cần tránh với các thách thức bằng văn bản là các định dạng I / O cồng kềnh . Vui lòng làm cho định dạng đầu vào của bạn đủ linh hoạt. Lần tới hãy thử Sandbox .
Erik the Outgolfer 8/10/2016

1
@EriktheGolfer cồng kềnh? Định dạng đầu vào này là đơn giản và rõ ràng
edc65

@ edc65 Ý tôi là, tôi muốn nhận đầu vào ở bất kỳ định dạng nào, không chỉ cái này, mà tôi đoán bây giờ đã muộn. Tôi nghĩ bạn có nghĩa là nó rõ ràng trực quan, nhưng tôi không thể xử lý nó cả. Tại sao không gian và không phải một số phân cách khác chẳng hạn?
Erik the Outgolfer

1
@EriktheGolfer đừng hiểu lầm tôi, nhưng nếu ngôn ngữ bí truyền siêu thêm của bạn không thể xử lý các khoảng trắng, quá tệ ... bạn sẽ phải sử dụng thứ khác vào lúc này.
edc65

1
@ edc65 Ví dụ, trong Sesos, sẽ rất khó để tải dữ liệu đầu vào. Tôi thích một danh sách các số nguyên (ba số nguyên cho một lần di chuyển), như 1 2 3cho Xb3(không nhất thiết phải chính xác như vậy).
Erik the Outgolfer

Câu trả lời:


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

Con trăn (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]))

Trong dòng thứ ba, bạn có thể xóa khoảng trắng trước 's
Daniel

Chào mừng bạn đến chơi golf python! Hãy xem các mẹo chơi gôn Python . Bạn có thể tách các câu lệnh bằng cách ;cho phép bạn đặt tất cả mã của mình trên một dòng để lưu vào vết lõm.
xnor

for y in '123'-> for y in'123'. Ngoài ra, những gì xnor đã nói: bạn có thể làm cho chức năng của mình trở thành một lớp lót, sử dụng ;để phân tách các câu lệnh. Sử dụng tất cả các mẹo chơi gôn này, bạn có thể chơi golf 6 byte.
Erik the Outgolfer 8/10/2016

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

Chín hàng được in tương ứng với các chỉ số hàng r. Chỉ số hàng được tính từ 3đến 11trong một execvòng lặp. Mỗi hàng bao gồm các hàng dọc |nối ba phân đoạn 5 ký tự xoay quanh:

  • Năm không gian
  • Hai khoảng trắng, một biểu tượng người chơi, sau đó là hai khoảng trắng
  • Năm dấu gạch dưới

Loại được tạo theo chu kỳ với r%3, ngoại trừ hàng cuối cùng có khoảng trắng thay vì dấu gạch dưới, đạt được với r%11%3.

Để tìm biểu tượng trình phát cho ô hiện tại, chúng tôi xem số hàng r/3và ký tự cột ctừ đó "abc". Chúng tôi ghép chúng lại để tạo thành một chuỗi gồm hai ký tự b3, tìm chỉ mục của chuỗi đó trong chuỗi đầu vào, sau đó lấy ký hiệu ( Xhoặc O) một chỉ mục trước đó. Nếu không có người chơi nào chơi ở đó, thì findsẽ mặc định -1, sẽ giảm xuống -2. Chúng tôi hack s[-2]để được -bằng cách nối thêm hai ký tự khi chúng tôi nhập liệu.


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;

Lấy đầu vào là chuỗi. Nếu tôi có thể sử dụng một mảng, nó có thể được giảm xuống$_GET[a] thay vì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;

Ý tưởng đơn giản nhất để tạo 194 byte này

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

Toán học, 205 byte

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

Điều này sẽ ngắn hơn nếu tôi có thể sử dụng ... (92 byte) tích hợp

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

1

Java, 138 byte

Biên tập:

  • Tắt 2 byte. Cảm ơn @Kevin Kruijssen

Bắn tỉa:

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

Mã số:

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]có thể được chơi bằng hai byte đếno[a[1]-97][a[2]-48]=a[0]
Kevin Cruijssen

Nhưng nếu đầu ra sai, phải không?
norganos

Bạn có lỗi gì?
Roman Gräf

Định dạng đầu ra không giống như yêu cầu của OP.
seshoumara

1

Mẻ, 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

Giả sử đầu ra phù hợp. Chỉnh sửa: Đã lưu 2 byte bằng cách xóa các khoảng trắng không cần thiết. Đã lưu 34 byte bằng cách viết đầu ra bằng một forvòng lặp. Đã lưu 18 byte bằng cách loại bỏ chương trình con.


0

Tự động , 110 byte (không cạnh tranh)

Lái thử Autovim ... Đây là câu trả lời của Vimscript khá nhiều. Không cạnh tranh vì Autovim vẫn đang được phát triển.

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

Để chạy nó:

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

Ung dung:

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

Giải thích để làm theo nếu có lãi :)


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

vô dụng:

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

Dùng thử trực tuyến

Giải trình:

" -_ -_ - "_'-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.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.