Latar Belakang
Lewati ke "Tugas" jika Anda terbiasa dengan Tic-Tac-Toe (saya pikir sebagian besar adalah!)
Tic-Tac-Toe adalah gim dua pemain yang terkenal. Ini terdiri dari papan 3x3 yang diisi secara bertahap oleh dua pemain (klarifikasi di bawah); Pemain pertama menggunakan karakter X
dan yang lainnya menggunakan O
. Pemenangnya adalah yang pertama mendapatkan 3 karakter berurutan dan identik ( X
atau O
), baik secara horizontal, vertikal atau diagonal. Jika papan diisi dan tidak ada pemain yang berhasil mendapatkan tiga karakter berturut-turut seperti yang dijelaskan di atas, permainan berakhir dengan seri. Perhatikan bahwa mungkin ada tempat kosong di akhir pertandingan, jika salah satu pemain menang dalam total kurang dari 9 gerakan (ini tidak dapat terjadi jika terjadi seri).
Tugas
Diberikan papan Tic-Tac-Toe di akhir permainan (dalam bentuk string, matriks, daftar datar 9 nilai yang dipesan, format apa pun yang layak), tentukan siapa yang memenangkan permainan.
Input akan terdiri dari nilai yang berbeda dan konsisten , satu untuk
X
, satu untukO
dan yang lain yang mewakili tempat kosong.Program Anda harus dapat menghasilkan 3 nilai yang berbeda, konsisten dan tidak kosong: satu dalam kasus
X
menang, satu lagi jikaO
menang atau lainnya jika para pemain terikat.Silakan tentukan nilai-nilai ini dalam jawaban Anda. Anda dapat mengasumsikan bahwa input tersebut akan menjadi papan Tic-Tac-Toe yang valid.
Uji Kasus
X
, O
, _
Adalah nilai-nilai masukan di sini; X wins
, O wins
dan Tie
untuk output.
X O X
O X _
O _ X
Output: X wins
.
X _ O
X O _
X O X
Output: X wins
.
X O X
_ O X
_ O _
Output: O wins
.
X O X
O O X
X X O
Output: Tie
.
Seperti biasa, semua aturan standar kami berlaku. Ini adalah kode-golf , kode terpendek dalam byte yang menang di setiap bahasa!
sumber
Jawaban:
Jelly ,
16 1514 byteTautan monadik yang menerima daftar daftar (baris - atau kolom) dengan nilai:
Hasil kembali:
Catatan: menggunakan nilai nol untuk
_
, dan nilai yang sama tetapi berlawanan untukX
danO
, nilai ini (di sini0.155
) mungkin dalam kisaran(1/6, 1/7)
(eksklusif di kedua ujungnya) - Saya hanya memilih nilai dalam rentang yang memberikan hasil titik mengambang yang dapat diwakili secara tepat untuk kasus menang.Cobalah online!
Bagaimana?
sumber
Javascript (ES6),
10387 byteMemasukkan
1
2
0
Keluaran
"111"
"000"
"T"
Penjelasan
Uji kasus
sumber
Jelly , 18 byte
Cobalah online!
X
=1
,O
=-1
,_
=0
X menang =
[1, 1, 1]
, O menang =[-1, -1, -1]
, Tie =0
Input sebagai daftar 3 daftar dari 3 elemen di
(1, -1, 0)
masing-masing.sumber
X
=1
,O
=2
,_
=3
, mengembalikan1
(X menang),2
(O menang) atau3
(mengikat).Python 3 , 73 byte
Cobalah online!
Python 2 ,
1009592878277 byteCobalah online!
Mengambil input sebagai string yang dipisahkan oleh baris baru
XO_
Output:
{'XXX'}
untukX
,{'OOO'}
untukO
{}
untuk dasiBekerja dengan mengiris string menjadi kolom baris dan diagonal:
kemudian
'XXX'
dan'OOO'
diperiksa terhadap irisan.Mengambil input sebagai string yang dipisahkan oleh baris baru
XO_
Output:
{'XXX'}
untukX
,{'OOO'}
untukO
{}
untuk dasiBekerja dengan mengiris string menjadi kolom baris dan diagonal:
kemudian
'XXX'
dan'OOO'
diperiksa terhadap irisan.sumber
[2::2]
memotong3579
, sambil[2:8:2]
memberi357
R,
118116115 byteTerima kasih kepada @ user2390246 untuk dua byte tambahan.
Sedikit tidak berbulu:
Mengembalikan
X
jika X menang,O
jika O menang danT
dalam kasus seri.Cobalah online!
sumber
M[c(3,5,7)]
lebih pendek untuk diagonal yang berlawananPerl 5 , 58 byte
56 byte kode + 2 fpr
-p0
.Cobalah online!
Keluaran
X
danO
untuk kemenangan, atauT
untuk seri. Termasuk sekelompok kode header / footer untuk menguji sekaligus.Alternatif, 58 byte
Cobalah online!
sumber
Python 2 ,
124118117115 byte[j*3:j*3+3]
untuk[j*3:][:3]
.Cobalah online!
Nilai input / output
X
direpresentasikan sebagai1
O
direpresentasikan sebagai2
_
direpresentasikan sebagaiNone
sumber
[8,0,3,6,1,4,7,2,5,8,0,4,8,2,4,6]
->map(int,'8036147258048246')
map(ord,"...")
, meskipunnul
byte di tengah-tengah string tidak berhasil ...[j*3:j*3+3]
adalah[j*3:][:3]
. Sebagai catatan,j*3+3
sama dengan-~j*3
, tetapi itu juga 118 byte.01234567
...Python 3 , 173 byte
Cobalah online!
Input sebagai matriks
1 == X, 0 == O, -1 == _
Output sebagai nilai tunggal:
2 == X, 1 == O, 0 == TIE
-8 byte terima kasih kepada Erik the Outgolfer
sumber
lambda x:h(x,1)*2or+h(x,0)
-8 byte dan0 == TIE
(yang lebih cantik imo).PHP, 70 byte
Diasumsikan
-n
(default juru bahasa). Selain itu membutuhkan-R
(mengeksekusi<code>
untuk setiap baris input), dihitung sebagai satu.Input diambil pada satu baris (persis seperti dalam deskripsi masalah, kecuali dengan semua spasi putih dihapus).
Outputnya adalah sebagai berikut:
1
→ X Menang,-1
→ O Menang,0
→ Tie.Cobalah online!
sumber
'X Wins'
dapat diubah menjadi'X'
(atau bahkan bilangan bulat - katakanlah1
). Hal yang sama berlaku untuk'O wins'
danTie
. Itu dikatakan, 109 byte .Retina , 49 byte
Cobalah online!Mengambil input sebagai string 11-karakter dari 9
X
s,O
s atau-
s dalam tiga kelompok tiga yang dipisahkan oleh;
s, meskipun tautan menyertakan header yang menerjemahkan kasus uji yang diberikan ke format ini. Berfungsi dengan mencocokkan garis pemenang secara langsung menggunakan grup penyeimbang untuk memastikan bahwa ketiga karakter yang cocok sama. (Jarak yang cocok adalah 0 (garis horizontal), 4 (terbalik diagonal), 5 (garis vertikal), atau 6 (diagonal); jarak lain akan mengenai;
atau memanjang di luar string.)sumber
Java 8,
1121081061049010293 byte+12 byte (90 → 102) karena perbaikan bug hanya memeriksa satu diagonal, bukan keduanya ..
-9 byte (102 → 93) dengan menggunakan
replaceAll
alih-alihmatches
.Input dalam format
XOX OX_ O_X
, outputX
,O
atauT
.Penjelasan:
Coba di sini.
Penjelasan regex:
sumber
Retina , 127 byte
Cobalah online!
... Saya kira Anda bisa memanggil kekuatan kasar ini ... Pikir mungkin ada beberapa manfaat untuk itu ...
sumber
Retina , 51 byte
Port of Java 8 saya jawab . Masukkan dalam format
XOX OX_ O_X
, outputX
,O
atauT
.Penjelasan:
Coba di sini.
sumber
J, 34 byte
Tidak Disatukan:
Penjelasan
Pengkodean:
Strategi tingkat tinggi kami adalah pertama-tama membuat matriks yang setiap barisnya merupakan kemungkinan kemenangan. Baris satu adalah diagonal /, baris 2 adalah diagonal \, tiga baris berikutnya adalah baris, dan tiga baris terakhir adalah kolom. Bagian ini dipenuhi oleh frasa (menggunakan Item Amend
}
):Akhirnya kami mengambil GCD dari setiap baris:
Berkat pengodean kami, setiap baris dengan kosong akan memiliki GCD 1, seperti juga setiap baris yang berisi campuran Xs dan Os, karena 2 dan 3 adalah coprime. Jadi yang perlu kita lakukan selanjutnya adalah menemukan elemen maksimum:
>./
Jika permainan ini seri, maka akan menjadi 1. Jika seorang pemain menang, itu akan menjadi nomor pemain itu.
Cobalah online!
sumber
JavaScript, 66 byte
Menjaga agar tetap sederhana.
0
sesuai dengan ruang kosong,1
X, dan2
O.0
untuk seri,1
untuk kemenangan X,2
untuk kemenangan O.Diperluas, dengan sedikit komentar:
sumber