Kết nối bốn trình xác nhận


20

Giới thiệu

Connect Four là một trò chơi trong đó bạn cố gắng đạt được bốn liên tiếp: theo chiều ngang, chiều dọc hoặc đường chéo. Trong mã golf này, chúng tôi sẽ cố gắng tìm ra người chiến thắng, được đưa ra một bảng trò chơi. Sẽ luôn có một người chiến thắng, và chỉ có một người chiến thắng.


Bài tập

Đưa ra bảng Connect Four, tìm ra ai là người chiến thắng: Xhoặc Y. Sẽ luôn có một người chiến thắng, và chỉ có một người chiến thắng. Kích thước bảng sẽ luôn là 6 x 7 giống như cách bảng trò chơi trong hình.

Trong một bảng, bảng sau, trong trường hợp này, Xcó màu đỏ và Ymàu xanh:

nhập mô tả hình ảnh ở đây

Đầu vào của bạn sẽ là:

OOOOOOO
OOOOOOO
OOOOOOO
OOOOXOO
OOOXXOO
OOXYYYY

Bạn có thể phân tách các hàng của trò chơi theo ký tự dòng mới (như ở trên), không chia ký tự, chia các hàng thành một mảng hoặc danh sách hoặc bạn có thể nhập ma trận các ký tự.

Đầu ra đúng cho ví dụ này:

Y

Y có bốn liên tiếp; vì vậy, Y là người chiến thắng. Vì vậy, chúng tôi đầu ra Y.


Các trường hợp thử nghiệm

Đầu vào:

OOOOOOO
OOOOOOO
OOOOOOO
OOOOOOO
OOYYOOO
OYXXXXO

Đầu ra:

X

Đầu vào:

OOOOOOO
OOOOOOO
OOOOOOO
XXXXOOO
YXYYOOO
YXYYXYX

Đầu ra:

X

Đầu vào:

YXYYXOO
XYXXYOO
XXXYYOO
YYYXXOO
XXYYYYO
XXYYXXO

Đầu ra:

Y

Đầu vào:

OOOOOOO
OOOOOOO
OYOOOOO
OOYOOOO
OOOYOOO
OOOOYOO

Đầu ra:

Y

Đầu vào:

OOOOOOO
OOOOOOO
OYOOOOX
OOYOOOX
OOOXOOX
OXOXYOX

Đầu ra:

X

Chấm điểm

Số byte ít nhất sẽ thắng!


Đây là thử thách hoàn hảo cho PMA / Snails codegolf.stackexchange.com/questions/47311/ Kẻ
Jerry Jeremiah

2
Chúng ta có thể cho rằng người chiến thắng sẽ luôn có nhiều mã thông báo hơn người thua cuộc không?
nghiện toán học

1
@mathjunkie Tôi đã sai, bạn không thể cho rằng.
Neil

3
@nfnneil đầu ra phải là X hoặc Y hay chúng ta có thể chọn hai đầu ra nhất quán khác để chỉ ra người chiến thắng?
Martin Ender

1
Chúng ta có thể chọn sử dụng các ký tự khác làm đầu vào không? Hoặc để nhập một ma trận số?
Luis Mendo

Câu trả lời:


2

Thạch , 19 byte

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

Hãy thử trực tuyến!

Cốt lõi của câu trả lời này được sao chép từ câu trả lời của tôi cho câu hỏi rất giống này .

Giải trình

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.

Khá đơn giản: chúng tôi lấy tất cả các hàng, cột, đường chéo và antidiagon (giống như trong trình xác nhận n-qu Queen), sau đó lấy tất cả các chuỗi con dài 4, sau đó sắp xếp chúng theo cách sao cho dòng chiến thắng gồm 4 loại kết thúc. (Chúng tôi cần tiebreak trong trường hợp có OOOOthêm XXXXhoặc YYYY.) Lấy phần tử cuối cùng của phần tử cuối cùng, và đó sẽ là Xhoặc Ytheo yêu cầu.


6

Võng mạc, 51 48 byte

Cảm ơn Martin Ender đã lưu 3 byte

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

Hãy thử trực tuyến!

Đưa đầu vào dưới dạng danh sách các hàng được phân tách bằng dấu phẩy


Bạn có thể lưu một vài byte bằng cách sử dụng giai đoạn đối sánh và rút ngắn (.{7}X){3}|XXXthành (.{7}X|X)\4\4: tio.run/nexus/retina#fc4xCsMwDAXQPfcI2GC6NDS5QaeipcP/ tựa
Martin Ender

1
@MartinEnder Tôi không thấy cách bạn có thể sử dụng \4- bạn muốn lặp lại hiệu ứng của .{7}chuỗi chứ không phải chuỗi khớp. (Và các nhóm cân bằng có thể sẽ quá dài.)
Neil

1
@Neil oh yeah, nevermind, bằng cách nào đó tôi đã không nghĩ rằng có các ô OXY khác ngoài trận đấu trong lưới. sử dụng giai đoạn khớp vẫn tiết kiệm được 3 byte rồi.
Martin Ender

5

Javascript (ES6), 54 55

Chỉnh sửa 1 byte được lưu cảm ơn @Arnauld

Tôi chỉ kiểm tra xem X có phải là người chiến thắng không, vì sẽ luôn có một người chiến thắng và chỉ có một người chiến thắng

Đầu vào là một chuỗi với bất kỳ dấu phân cách nào, như trong câu trả lời của @ 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 đúng, cảm ơn
edc65

4

Thạch , 25 22 byte

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

Mất một danh sách các chuỗi (hoặc danh sách danh sách các nhân vật) tạo thành từ X, YO(sẽ cũng làm việc với thay thế như vậy mà không gian có thứ tự thấp hơn cả quầy).

Hãy thử trực tuyến! hoặc chạy một phiên bản tăng cường có chuỗi đa dòng.

Làm sao?

Œ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

Đã lưu 7 byte nhờ Neil

Đưa đầu vào dưới dạng một chuỗi phân tách thứ gì đó , trong đó một cái gì đó về cơ bản là bất kỳ ký tự nào.

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

Các trường hợp thử nghiệm


Tại sao không sử dụng b.match()? Nên lưu vào RegExpcuộc gọi.
Neil

@Neil Tôi hoàn toàn quên mất rằng match()đang thực hiện chuyển đổi ngầm thành RegExp. Cảm ơn!
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]))]

Đưa ra một danh sách các chuỗi hoặc một danh sách các danh sách các ký tự. Mã hóa cứng cho 6 hàng bằng 7 cột, như đặc điểm kỹ thuật đảm bảo.

Hãy thử trực tuyến!



2

Python 2 , 201 143 129 128 107 byte

Tôi quyết định thêm ngang, dọc và chéo với nhau vào một danh sách và sau đó thêm gia số sau đó tìm X lần cho nó. Và vì sẽ luôn có người chiến thắng, tôi có thể giả sử Y thắng nếu X không. Mã này có một ma trận của tất cả các phần khác nhau và các vị trí trống.

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)]))]

Hãy thử trực tuyến!

Tín dụng

  • Từ 129 đến 107 byte chỉ bằng ASCII .

Hoàn toàn chấp nhận được để tự trả lời.
Jonathan Allan

Mà không nhìn quá nhiều vào nó, có vẻ là khoảng trắng vô ích tại địa chỉ: i:] for, i, r, r] for1 for.
Yytsi

@TuukkaX Cảm ơn bạn đã nhập, cập nhật.
Neil

Ngoài ra, *(len(m)-1)có thể được *~-len(m). Làm thế nào nó hoạt động.
Yytsi

Các ] for1 forvẫn còn ở đó.
Yytsi

1

K (ngn / k) , 58 55 byte

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

Hãy thử trực tuyến!

{ } chức năng với đối số x

+!6 7 tất cả các cặp có thể có 0..5 và 0..6

{ }' cho mỗi người trong số họ làm

4#1-+!3 3 là 4 trong số 8 hướng chéo: (1 1;1 0;1 -1;0 1)

3+[ ]\&4bắt đầu với một danh sách bốn số không ( &4) và thực hiện 3 bước theo mỗi hướng

x+/:/: bắt đầu từ mỗi vị trí có thể và thực hiện các bước theo từng hướng có thể

,/nối liền. tại thời điểm này, chúng ta có một ma trận gồm 4 danh sách các cặp tọa độ, một số trong số chúng vượt ra ngoài bảng

x ./:/: tra cứu các ô tương ứng từ x

88<cái nào trong số chúng là "Y"-s? (88 là mã ascii của "X")

&/'4 danh sách nào chỉ bao gồm "Y"-s? (và giảm-mỗi)

|/Có ít nhất một như vậy? (hoặc giảm)

"XY"@nếu trả lại sai "X", nếu trả lại đúng"Y"


1

Zsh , 207 ... 159 byte

Lịch sử phiên bản: 4 lần lặp cho ~ 25 byte tuần đầu tiên; sau đó thêm 3 lần lặp lại cho ~ 25 byte 6 tháng sau.

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

( thứ nhất ) ( thứ hai ) ( thứ ba ) ( thứ tư ) ( thứ năm ) ( thứ sáu ) Hãy thử trực tuyến!

Trong phần chân trang, tôi in cả bảng đầu vào và mảng chúng ta xây dựng từ nó sang stderr. Cuộn xuống để gỡ lỗi để xem chúng. Mảng chúng tôi xây dựng lâu hơn rất nhiều, vì tmột sản phẩm cartesian với bảng đầu vào trên mỗi cuộc gọi. (Này, nó rút ngắn mã bằng một vài byte.)

Có rất nhiều điều cần nói ở đây, vì vậy tôi đã chuyển các bình luận (phiên bản thứ sáu) sang một ý chính có chú thích .

(tl; dr: ghép các chuyển vị của mảng ban đầu, nhưng đảm bảo giữ chúng tách biệt)

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.