Bá tước Mill ở Nine Men Morris


21

Giới thiệu

Nine Mens's Morris (còn được gọi là Mills) là một trò chơi dành cho hai người chơi được chơi trên bảng sau (hình ảnh được lấy từ trang Wikipedia được liên kết):

Bảng mạch

Mỗi người chơi có 9 người, màu đen và trắng. Các quy tắc cụ thể không quan trọng đối với thử thách này, nhưng hãy xem trang Wikipedia nếu bạn quan tâm.

Các thách thức

Đưa ra một lưới làm đầu vào, đại diện cho một bảng mạch nhất định, đầu ra tổng số máy nghiền mvới 0<=m<=8.
Ba người đàn ông cùng màu tạo thành một cối xay khi họ ở trong một hàng thẳng các điểm được kết nối. b2để f2không phải là một nhà máy kể từ khi những người đàn ông của màu sắc khác nhau. Ngoài ra d2để d5không tạo thành một nhà máy vì ba điểm phải được kết nối.
Bảng trong hình trên có chứa hai nhà máy chẳng hạn. Một từ f2đến f6và một từ e3đến e5.

Đầu vào

Bảng được thể hiện dưới dạng lưới 2D với 24 điểm được kết nối như thể hiện trong hình ảnh ví dụ ở trên. Ví dụ sử dụng các chữ cái a-gcho các cột và số từ 1-7cho các hàng, nhưng bạn có thể chọn bất kỳ định dạng đầu vào hợp lý nào miễn là nó ánh xạ 24 tọa độ duy nhất sang một trong các trạng thái sau:

  • Trống
  • Lấy màu đen
  • Lấy màu trắng

Sự lặp lại cụ thể tùy thuộc vào bạn, bạn không bị giới hạn ở "b" hoặc "w" cho màu sắc.

Bên cạnh đó, đầu vào của bạn có thể không chứa bất kỳ thông tin bổ sung nào.

Ghi chú bổ sung

  • Bạn không phải ánh xạ các điểm theo bất kỳ loại giá trị nào. Nếu bạn muốn lấy đầu vào là một mảng 2D, điều đó cũng tốt. Nhưng hãy nhớ rằng không phải tất cả các điểm trong đó đều được sử dụng và bạn phải xem xét các kết nối giữa chúng.
  • Đầu vào có thể trống, trong trường hợp đó bạn phải xuất không (bảng trống -> không có nhà máy).
  • Vì mỗi người chơi có 9 người, đầu vào sẽ không bao giờ chứa nhiều hơn 18 điểm.
  • Bạn có thể bỏ qua các điểm emtpy trong đầu vào và do đó chỉ lấy các điểm đầu vào.
  • Đầu vào có thể được đặt hàng theo bất kỳ cách nào. Bạn không thể dựa vào một thứ tự cụ thể.
  • Bạn có thể cho rằng đầu vào sẽ luôn hợp lệ. Điều này có nghĩa là sẽ không có hơn 9 người đàn ông của mỗi màu và mỗi điểm sẽ là duy nhất.

Quy tắc

  • Làm rõ định dạng đầu vào bạn sử dụng trong giải pháp của bạn. Cung cấp một ví dụ chạy chương trình của bạn được khuyến khích mạnh mẽ.
  • Chức năng hoặc chương trình đầy đủ cho phép.
  • Quy tắc mặc định cho đầu vào / đầu ra.
  • Tiêu chuẩn áp dụng.
  • Đây là , vì vậy, số byte thấp nhất sẽ thắng. Tiebreaker là trình trước đó.

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

Định dạng đầu vào ở đây là danh sách các bộ dữ liệu có tọa độ như trong ví dụ trên là phần tử đầu tiên và trạng thái của phần tử thứ hai điểm. Một điểm được lấy bởi màu trắng được đánh dấu là "w" và một điểm được lấy bởi màu đen là "b". Tất cả các điểm khác bị bỏ lại và trống rỗng.

[("a4", "w"), ("b2", "b"), ("b4", "b"), ("c4", "b"), ("d1", "w") , ("d2", "w"), ("e3", "w"), ("e4", "w"), ("e5", "w"), ("f2", "b") , ("f4", "b"), ("f6", "b"), ("g4", "w")] -> 2
[("a1", "b"), ("a4", "b"), ("a7", "b"), ("b4", "b"), ("c4", "b") , ("d3", "w"), ("d2", "w"), ("d1", "w")] -> 3
[] -> 0
[("b4", "b"), ("a4", b "), (" c4 ", w")] -> 0
[("b4", "b"), ("a4", b "), (" c4 ", b")] -> 1
[("a1", "b"), ("a4", "b"), ("a7", "b"), ("b2", "b"), ("b4", "b") , ("b6", "b"), ("c3", "b"), ("c4", "b"), ("c5", "b"), ("e3", "w") , ("e4", "w"), ("e5", "w"), ("f2", "w"), ("f4", "w"), ("f6", "w") , ("g1", "w"), ("g4", "w"), ("g7", "w")] -> 8

Chúc mừng mã hóa!



Tôi giả sử màu sắc phải liền kề cũng như căn chỉnh, nhưng nó không rõ ràng một chút. Ví dụ, d2, d3, d5 cùng màu sẽ tạo thành một cối xay?
Robert Benson

@RobertBenson Không, không phải vì d3d5không được kết nối. Quy tắc nói : Three men of the same color form a mill when they are in a straight row of connected points.. Tôi đã thêm một số ví dụ trong phần này tho để làm cho nó rõ ràng, cảm ơn vì nhận xét!
Denker

Câu trả lời:


4

APL (Dyalog Classic) , 26 25 byte

-1 cảm ơn FrownyFrog

≢{|∊(+/⍵⍪↓⍵),⊢/4 2⍴+⌿⍵}∩≢

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

Đối số là một mảng 3x3x3 gồm 1(đen), ¯1(trắng) và 0(trống). Kích thước đầu tiên là dọc theo chiều sâu làm tổ của các hình vuông đồng tâm. Hai kích thước khác là dọc theo trục dọc và trục ngang.

000---------001---------002
 |           |           |
 |  100-----101-----102  |
 |   |       |       |   |
 |   |  200-201-202  |   |
 |   |   |       |   |   |
010-110-210     212-112-012
 |   |   |       |   |   |
 |   |  220-221-222  |   |
 |   |       |       |   |
 |  120-----121-----122  |
 |           |           |
020---------021---------022

Chúng ta có một máy nghiền bất cứ khi nào tổng cộng dọc theo bất kỳ trục nào mang lại một 3hoặc ¯3, ngoại trừ chúng ta phải loại bỏ bốn góc khi tính dọc theo trục đầu tiên.

{} là một hàm với đối số ngầm

↓⍵được phân chia - trong trường hợp của chúng tôi, nó biến một khối 3x3x3 thành một ma trận 3x3 của các vectơ có độ dài-3 lồng nhau

⍵⍪↓⍵ lấy khối lập phương ban đầu và dán ma trận 3x3 của 3 vectơ bên dưới nó, vì vậy chúng ta có được một mảng hỗn hợp 4x3x3 của vô hướng và vectơ

+/tổng dọc theo trục cuối cùng; điều này có tác dụng kết hợp của việc tổng hợp khối ban đầu dọc theo trục cuối cùng ( +/⍵) và tổng hợp nó dọc theo trục giữa do sự phân chia mà chúng ta đã làm ( +/↓⍵)

Bây giờ chúng ta phải chăm sóc trường hợp đặc biệt cho trục đầu tiên.

+⌿⍵ tổng dọc theo trục đầu tiên, trả về ma trận 3x3

4 2⍴ nhưng chúng ta không được tính các góc, vì vậy chúng ta định hình lại nó thành ma trận 4x2 như thế này:

ABC      AB
DEF  ->  CD
GHI      EF
         GH  ("I" disappears)

bây giờ chúng tôi chỉ quan tâm đến cột cuối cùng ( BDFH), vì vậy chúng tôi sử dụng thành ngữ⊢/

,nối BDFHvới ma trận mà chúng ta thu được trước đó cho trục thứ 2 và thứ 3 ( BDFHvà cả hai ma trận đều có kích thước dẫn đầu là 4)

làm phẳng mọi thứ chúng ta thu được cho đến nay thành một vectơ

| lấy các giá trị tuyệt đối

{ }∩≢ chỉ lọc ba phần - độ dài (≢) của đầu vào luôn là 3

đếm chúng


Heh, tôi chỉ đề nghị điều đó.
Adám

Bạn có thể tham gia chat.stackexchange.com/rooms/52405/apl một lát không?
Adám

≢{|∊(+/⍵⍪↓⍵),⊢/4 2⍴+⌿⍵}∩≢ngắn hơn một chút :)
FrownyFrog

@FrownyFrog cảm ơn! chỉnh sửa trong
ngn

4

JavaScript (ES6), 276 228 125 117 105 byte

a=>btoa`i·yø!9%z)ª»-ºü1j;ÝÈ%¥·¡ªÜ"·ç¹Ê1`.replace(/.../g,b=>(a[b[0]]+a[b[1]]+a[b[2]])/3&1||'').length

(ở trên có một số ký tự ascii không thể in được sẽ không hiển thị ở đây, vì vậy đây là phiên bản không có bản btoasao có thể được sao chép và chạy)

a=>'abcdefghijklmnopqrstuvwxajvdksglpbehqtwimrfnucox'.replace(/.../g,b=>(a[b[0]]+a[b[1]]+a[b[2]])/3&1||'').length

Chia một chuỗi tham chiếu thành các bộ ba chữ cái khớp với các khóa nhóm. Đầu vào ở dạng đối tượng, trong đó các phím là các chữ cáia-x , bắt đầu từ dưới cùng bên trái và kết thúc ở trên cùng bên phải, di chuyển từ trái sang phải trước. Các giá trị là 1màu trắng, -1màu đen và màu 0trắng.

Thí dụ

{b:1,d:-1,e:1,f:-1,i:1,k:-1,l:-1,m:1,n:-1,r:1,u:-1} => 2
{j:1,d:-1,k:-1,l:-1,b:1,e:1,i:1,m:1,r:1,f:-1,n:-1,u:-1,o:1} => 2
{a:-1,j:-1,v:-1,k:-1,l:-1,h:1,e:1,b:1} => 3
{} => 0
{k:-1,j:-1,l:1} => 0
{k:-1,j:-1,l:1} => 1
{a:-1,j:-1,v:-1,d:-1,k:-1,s:-1,g:-1,l:-1,p:-1,i:1,m:1,r:1,f:1,n:1,u:1,c:1,o:1,x:1} => 8

Các ví dụ này được lấy từ các ví dụ của OP, được chuyển đổi thành đối tượng khóa chữ và giá trị số. Đầu tiên là từ hình ảnh ví dụ, trong khi những cái khác là từ tập hợp ví dụ.


1
Công việc tốt! Bạn có thể nén chuỗi lớn với atob.
Sản xuất ETH

@ETHproductions Cảm ơn! Dường như nó đang sử dụng các ký tự ascii không thể in được, vì vậy tôi sẽ bao gồm một ký tự không có btoa. Cũng tìm thấy một số cải tiến khác mang nó xuống nhiều hơn.
Mwr247

2

Toán học, 217 131 byte

Mặc dù tôi chắc chắn rằng điều này không đặc biệt cạnh tranh, đây là một mục dành cho bạn.

Count[Total/@{{a1,d1,g1},{b2,d2,f2},{c3,d3,e3},{a4,b4,c4},{e4,f4,g4},{c5,d5,e5},{b6,d6,f6},{a7,d7,g7},{a1,a4,a7},{b2,b4,b6},{c3,c4,c5},{d1,d2,d3},{d5,d6,d7},{e3,e4,e5},{f2,f4,f6},{g1,g4,g7}}/.#/.{"w"->1,"b"->2},3|6]&

Ví dụ đầu vào:

{a4 -> "w", b2 -> "b", b4 -> "b", c4 -> "b", d1 -> "w", d2 -> "w", e3 -> "w", e4 -> "w", e5 -> "w", f2 -> "b", f4 -> "b", f6 -> "b", g4 -> "w"}

Cho phép các tên tọa độ đơn ký tự đánh gôn tầm thường ra 51 ký tự, làm cho điều này trở thành một giải pháp 166 byte. Đặt tên cho người chơi 1 và 2 thay vì "w" và "b" chơi gôn thêm 17 nhân vật.

Vì vậy, chúng tôi nhận được

Count[Total/@{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,a,j,v,d,k,s,g,l,p,b,e,h,q,t,w,r,i,m,f,u,n,c,o,x}~Partition~3,3|6]/.#&

Nếu tôi hiểu chính xác các quy tắc định dạng đầu vào, bạn sẽ có thể đưa chúng vào 12. ví dụ được sử dụng wb, nhưng tôi khá chắc chắn rằng chúng tôi không bị hạn chế về điều đó.
Mwr247

@ Mwr247 Bạn nói đúng. Bạn có thể sử dụng bất kỳ định dạng nào bạn muốn, miễn là nó không thêm thông tin bổ sung. Tôi sẽ làm rõ điều này khi tôi ở nhà.
Denker

1

APL (Dyalog Unicode) , 50 byte

"Giải pháp của các đối tượng"

Mặc dù dài hơn (29 ký tự) so với giải pháp của @ ngn , nhưng nó sử dụng một cách tiếp cận hoàn toàn khác: Đầu vào có cấu trúc tổng thể giống như giải pháp đó, nhưng tất cả các vị trí được thể hiện dưới dạng đối tượng. Các vị trí trống (bao gồm cả cột trung tâm không tồn tại) phải là các đối tượng trống. trong khi tất cả đàn ông da đen phải được tham chiếu đến đối tượng "người da đen" và tất cả đàn ông da trắng phải được tham chiếu đến đối tượng "người da trắng". Tất cả các đối tượng có thể tùy chọn có đẹp D : Hiển thị timeout F orm s cho dễ đọc, và do đó các cột trung tâm có thể tùy chọn được thực hiện vô hình.

+/1=(≢¨(,∪/,∪⌿⍤2),(⊢/4 2⍴∪⌿))

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

+/ Tổng của

1=(Những ) người trong

≢¨(Các ) kiểm đếm của

  , cái rốn (dẹt)

  ∪/ bộ độc đáo trên

  , nối với

  ∪⌿⍤2 đặt độc đáo xuống

,(... ) nối để

  ⊢/ cột ngoài cùng bên phải của

  4 2⍴ , được định hình lại thành bốn hàng và hai cột,

  ∪⌿ bộ cột độc đáo

Một toán tử trên đỉnh , như được cung cấp với AGL ( ä), sẽ đưa độ dài xuống còn 27 ký 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.