Hubungkan Empat Validator


20

pengantar

Connect Four adalah gim di mana Anda berusaha mendapatkan empat berturut-turut: horizontal, vertikal, atau diagonal. Dalam golf kode ini, kami akan mencoba mencari siapa yang menang, diberikan papan permainan. Akan selalu ada satu pemenang, dan hanya satu pemenang.


Tugas

Diberikan papan Connect Four, cari tahu siapa pemenangnya: Xatau Y. Akan selalu ada satu pemenang, dan hanya satu pemenang. Ukuran papan akan selalu 6 x 7 seperti bagaimana papan permainan ada di dalam gambar.

Diberi papan, papan berikut, dalam hal ini, Xberwarna merah dan Ybiru:

masukkan deskripsi gambar di sini

Masukan Anda adalah:

OOOOOOO
OOOOOOO
OOOOOOO
OOOOXOO
OOOXXOO
OOXYYYY

Anda dapat memisahkan baris permainan dengan karakter baris baru (seperti di atas), tanpa karakter pemisah, membagi baris menjadi array atau daftar, atau Anda dapat memasukkan matriks karakter.

Keluaran yang benar untuk contoh ini:

Y

Y memiliki empat berturut-turut; jadi, Y adalah pemenangnya. Jadi, kami menampilkan Y.


Uji kasus

Memasukkan:

OOOOOOO
OOOOOOO
OOOOOOO
OOOOOOO
OOYYOOO
OYXXXXO

Keluaran:

X

Memasukkan:

OOOOOOO
OOOOOOO
OOOOOOO
XXXXOOO
YXYYOOO
YXYYXYX

Keluaran:

X

Memasukkan:

YXYYXOO
XYXXYOO
XXXYYOO
YYYXXOO
XXYYYYO
XXYYXXO

Keluaran:

Y

Memasukkan:

OOOOOOO
OOOOOOO
OYOOOOO
OOYOOOO
OOOYOOO
OOOOYOO

Keluaran:

Y

Memasukkan:

OOOOOOO
OOOOOOO
OYOOOOX
OOYOOOX
OOOXOOX
OXOXYOX

Keluaran:

X

Mencetak gol

Jumlah byte terkecil menang!


Ini adalah tantangan sempurna untuk PMA / Snails codegolf.stackexchange.com/questions/47311/…
Jerry Jeremiah

2
Bisakah kita berasumsi bahwa pemenang akan selalu memiliki satu token lebih banyak daripada yang kalah?
pecandu matematika

1
@mathjunkie aku salah, Anda tidak dapat mengasumsikan bahwa.
Neil

3
@ nfnneil apakah output harus X atau Y atau dapatkah kita memilih dua output konsisten lainnya untuk menunjukkan pemenang?
Martin Ender

1
Dapatkah kita memilih untuk menggunakan karakter lain sebagai masukan? Atau masukan matriks numerik?
Luis Mendo

Jawaban:


2

Jelly , 19 bytes

UŒD;ŒD;Z;ṡ€4;/ṢEÞṪṪ

Cobalah online!

Inti dari jawaban ini disalin dari jawaban saya untuk pertanyaan yang sangat mirip ini .

Penjelasan

UŒD;ŒD;Z;ṡ€4;/ṢEÞṪṪ
   ;  ; ;             Append {the input} and the following three values:
UŒD                     the antidiagonals of {the input};
    ŒD                  the diagonals of {the input};
       Z                the transposed {input}.
         ṡ 4          Find all length-4 substrings
          €             of each subarray within that.
            ;/        Flatten one level.
                Þ     Sort, with the following sort order:
               E        If all elements are the same, sort later.
              Ṣ         Tiebreak via lexicographical order.
                 ṪṪ   Take the last element of the last element.

Cukup sederhana: kita ambil semua baris, kolom, diagonal, dan antidiagonal (seperti pada validator n-queens), lalu ambil semua panjang-4 substring dari itu, lalu urutkan sedemikian rupa sehingga garis pemenang dari 4 macam menjadi tamat. (Kita perlu tiebreak dalam kasus ada sebuah OOOOdi samping XXXXatau YYYY.) Ambil elemen terakhir dari elemen terakhir, dan itu akan menjadi Xatau Yseperti yang diperlukan.


6

Retina, 51 48 byte

Terima kasih kepada Martin Ender untuk menghemat 3 byte

M`X((.{6}X){3}|(.{8}X){3}|(.{7}X){3}|XXX)
T`d`YX

Cobalah secara Online!

Mengambil input sebagai daftar baris yang dipisahkan koma


Anda dapat menyimpan beberapa byte dengan menggunakan tahap pertandingan dan memperpendek (.{7}X){3}|XXXke (.{7}X|X)\4\4: tio.run/nexus/retina#fc4xCsMwDAXQPfcI2GC6NDS5QaeipcP/…
Martin Ender

1
@ MartinEnder Saya tidak melihat bagaimana Anda dapat menggunakan \4- Anda ingin mengulangi efek dari .{7}, bukan string yang cocok. (Dan menyeimbangkan kelompok mungkin akan terlalu lama.)
Neil

1
@ Neil oh yeah, tidak pernah, entah bagaimana aku tidak menganggap bahwa ada sel OXY selain dari pertandingan di grid. menggunakan tahap pertandingan masih menyimpan 3 byte itu.
Martin Ender

5

Javascript (ES6), 54 55

Sunting 1 byte disimpan, terima kasih @Arnauld

Saya hanya memeriksa apakah X adalah pemenang, karena Akan selalu ada satu pemenang, dan hanya satu pemenang

Input adalah string dengan pemisah apa pun, seperti dalam jawaban @ Arnauld

F=    
b=>'YX'[+[0,6,7,8].some(x=>b.match(`X(.{${x}}X){3}`))]

;['OOOOOOO OOOOOOO OOXOOOO OOXOOOO OOXOOOO OOXOYYY'
 ,'OOOOOOO OOOOOOO OOXOOOO OOYXOOO OOYOXOO OOYYOXY'
 ,'OOOOOOO,OOOOOOO,OOOOOOO,OOOOOOO,OOYYOOO,OYXXXXO'
 ,'OOOOOOO,OOOOOOO,OOOOOOO,XXXXOOO,YXYYOOO,YXYYXYX'
 ,'YXYYXOO,XYXXYOO,XXXYYOO,YYYXXOO,XXYYYYO,XXYYXXO']
.forEach(s => console.log(s,F(s)))


@Arnauld benar, terima kasih
edc65

4

Jelly , 25 22 byte

ŒgL⁼¥Ðf
;UŒD€;Z;$ç€4FṀ

Mengambil daftar string (atau daftar daftar karakter) yang terbentuk dari X,Y , dan O(akan juga bekerja dengan penggantian sehingga ruang memiliki ordinal lebih rendah dari kedua counter).

Cobalah online!atau jalankan versi augmented yang mengambil string multiline.

Bagaimana?

ŒgL⁼¥Ðf - Link 1, runs of given length: list A, length B  e.g. "XYYYXXO", 4
Œg      - group runs of equal elements of A                     ["X","YYY","XX","O"]
     Ðf - filter keep:
    ¥   -     last two links as a dyad:
  L     -         length                                         1   3     2    1
   ⁼    -         equal to B?         (none kept in this case->) 0   0     0    0

;UŒD€;Z;$ç€4FṀ - Main link: list of list of chars (or list of stings) I
 U             - reverse each row of I
;              - I concatenated with that
  ŒD€          - positive diagonals of €ach (positive and negative diagonals)
        $      - last two links as a monad:
      Z        -     transpose of I (i.e. the columns)
       ;       -     concatenated with I (columns + rows)
     ;         - concatenate (all the required directional slices)
         ç€4   - call the last link (1) as a dyad for €ach with right argument = 4
            F  - flatten the result
             Ṁ - take the maximum ('Y'>'X'>'O') - this has the bonus effect of returning:
                               'Y' or 'X' for a winning board; and
                               'O' or '' for a (valid) game in progress.

4

JavaScript (ES6), 77 76 69 byte

Disimpan 7 byte berkat Neil

Mengambil input sebagai sesuatu tali -separated, di mana sesuatu yang pada dasarnya adalah karakter apapun.

b=>[...'XXXXYYYY'].find((c,i)=>b.match(`(${c}.{${(i%4+6)%9}}){3}`+c))

Uji kasus


Kenapa tidak digunakan b.match()? Harus menghemat RegExppanggilan.
Neil

@Neil Saya benar-benar lupa yang match()melakukan konversi implisit ke RegExp. Terima kasih!
Arnauld

3

Python 2 , 143 byte

m=input()
u=[r[::-1]for r in m]
print"YX"[any(any('X'*4in''.join(t[i][j-i]for i in range(j+1))for j in range(6))for t in(m[::-1],m,u,u[::-1]))]

Mengambil daftar string atau daftar daftar karakter. Hard-coded untuk 6 baris dengan 7 kolom, sesuai dengan spesifikasi.

Cobalah online!



2

Python 2 , 201 143 129 128 107 Bytes

Saya memutuskan untuk menambahkan horisontal, vertikal, dan diagonal bersama menjadi satu daftar dan kemudian menambahkan selisih kemudian mencari X untuk kali di dalamnya. Dan karena akan selalu ada pemenang, saya dapat menganggap Y menang jika X tidak. Kode ini mengambil matriks dari semua bagian yang berbeda dan tempat kosong.

lambda m:"YX"[any("X"*4in"".join(a)for a in zip(*m)+m+zip(*["0"*(7-i)+m[i]+"00"*i+m[i]for i in range(6)]))]

Cobalah online!

Kredit

  • Dari 129 hingga 107 byte hanya oleh ASCII .

Sangat bisa diterima untuk menjawab sendiri.
Jonathan Allan

Tanpa melihat terlalu banyak itu, tampaknya ada spasi putih berguna di: i:] for, i, r, r] fordan 1 for.
Yytsi

@ TuukkaX Terima kasih atas masukannya, diperbarui.
Neil

Juga, *(len(m)-1)bisa *~-len(m). Bagaimana itu bekerja.
Yytsi

The ] fordan 1 formasih ada.
Yytsi

1

K (ngn / k) , 58 55 byte

{"XY"@|/&/'88<x ./:/:,/{x+/:/:+3+[4#1-+!3 3]\&4}'+!6 7}

Cobalah online!

{ } berfungsi dengan argumen x

+!6 7 semua kemungkinan pasangan 0..5 dan 0..6

{ }' untuk masing-masing dari mereka

4#1-+!3 3 adalah 4 dari 8 arah orto-diagonal: (1 1;1 0;1 -1;0 1)

3+[ ]\&4 mulai dengan daftar empat nol (&4 ) dan buat 3 langkah di masing-masing arah

x+/:/: mulai dari setiap posisi yang mungkin dan ambil langkah-langkah di setiap arah yang memungkinkan

,/menggabungkan. pada titik ini kami memiliki matriks 4-daftar pasangan koordinat, beberapa di antaranya melampaui papan

x ./:/: cari sel yang sesuai dari x

88<yang mana dari mereka "Y"? (88 adalah kode ascii "X")

&/' yang hanya terdiri dari 4 daftar "Y" -s? (dan-kurangi-masing-masing)

|/adakah setidaknya satu seperti itu? (atau-kurangi)

"XY"@jika false return "X", jika true return"Y"


1

Zsh , 207 ... 159 byte

Riwayat versi: 4 iterasi untuk ~ 25 byte minggu pertama; lalu 3 iterasi lagi untuk ~ 25 byte 6 bulan kemudian.

t(){a=($^a-$^@_);for s l (${w:^^argv})s+=$l&&for ((i=0;i++<$#s;))a[i]+=$s[i];}
w=(+)
t $@
for s;w[++j]=${(l:j:)}_
t $@
t ${(Oa)@}
[[ $a = *XXXX* ]]&&<<<X||<<<Y

( pertama ) ( kedua ) ( ketiga ) ( keempat ) ( kelima ) ( keenam) ) Cobalah secara online!

Di bagian footer, saya mencetak papan input dan larik yang kami buat dari stder ke stderr. Gulir ke bawah untuk debug untuk melihatnya. Array yang kami bangun jauh lebih lama sekarang, karenat produk cartesian dengan papan input menyala setiap panggilan. (Hei, itu memperpendek kode beberapa byte.)

Ada banyak hal untuk dibahas di sini, jadi saya memindahkan komentar (edisi keenam) ke intisari beranotasi .

(tl; dr: transposisi gabungan dari array asli, tetapi pastikan untuk memisahkannya)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.