Chơi một trò chơi hoàn hảo của Hex Hex


10

Lý lịch

Hex là một trò chơi chiến lược trừu tượng hai người chơi được chơi trên một K×Khình thoi của các hình lục giác. Hai mặt đối diện của hình thoi có màu trắng và hai mặt còn lại màu đen và hai người chơi, đen và trắng, lần lượt đặt mã thông báo màu của chúng lên một ô không có người. Người chơi đầu tiên quản lý để xây dựng một con đường giữa các mặt đối diện của màu sắc của họ là người chiến thắng. Được biết, trò chơi không thể kết thúc với tỷ số hòa và người chơi đầu tiên có chiến lược chiến thắng bất kể quy mô bảng (xem trang Wikipedia để biết chi tiết).

Nhiệm vụ

Trong thử thách này, chúng tôi sửa kích thước bảng tại K = 4và đại diện cho bảng dưới dạng lưới sau. Các đường dày biểu thị gạch liền kề.

Một lưới 4 x 4.

Nhiệm vụ của bạn là tạo ra một chiến lược chiến thắng cho người chơi đầu tiên, bạn có thể chọn màu đen hoặc trắng. Điều này có nghĩa là bất cứ điều gì hợp pháp di chuyển người chơi đối phương thực hiện, chơi của bạn phải dẫn đến một chiến thắng. Đầu vào của bạn là một vị trí trò chơi (sắp xếp các mã thông báo trên bảng) và đầu ra của bạn là một bước đi hợp pháp, theo định dạng được chỉ định bên dưới. Nếu bạn muốn tự mình tìm một chiến lược chiến thắng, đừng đọc spoiler này:

Phác thảo một chiến lược có thể chiến thắng, giả sử màu trắng đi trước. Đầu tiên chọn 5. Sau đó, nếu bạn có một đường dẫn từ 5 đến hàng dưới cùng HOẶC màu đen chọn 0 hoặc 1 tại bất kỳ điểm nào, hãy trả lời bằng cách chọn bất kỳ 0 hoặc 1 nào trống. Nếu màu đen chọn 9 hoặc 13, chọn 10 và tùy theo số 14 hoặc 15 là trống. Nếu màu đen không chọn 9, 13 hoặc 14, thì chọn 9 và tiếp theo tùy theo số 13 hoặc 14 là trống. Nếu màu đen chọn 14, trả lời bằng cách chọn 15. Tiếp theo, chọn 10 nếu nó trống; nếu màu đen chọn 10, trả lời bằng 11. Nếu màu đen thì chọn 6, trả lời bằng 7 và tiếp theo là 2 hoặc 3 bị bỏ trống. Nếu màu đen không chọn 6, hãy chọn nó, vì vậy bạn có một đường dẫn từ 5 đến hàng dưới cùng.

Đầu vào và đầu ra

Đầu vào của bạn là một chuỗi gồm 16 ký tự WBE, viết tắt của màu trắng, đen và trống. Họ đại diện cho gạch của bảng, như liệt kê ở trên. Bạn có thể chọn phương thức nhập (cũng xác định phương thức đầu ra của bạn) từ các mục sau:

  1. Đầu vào từ STDIN, đầu ra đến STDOUT.
  2. Nhập dưới dạng một đối số dòng lệnh, xuất ra STDOUT.
  3. Nhập dưới dạng 16 đối số dòng lệnh một ký tự, xuất ra STDOUT.
  4. Đầu vào là đối số của hàm được đặt tên, đầu ra là giá trị trả về.

Đầu ra của bạn đại diện cho ô mà bạn đặt mã thông báo tiếp theo, vì đến lượt bạn di chuyển. Bạn có thể chọn từ các định dạng đầu ra sau:

  1. Một chỉ số dựa trên không (như được sử dụng trong hình trên).
  2. Một chỉ số dựa trên một.
  3. Chuỗi đầu vào với một chuỗi được Ethay thế bởi bất kỳ Whoặc Bbạn đã chọn cho trình phát của mình.

Quy tắc

Chiến lược của bạn phải mang tính quyết định. Bạn không cần phải xử lý chính xác các vị trí trò chơi không thể truy cập được từ bảng trống bằng chiến lược của bạn hoặc các vị trí đã giành chiến thắng cho một trong hai người chơi và bạn có thể gặp sự cố với họ. Ngược lại, trên các bảng có thể truy cập bằng chiến lược của bạn, bạn phải trả lại một động thái hợp pháp.

Đây là môn đánh gôn, vì vậy số byte thấp nhất sẽ thắng. Sơ hở tiêu chuẩn là không được phép.

Kiểm tra

Tôi đã viết một bộ điều khiển Python 3 để xác nhận các mục, vì nó sẽ cực kỳ tẻ nhạt khi làm bằng tay. Bạn có thể tìm thấy nó ở đây . Nó hỗ trợ ba định dạng đầu vào và các hàm Python 3 (các chức năng trong các ngôn ngữ khác phải được gói vào các chương trình), cả ba định dạng đầu ra và cả hai trình phát. Nếu một chiến lược không chiến thắng, nó sẽ tạo ra một trò chơi thua mà nó tìm thấy, vì vậy bạn có thể điều chỉnh chương trình của mình.


Thử thách này nhắc nhở tôi về việc cố gắng nén AI tic tac toe khi tôi đang viết chương trình máy tính. ticalc.org/archives/files/fileinfo/354/35408.html
Sparr

2
Incorrect response 'WWWWWWWWBBBBBBBB' to message 'WWWWWWWWBBBBBBBB'.Lẽ ra tôi đã thắng từ lâu, hay tôi sai?
Sebastian Höffner

@ SebastianHöffner Trông giống như một lỗi trong bộ điều khiển. Tôi sẽ cố gắng sửa nó khi tôi có thời gian.
Zgarb

@ SebastianHöffner Lỗi bây giờ nên được sửa.
Zgarb

Câu trả lời:


6

Tuyệt vời, 973b

Đây là một thực hiện ngây thơ của chiến lược gợi ý trong câu hỏi. Nó hy vọng bảng sẽ được cung cấp dưới dạng 16 tham số dòng lệnh / bảng chính hex.mbl B W E E E W E E E B E E E E E Evà nó sẽ xuất ra vị trí không có chỉ số của bước di chuyển tiếp theo của màu trắng.

00 }1 }0
&G B? W!
&0 &G &G
!!
00 }0 }1
&H B? W!
&1 &H &H
!!
.. }D .. }9 }9 }D }E }A }D }9 }A .. }E }F }5
}9 B! }E E? W? E? .. E? B? B? W? .. E? .. E?
B! ?0 B! &M &N &O E? &I \\ .. &J .. &K E? &5
?0 ++ ?0 &9 .. &D &P &A &I /\ &J .. &E &L !!
++ .. ++ !! .. !! &E !! \/ &L /\ &K !! &F
\\ .. // .. .. .. !! .. .. \/ .. \/ .. !!
.. =3 \/
&M /\ &N
\/ &O /\ &P
}0 }1 }6 .. }6 .. }7 &7 }2 }3 }A }A }B }E }F
..
..
..
..
..
..
..
..
..
.. .. .. .. .. .. .. .. .. .. .. .. .. B? W!
.. .. .. .. .. .. .. .. .. .. .. .. .. &Q &Q
.. .. .. .. B? .. E? W? E? .. E? B? E? &F \/
.. .. .. &S /\ &T &S &T &U E? &A &R &R !!
.. .. .. &7 .. .. \/ .. &2 &V !! &B \/
.. .. .. !! .. .. &U /\ &V &3 .. !!
.. .. .. .. .. .. .. .. .. !!
.. .. ..
.. .. E?
E? .. &6
&X E? !!
!! &Y
.. !!
}4 }8 }C
\/ \/ \/
30 30 31 31 32 33 35 36 37 39 31 30 31 31 31 33 31 34 31 35
&0 &X &1 &Y &2 &3 &5 &6 &7 &9 &A &A &B &B &D &D &E &E &F &F
:W?
}0
^4
=1
{0
:B?
}0
^0
=0
{0
:E?
}0
^1
=0
{0
:W!
}0
^4
=0
{0
:B!
}0
^0
>0
{0

Tôi nghĩ rằng tôi có thể chơi golf khoảng 200 ký tự trong số này với việc phân nhánh và loại bỏ việc sử dụng lại mã tốt hơn.


Tôi đã thêm tùy chọn cho 16 đối số dòng lệnh và cập nhật tập lệnh xác minh, vì vậy giải pháp này có thể được kiểm tra.
Zgarb

Marbelous +1 (PPCG cho rằng việc thêm các nhân vật này đã cải thiện nhận xét)
Rohan Jhunjhunwala

1

Trăn 3, 100b

b=input()
i=b.find('B')
if b[i]in'BW'and'E'in b:i-=1+(b[i-1]is'W')*4
print((b[:i]+'B'+b[i+1:])[:16])
  • Người chơi: ĐEN
  • Phương thức: STDIN / STDOUT, MODIFIED_BOARD

Chiến lược là đầu tiên tìm kiếm một Btrên bảng. Nếu không có cái này trả về -1, cái mà trong python cũng giống như last index. Do đó, trên một bảng trống, chỉ số đầu tiên của tôi sẽ index=-1là nơi tôi bắt đầu di chuyển.

Nếu trường bên trái của tôi ( index-1) là miễn phí, bước tiếp theo của tôi sẽ đến đó. Nếu nó được thực hiện, tôi đi lên bên trái. Tôi không bao giờ phải di chuyển lên: nếu tôi làm, tôi mất nhịp độ và sẽ thua trò chơi.

Trên một bảng đầy đủ (không có Ebất cứ nơi nào) tôi không thực hiện một di chuyển.

Điều này printcó vẻ hơi kỳ lạ lúc đầu: tôi phải xây dựng bảng mới (mà tôi thực hiện thông qua việc cắt lát) nhưng sau đó tôi cần phải cắt bỏ 16 ký tự. Đây là một bản tường trình vì tôi làm việc với các chỉ số tiêu cực và b[i+1:]do đó sẽ trả lại bảng lỗ và phần còn lại mà tôi mong đợi, điều quan trọng là phải cắt bỏ phần còn lại. Một cách khác có thể là làm việc với các chỉ số tích cực, ví dụ bằng cách lấy (b.find('B')+16)%16, nhưng (+16)%16nhiều hơn một byte ()[:16].

Ung dung:

board = input()
index = board.find('B')
if board[index] in 'BW' and 'E' in board:
    index -= 1 + (board[index-1] is 'W') * 4
print((board[:index] + 'B' + board[index+1:])[:16])

Kiểm tra

Khi chạy bộ kiểm tra bộ điều khiển hex, tôi gặp một số hành vi lạ:

OUT: EEEEEEEEEEEEEEEB
OUT: WEEEEEEEEEEEEEBB
OUT: WWEEEEEEEEEEEBBB
OUT: WWWEEEEEEEEEBBBB
OUT: WWWWEEEEEEEBBBBB
OUT: WWWWWEEEEEBBBBBB
OUT: WWWWWWEEEBBBBBBB
OUT: WWWWWWWEBBBBBBBB
OUT: WWWWWWWWBBBBBBBB

Incorrect response 'WWWWWWWWBBBBBBBB' to message 'WWWWWWWWBBBBBBBB'.

Tôi nghĩ rằng tôi nên đã giành chiến thắng sau lượt thứ 4 hoặc trả lời với cùng một bảng cho một bảng đầy đủ sẽ là một câu trả lời đúng. Không chắc chắn điều gì xảy ra ở đó, đã không lặn sâu hơn nhiều - tôi chỉ muốn kiểm tra xem tôi có bao gồm tất cả các trường hợp "đặc biệt" không. Nhưng vì tôi không phải che đậy những tình huống khi ai đó bắt đầu vào không gian 4 hoặc lâu hơn, nên dù sao cũng không thành vấn đề.

85b

Tuy nhiên, nếu tôi cho phép bản thân mình không kiểm tra một bảng đầy đủ (nghĩa là bỏ đi 'E' in btôi có thể đơn giản hóa thêm mã để chỉ sử dụng 85 byte:

b=input();i=b.find('B')
if i!=-1:i-=1+(b[i-1]is'W')*4
print((b[:i]+'B'+b[i+1:])[:16])

Điều này sẽ dẫn đến những điều sau đây:

Incorrect response 'WWWBWWWWBBBBBBBB' to message 'WWWWWWWWBBBBBBBB'.

Điều này có thể hoặc không thể được tính, và vì tôi thấy đó không phải là một động thái hợp lệ, tôi quyết định đi tìm câu trả lời dài hơn nhưng đúng hơn.

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.