บอร์ด Solitaire Mancala ที่ได้รับรางวัล


10

Mancalaเป็นชื่อของครอบครัวของเกมกระดานที่มักจะเกี่ยวข้องกับชุดถ้วยที่เต็มไปด้วยเม็ดที่ผู้เล่นจัดการ ความท้าทายนี้จะใช้กฎเฉพาะที่กำหนดไว้สำหรับชุดตัวเลือกเล่นไพ่คนเดียวของเกม

กระดานประกอบด้วย "ตะกร้า" ที่ปลายด้านหนึ่งแล้วตามด้วยจำนวนถ้วยนับไม่ถ้วนเริ่มต้นจาก 1 ถ้วยบางถ้วยจะมีเม็ดประคำอยู่จำนวนหนึ่ง หากnถ้วยที่สามมีnเม็ดบีดอยู่ตรงนั้นคุณอาจ "หว่าน" เม็ดบีดจากมัน การหว่านหมายถึงการนำnลูกปัดทั้งหมดออกจากถ้วยแล้วนำไปใส่ครั้งละหนึ่งถ้วยในตะกร้า ลูกปัดสุดท้ายจะเข้าสู่ตะกร้า ผู้เล่นชนะเมื่อทุกเม็ดบนกระดานอยู่ในตะกร้า

เห็นได้ชัดว่ามีหลายบอร์ดที่ไม่สามารถเอาชนะได้เช่นถ้ามีลูกปัดหนึ่งเม็ดในถ้วยที่สอง ไม่มีการเล่นที่ถูกกฎหมายเพราะถ้วยทั้งหมดที่มี 0 เม็ดไม่สามารถหว่านได้และถ้วยที่สองไม่มีเม็ดพอที่จะหว่าน เห็นได้ชัดว่ามันไม่สนุกดังนั้นงานของคุณคือการสร้างกระดานที่มีชัย

งาน

กำหนดจำนวนเต็มบวกแทนจำนวนของลูกปัดออกรายการของจำนวนเต็มไม่ลบแสดงจำนวนลูกปัดที่ควรใส่ในแต่ละถ้วยเพื่อให้คณะกรรมการมีชัยตามที่อธิบายไว้ข้างต้น รายการนี้ไม่ควรมีศูนย์ใด ๆ ต่อท้าย

สำหรับเม็ดบีดที่กำหนดจำนวนใด ๆ จะมีการกำหนดค่าบอร์ดที่ชนะได้หนึ่งชุดเสมอ

สาธิต

นี่คือการสาธิตวิธีการเล่นกระดานชัยและใส่ของ 4. [0, 1, 3]คณะกรรมการมีชัยคือ [1, 2, 0]เราเริ่มต้นด้วยการย้ายที่ใช้ได้เฉพาะหว่านเม็ดจากถ้วยที่สามที่จะได้รับ ตอนนี้เรามีทางเลือกจริง [0, 2, 0]แต่ถูกต้องเพียงหนึ่งคือการหว่านเมล็ดถ้วยแรกที่ได้รับ: จากนั้นเราหว่านถ้วยที่สองที่ให้ผลผลิต[1, 0, 0]และในที่สุดเราก็หว่านถ้วยแรกอีกครั้งเพื่อให้ได้ถ้วยเปล่าทั้งหมด

กรณีทดสอบ:

1 => [1]
2 => [0, 2]
3 => [1, 2]
4 => [0, 1, 3]
5 => [1, 1, 3]
6 => [0, 0, 2, 4]
7 => [1, 0, 2, 4]
8 => [0, 2, 2, 4]
9 => [1, 2, 2, 4]
10 => [0, 1, 1, 3, 5]
11 => [1, 1, 1, 3, 5]
12 => [0, 0, 0, 2, 4, 6]
13 => [1, 0, 0, 2, 4, 6]
14 => [0, 2, 0, 2, 4, 6]
15 => [1, 2, 0, 2, 4, 6]
16 => [0, 1, 3, 2, 4, 6]
17 => [1, 1, 3, 2, 4, 6]
18 => [0, 0, 2, 1, 3, 5, 7]
19 => [1, 0, 2, 1, 3, 5, 7]
20 => [0, 2, 2, 1, 3, 5, 7]

ขอขอบคุณPeterTaylor ที่มากับโปรแกรมเพื่อสร้างกรณีทดสอบ!


คำตอบ:


5

CJam (21 ไบต์)

M{_0+0#_Wa*\)+.+}ri*`

การสาธิตออนไลน์

คำอธิบาย

ฉันได้รับเทคนิค "unplaying" ที่กล่าวถึงในบทความนี้อย่างอิสระ เราพิสูจน์ด้วยการเหนี่ยวนำว่ามีบอร์ดที่ชนะเพียงหนึ่งเดียวสำหรับจำนวนเม็ดที่กำหนด

กรณีฐาน: ด้วย 0 เม็ดคณะกรรมการที่ชนะเพียงคนเดียวคือคนที่ว่างเปล่า

ขั้นตอนอุปนัย: ถ้าเราหว่านจากถ้วยkแล้วที่ย้ายถ้วยถัดไปkจะว่างเปล่าและทุกถ้วยใกล้ตะกร้าจะมีอย่างน้อยหนึ่งลูกปัด ดังนั้นเราสามารถหากระดานชนะที่มีเอกลักษณ์ด้วยnลูกปัดจากกระดานที่ชนะด้วยn-1ลูกปัดโดยมองหาถ้วยเปล่าที่มีหมายเลขต่ำสุดนำลูกปัดหนึ่งเม็ดจากตะกร้าและหนึ่งถ้วยจากถ้วยด้านล่างแต่ละถ้วยที่ว่างเปล่าและวางไว้ในถ้วยเปล่า

การผ่า

M           e# Start with an empty board
{           e# Loop
  _0+0#     e#   Find position of first 0 (appending to ensure that there is one)
  _Wa*      e#   Make array of that many [-1]s
  \)+       e#   Append the index plus 1 (since board is 1-indexed)
  .+        e#   Pointwise addition
}
ri*         e# Read integer from stdin and execute loop that many times
`           e# Format for display


4

JavaScript (ES6), 63 37 ไบต์

f=(n,d=2)=>n?[n%d,...f(n-n%d,d+1)]:[]

คำตอบ Python ของพอร์ตของ @ orlp คำอธิบาย: พิจารณาจำนวนรวมของเม็ดในiถ้วย th และสูงกว่า การเล่นแต่ละครั้งจากหนึ่งในถ้วยเหล่านี้จะลบiเม็ดเงินจากผลรวมนั้น (ตัวอย่างเช่นถ้าiเป็น 3 และคุณเล่นจากถ้วยที่ห้าคุณจะลดจำนวนเม็ดในถ้วยนั้นลงห้า แต่คุณยังต้องเพิ่มหนึ่งเม็ดลงในถ้วยทั้งสี่และถ้วยที่สาม) ผลรวมจะต้องเท่ากับ iของ ตอนนี้i-1ถ้วย TH ไม่สามารถมีiหรือลูกปัดมากขึ้นดังนั้นเพื่อให้มันออกหลายของมันต้องมีที่เหลือของลูกปัดแบบโมดูโลii

คำอธิบายก่อนหน้า (จากลิงก์ของ @ xnor): วิธีการที่ไร้เดียงสาคือเทคนิค "การเล่นแบบย้อนกลับ" วิธีนี้ใช้การสังเกตที่ทำให้การเล่นทำให้ถ้วยเปล่าดังนั้นการเล่นแบบย้อนกลับจึงรวบรวมลูกปัดจากแต่ละถ้วยและวางลงในถ้วยเปล่าครั้งแรกเช่น (63 ไบต์):

f=n=>n?[...a=f(n-1),0].some((m,i)=>(m?a[i]--:a[i]=i+1)>m)&&a:[]

ตอนนี้ให้พิจารณาiถ้วยแรก ในกรณีที่หนึ่งในนั้นว่างเปล่าการเล่นแบบย้อนกลับจะเพิ่ม1จำนวนรวมของลูกปัดในถ้วยเหล่านั้นในขณะที่ในกรณีที่ไม่มีรายการใดว่างเปล่าการเล่นย้อนกลับจะลบออกiจากยอดรวมอย่างไรก็ตามนี่เทียบเท่ากับการเพิ่ม1โมดูโลi+1. หลังจากnละครย้อนกลับผลรวมของลูกปัดในครั้งแรกที่iถ้วยจึงจะเทียบเท่ากับnโมดูโลi+1หรือวางวิธีจำนวนลูกปัดในอีกiถ้วย TH จะเทียบเท่ากับการลบผลรวมของลูกปัดในถ้วยก่อนหน้านี้โมดูโลn i+1ตอนนี้เพื่อให้iถ้วยที่เล่นได้จำนวนลูกปัดไม่เกินiดังนั้นในความเป็นจริงมันจะเท่ากับจำนวนลูกปัดที่เหลือแบบโมดูโลi+1. (โปรดทราบว่าฉันใช้d=i+1เนื่องจากใช้น้อยกว่าไบต์)


คุณลืมกำหนดฟังก์ชั่นในเวอร์ชั่นโดยใช้วิธีการแก้ปัญหาของ @ orlp เพื่อป้องกันการเรียกซ้ำ นอกจากนี้เกี่ยวกับวิธีแก้ปัญหานั้นการต่อข้อมูลอาเรย์ด้วยกัน+ไม่ใช่สิ่งใน ES6 หรือไม่?
หมึกมูลค่า

@KevinLau โอ๊ะโอและหลังจากนั้นก็ไปที่ปัญหาของการรวมไว้ในไบต์เช่นกัน! แต่ไม่มี + คือการต่อสตริงยกเว้นว่าทั้งสองพารามิเตอร์เป็นตัวเลขหรือบูลีนซึ่งในกรณีนี้คือการบวก โชคดีที่ความเข้าใจในอาเรย์ช่วยให้การต่อข้อมูลโดยพลการง่ายขึ้น
Neil

2

Ruby, 36 ไบต์

คำตอบของ @ orlp พอร์ตเพราะมันอัจฉริยะเกินกว่าจะคิดอะไรดีไปกว่านี้แล้ว

m=->n,i=2{n>0?[n%i]+m[n-n%i,i+1]:[]}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.