Count Mills in Nine คนมอร์ริส


21

บทนำ

Morris ของ Nine Mens (หรือเรียกอีกอย่างว่า Mills) เป็นเกมกระดานสำหรับผู้เล่นสองคนซึ่งเล่นบนกระดานต่อไปนี้ (ภาพที่นำมาจากหน้า Wikipedia-link):

คณะกรรมการโรงสี

ผู้เล่นแต่ละคนมี 9 คนสีดำและสีขาว กฎที่เป็นรูปธรรมนั้นไม่สำคัญสำหรับความท้าทายนี้ แต่ลองดูที่หน้า Wikipediaถ้าคุณสนใจ

ความท้าทาย

กำหนดตารางเป็น input ซึ่งหมายถึงการ boardstate บางอย่างที่ส่งออกนับโรงงานทั้งหมดที่มีm ชายสามคนที่มีสีเดียวกันจะก่อตัวเป็นมิลล์เมื่อพวกเขาอยู่ในแนวตรงของจุดเชื่อมต่อ ถึงไม่ใช่โรงสีเนื่องจากผู้ชายมีสีต่างกัน นอกจากนี้เพื่อจะได้รูปแบบโรงงานตั้งแต่สามจุดจะต้องมีการเชื่อมต่อ บอร์ดในภาพด้านบนมีตัวอย่างสองลัอ หนึ่งจากไปและจากไป0<=m<=8
b2f2d2d5
f2f6e3e5

อินพุต

บอร์ดแสดงเป็นกริด 2D ที่มี 24 คะแนนซึ่งเชื่อมต่อตามที่แสดงในภาพตัวอย่างด้านบน ตัวอย่างใช้ตัวอักษรจากa-gสำหรับคอลัมน์และตัวเลขจาก1-7สำหรับแถว แต่คุณสามารถเลือกรูปแบบการป้อนข้อมูลที่สมเหตุสมผลตราบใดที่มันจับคู่ 24 พิกัดที่ไม่ซ้ำกันกับสถานะใดสถานะหนึ่งต่อไปนี้:

  • ว่างเปล่า
  • ถ่ายโดยคนดำ
  • ถ่ายโดยสีขาว

การกลับใจที่เป็นรูปธรรมนั้นขึ้นอยู่กับคุณว่าคุณไม่ได้ถูก จำกัด ให้เป็น "b" หรือ "w" สำหรับสี

นอกจากนี้ข้อมูลที่คุณป้อนอาจไม่มีข้อมูลเพิ่มเติมใด ๆ

หมายเหตุเพิ่มเติม

  • คุณไม่จำเป็นต้องแมปคะแนนด้วยค่าใด ๆ ถ้าคุณต้องการที่จะรับอินพุตเป็นอาเรย์ 2 มิติก็ถือว่าใช้ได้เช่นกัน แต่โปรดจำไว้ว่ามีการใช้งานไม่ได้ทุกจุดและคุณต้องพิจารณาการเชื่อมต่อระหว่างพวกเขา
  • อินพุตอาจว่างเปล่าซึ่งในกรณีนี้คุณต้องเอาท์พุทเป็นศูนย์ (บอร์ดว่างเปล่า -> ไม่มีโรงสี)
  • เนื่องจากผู้เล่นแต่ละคนมี 9 คนการป้อนข้อมูลจะไม่รวมคะแนนมากกว่า 18 แต้ม
  • คุณอาจปล่อยให้จุด emtpy ในอินพุตและดังนั้นเฉพาะจุดอินพุตที่ถ่าย
  • อินพุตอาจถูกสั่งในทางใดทางหนึ่ง คุณไม่สามารถพึ่งพาคำสั่งซื้อที่เฉพาะเจาะจง
  • คุณอาจจะสมมติว่าอินพุตนั้นถูกต้องเสมอ ซึ่งหมายความว่าจะไม่มีชายมากกว่า 9 คนในแต่ละสีและแต่ละจุดจะไม่ซ้ำกัน

กฎระเบียบ

  • ระบุรูปแบบอินพุตที่ชัดเจนที่คุณใช้ในโซลูชันของคุณ ให้ตัวอย่างการรันโปรแกรมของคุณได้รับการสนับสนุนอย่างมาก
  • อนุญาตให้ใช้ฟังก์ชั่นหรือโปรแกรมเต็มรูปแบบ
  • กฎเริ่มต้นสำหรับอินพุต / เอาต์พุต
  • ช่องโหว่มาตรฐานใช้
  • นี่คือดังนั้นจำนวนไบต์ที่น้อยที่สุดจึงชนะ Tiebreaker เป็นการส่งก่อนหน้า

กรณีทดสอบ

รูปแบบการป้อนข้อมูลที่นี่คือรายการของสิ่งอันดับที่มีพิกัดตามตัวอย่างข้างต้นเป็นองค์ประกอบแรกและสถานะขององค์ประกอบที่สองที่เป็นจุด จุดสีขาวถูกทำเครื่องหมายเป็น "w" และจุดที่เป็นสีดำเป็น "b" จุดอื่น ๆ ทั้งหมดถูกปล่อยออกมาและว่างเปล่า

[( "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

Happy Coding!



ฉันคิดว่าสีต้องต่อเนื่องกันและจัดแนว แต่ก็ไม่ชัดเจน เช่นจะเป็น d2, d3, d5 ที่มีสีเดียวกันในโรงสีหรือไม่?
Robert Benson

@RobertBenson ไม่มันจะไม่ใช่เพราะd3และd5ไม่ได้เชื่อมต่อ กฎบอกว่า: Three men of the same color form a mill when they are in a straight row of connected points.. ฉันได้เพิ่มตัวอย่างบางส่วนในส่วนนี้เพื่อให้ชัดเจนขอบคุณสำหรับความคิดเห็น!
Denker

คำตอบ:


4

APL (Dyalog Classic) , 26 25 ไบต์

-1 ขอบคุณ FrownyFrog

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

ลองออนไลน์!

อาร์กิวเมนต์เป็นอาร์เรย์ 3x3x3 ของ1(สีดำ), ¯1(สีขาว) และ0(ว่าง) มิติแรกอยู่ตามความลึกการซ้อนของศูนย์กลางสี่เหลี่ยม อีกสองมิติอยู่ในแนวตั้งและแนวนอน

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

เรามีโรงสีเมื่อไรก็ตามที่รวมกันตามแกนใด ๆ ให้ผล a 3หรือ¯3ยกเว้นว่าเราต้องทิ้งมุมทั้งสี่เมื่อรวมกับแกนแรก

{} เป็นฟังก์ชั่นที่มีข้อโต้แย้งโดยนัย

↓⍵ถูกแบ่ง - ในกรณีของเรามันจะเปลี่ยนลูกบาศก์ 3x3x3 เป็นเมทริกซ์ 3x3 ซ้อนกันของเวกเตอร์ยาว 3 ตัว

⍵⍪↓⍵ เอาลูกบาศก์ดั้งเดิมมาแล้วทำการเมทริกซ์ 3x3 ของเวกเตอร์ 3 ตัวด้านล่างเราจึงได้สเกลาร์และเวกเตอร์ผสม 4x3x3

+/ผลรวมตามแกนสุดท้าย; นี่มีผลรวมของการรวมลูกบาศก์ต้นฉบับตามแกนสุดท้าย ( +/⍵) และรวมมันตามแกนกลางเนื่องจากการแบ่งที่เราทำ ( +/↓⍵)

ตอนนี้เราต้องดูแลเคสพิเศษสำหรับแกนแรก

+⌿⍵ ผลรวมตามแกนแรกคืนเมทริกซ์ 3x3

4 2⍴ แต่เราจะต้องไม่นับมุมดังนั้นเราจึงเปลี่ยนรูปร่างเป็นเมทริกซ์ 4x2 ดังนี้:

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

ตอนนี้เราสนใจเฉพาะคอลัมน์สุดท้าย ( BDFH) ดังนั้นเราจึงใช้สำนวน⊢/

,เชื่อมต่อBDFHกับเมทริกซ์ที่เราได้รับมาก่อนสำหรับแกนที่ 2 และ 3 ( BDFHและเมทริกซ์ทั้งคู่มีมิติชั้นนำเป็น 4)

แปลงทุกอย่างที่เราได้รับให้เป็นเวกเตอร์เดียว

| ใช้ค่าสัมบูรณ์

{ }∩≢ กรองเฉพาะสาม - ความยาว (≢) ของอินพุตอยู่เสมอ 3

นับพวกเขา


เฮ้ฉันแค่อยากจะแนะนำว่า
อดัม

คุณสามารถเข้าร่วมchat.stackexchange.com/rooms/52405/aplสักครู่ได้หรือไม่?
อดัม

≢{|∊(+/⍵⍪↓⍵),⊢/4 2⍴+⌿⍵}∩≢สั้นลงหนึ่ง :)
FrownyFrog

@FrownyFrog ขอบคุณ! แก้ไขใน
พ.ย.

4

JavaScript (ES6), 276 228 125 117 105 ไบต์

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

(ด้านบนมีอักขระ ASCII ที่ไม่สามารถพิมพ์ได้บางตัวซึ่งจะไม่ปรากฏที่นี่ดังนั้นจึงเป็นรุ่นที่ไม่มีตัวbtoaคัดลอกและเรียกใช้)

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

แบ่งสตริงอ้างอิงเป็นตัวอักษรสามตัวที่ตรงกับคีย์กลุ่มมิลล์ อินพุตอยู่ในรูปแบบของวัตถุโดยที่ปุ่มเป็นตัวอักษรa-xโดยเริ่มจากด้านล่างซ้ายและสิ้นสุดที่มุมขวาบนเลื่อนจากซ้ายไปขวาก่อน ค่า1สำหรับสีขาว-1สำหรับสีดำและ0สำหรับที่ว่างเปล่า

ตัวอย่าง

{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

ตัวอย่างเหล่านี้นำมาจากตัวอย่างของ OP ซึ่งแปลงเป็นวัตถุตัวอักษรและตัวเลข ที่แรกมาจากภาพตัวอย่างในขณะที่คนอื่นมาจากชุดตัวอย่าง


1
งานที่ดี! atobคุณสามารถบีบอัดสตริงขนาดใหญ่ที่มี
ETHproductions

@ ETHproductions ขอบคุณ! ดูเหมือนว่าจะใช้อักขระ ascii ที่ไม่สามารถพิมพ์ได้ดังนั้นฉันจะรวมอักขระที่ไม่มีอักขระbtoaด้วย ยังพบการปรับปรุงอื่น ๆ ที่ทำให้มันแย่ลงไปอีก
Mwr247

2

Mathematica, 217 131 Bytes

ในขณะที่ฉันแน่ใจว่านี่ไม่ใช่การแข่งขันโดยเฉพาะนี่คือรายการสำหรับคุณ

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

ตัวอย่างอินพุต:

{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"}

การอนุญาตให้ชื่อพิกัดแบบตัวอักษรเดียวนั้นมีขนาดเล็กลงเหลือ 51 ตัวทำให้เป็นโซลูชั่น 166 ไบต์ การตั้งชื่อผู้เล่น 1 และ 2 แทนที่จะเป็น "w" และ "b" จะมีอักขระเพิ่มอีก 17 ตัว

ดังนั้นเราจึงได้รับ

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]/.#&

ถ้าผมเข้าใจการป้อนข้อมูลการจัดรูปแบบกฎระเบียบอย่างถูกต้องคุณควรจะสามารถที่จะนำพวกเขาในขณะที่และ1 2ตัวอย่างที่ใช้wและbแต่ฉันค่อนข้างแน่ใจว่าเราไม่ได้ จำกัด อยู่แค่นั้น
Mwr247

@ Mwr247 คุณพูดถูก คุณสามารถใช้รูปแบบใดก็ได้ที่คุณต้องการตราบใดที่มันไม่เพิ่มข้อมูลเพิ่มเติม ฉันจะอธิบายเรื่องนี้เมื่อฉันอยู่บ้าน
Denker

1

APL (Dyalog Unicode) , 50 ไบต์

"ทางออกของวัตถุ"

ในขณะที่อีกต่อไป (29 ตัวอักษร) กว่าโซลูชันของ @ ngnมันใช้วิธีการที่แตกต่างกันอย่างสิ้นเชิง: อินพุตมีโครงสร้างโดยรวมเช่นเดียวกับโซลูชันนั้น แต่สล็อตทั้งหมดจะแสดงเป็นวัตถุ ช่องว่าง (รวมถึงคอลัมน์กลางที่ไม่มีอยู่) จะต้องเป็นวัตถุว่างเปล่า ในขณะที่ชายผิวดำทุกคนจะต้องอ้างอิงถึงวัตถุ "ชายผิวดำ" และชายผิวขาวทุกคนจะต้องอ้างอิงถึงวัตถุ "ชายผิวขาว" วัตถุทั้งหมดอาจเป็นทางเลือกที่มีดีD isplay F orm s สำหรับการอ่านและคอลัมน์กลางสามารถเลือกที่จะทำให้มองไม่เห็น

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

ลองออนไลน์!

+/ ผลรวมของ

1=(... ) สิ่งที่อยู่ใน

≢¨() บันทึกของ

  , raveled (บี้)

  ∪/ ชุดที่ไม่ซ้ำกันทั่ว

  , ตัดแบ่งเป็น

  ∪⌿⍤2 ชุดที่ไม่ซ้ำกันลง

,(... ) ตัดแบ่ง

  ⊢/ คอลัมน์ขวาสุดของ

  4 2⍴ เปลี่ยนเป็นสี่แถวและสองคอลัมน์

  ∪⌿ ชุดคอลัมน์ไม่ซ้ำกัน

ยอดผู้ประกอบการเป็นที่มาพร้อมกับ AGL ( ä) จะนำมาลงความยาวถึง 27 ตัวอักษร

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.