ผู้ตั้งถิ่นฐานแห่ง Catan - ถนนที่ยาวที่สุด!


16

นี่คือบอร์ด endgame ของ Settlers of Catan:

คณะกรรมการ Catan

พื้นหลัง:

ถนน (ชิ้นส่วนแท่งยาว) และการตั้งถิ่นฐาน (และเมือง) ถูกสร้างขึ้นโดยกระท่อมเล็ก ๆ เราเข้ารหัสการจัดวางชิ้นส่วนเหล่านี้โดยใช้รูปแบบต่อไปนี้: จากด้านบนเรามีจุดยอดและแนวนอนแนวนอนที่สามารถวางถนนได้ จากนั้นเรามีคอลัมน์ของถนนเท่านั้นและอื่น ๆ การใช้ R สำหรับสีแดง, O สำหรับออเรนจ์และ B สำหรับ Blue และ _ เพื่ออะไรเลยบอร์ดภาพจะถูกเข้ารหัสเป็น:

________RR_R_
__R_
__RR_R_RRR_____R_
B___R
_B_________B__OO_OOR_
B__B_R
BB_BBB_____B____RR_R_
OBB_O
OO__BB_BB__OOO_OO
O_O_
_O_OOO_O_____

บอร์ดแบบนี้จะเป็นสตริงอินพุตของคุณ ตัวอักษรใด ๆ[A-Z]อาจบ่งบอกถึงสีของผู้เล่น แต่จะมีได้ไม่เกินสี่สี มิฉะนั้นบอร์ดรับประกันว่าจะถูกต้องตามกฎของ Settlers ซึ่งหมายถึง:

  • แต่ละสีจะมีเครือข่ายถนนที่ต่อเนื่องกันไม่เกินสองเครือข่ายซึ่งอาจหรือไม่อาจแยกออกจากการตั้งถิ่นฐาน / เมืองของผู้เล่นคนอื่น (อาคารจุดสุดยอด) ดูการตั้งถิ่นฐานสีส้มแยกถนนสีแดงทางด้านขวาของภาพตัวอย่าง
    • เครือข่ายถนนแต่ละสายรับประกันว่าจะมีการชำระอย่างน้อยหนึ่งครั้ง
  • การตั้งถิ่นฐานและเมืองทั้งหมดจะรับประกันว่าอย่างน้อยสองขอบจากการตั้งถิ่นฐาน / เมืองอื่นที่ใกล้ที่สุด
  • ผู้เล่นหนึ่งคนสามารถมี 15 ถนนบนกระดานเกมเท่านั้น
  • สำหรับผู้ที่ชื่นชอบคาตา: ไม่มีความแตกต่างระหว่างการตั้งถิ่นฐานและเมืองเพื่อวัตถุประสงค์ของปัญหานี้ดังนั้นฉันจึงไม่แยกความแตกต่างในสตริงอินพุต

ทั้งหมดนี้ใช้สำหรับข้อมูลจำเพาะของสตริง "อินพุต"

ถนนที่ยาวที่สุด:

ใน Settlers ผู้เล่นจะได้รับชัยชนะสองคะแนนจากการมี "ถนนที่ยาวที่สุด" นี้ถูกกำหนดให้เป็น: ที่ยาวที่สุดที่ต่อเนื่องกันเส้นทางเดียว (วัดถนน) จากจุดเริ่มต้นถึงจุดสิ้นสุดที่ไม่ทำลายโดยนิคมฝ่ายตรงข้ามหรือเมือง รอบไม่เป็นไรตราบใดที่คุณสามารถติดตามเส้นทางจากจุดเริ่มต้นหนึ่งไปยังจุดสิ้นสุดเฉพาะ ดังนั้นการวนซ้ำของถนน 6 เส้นและการแยกออกจากถนนเส้นหนึ่งคือความยาว 7 แต่อีกเส้นทางหนึ่งที่แยกออกจากวงถนนทั้งสองด้าน 6 เส้นจะยังคงมีค่าเท่ากับ 7

ในแผนที่ตัวอย่างถนนสีแดงทางด้านขวามีค่าเพียง 4 เพราะเขาถูกตัดขาดโดยการตั้งถิ่นฐานของส้มที่ด้านขวาของกระดาน (นั่นเป็นเหตุผลที่รวมการตั้งถิ่นฐานทั้งหมด) บลูมีถนนที่มีความยาว 13 และออเรนมีถนนที่มีความยาว 12 ถนนบนสุดของสีแดงมีค่าเพียง 7 เพราะมันไม่ได้เชื่อมต่อกับถนนสองสายที่อยู่ติดกัน

เอาท์พุท:

ผู้เล่นทุกคนที่มีถนนที่ยาวที่สุด (อาจมีมากกว่าหนึ่งถ้ามีความสัมพันธ์) ตามด้วยช่องว่างและ / หรือขีดเส้นใต้ขีดเส้นใต้ในฐาน 10 ของถนนที่มีความยาว

ดังนั้นเอาต์พุตสำหรับบอร์ดตัวอย่างจะเป็น:

B 13

คำแถลงปัญหา:

คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่นรับบอร์ดอินพุตผ่าน STDIN หรือเป็นอากิวเมนต์ของสตริงซึ่งส่งคืนเอาต์พุตที่อธิบายไว้ข้างต้นว่าเป็นสตริงหรือพิมพ์ลงใน STDOUT (หรือทางเลือกที่ใกล้เคียงที่สุด) คุณอาจเลือกที่จะรวมบรรทัดใหม่ขึ้นบรรทัดเดียวในเอาต์พุต

นี่คือโปรแกรมที่สั้นที่สุดชนะ ช่องโหว่มาตรฐานเป็นสิ่งต้องห้ามของหลักสูตร


2
คำแถลงปัญหาที่แท้จริง: ผู้เล่นออเรนจ์เป็นกระตุก
corsiKa

From the top, we have a row horizontal vertices and edges where a road can be placed. Then we have a column of only roads, and so forth. ฉันใช้เวลาหลายนาทีกว่าจะเข้าใจว่ามันหมายถึงอะไร คุณควรอธิบายให้ชัดเจนยิ่งขึ้นว่าแถวแนวนอนนั้นรวมถึงการชำระบัญชีและสถานที่ตั้งถิ่นฐาน
DLosc

@corsiKa ฉันเคยมีคนทำแบบนั้นกับฉันมาก่อน!
Jerry Jeremiah

1
สีส้มและสีแดงในภาพคล้ายกันมาก คุณควรเลือกสีอื่น
mbomb007

คำตอบ:


3

Python 2, 445 400 ไบต์

ฉันเป็นแฟนตัวยงของ Settlers ดังนั้นความท้าทายนี้จึงสนุก

T="^"
Z=26
A=T*52
for i in range(11):A+=(T*(i%2)*3).join(x for x in raw_input()).center(Z,T)
A+=T*52
def f(c,p=0,l=0,B=A):
 b=l;C=B[0:p]+T+B[p+1:];n=(Z,1)[p%2]
 for i in(p<1)*range(390):
    if(i/Z%2<1&i%2>0)|(i/Z%2>0&i%2<1):b=max(b,f(c,i))
 for i in(p-n,p+n)*(B[p]==c):
    for j in(i-Z,i-1,i+1,i+Z)*(B[i]in c+"_"):b=max(b,f(c,j,l+1,C))
 return b
i=l=0
for x in A:
 if x<T:i=f(x)
 if i>l:c=x;l=i
print c,l

คะแนนสะท้อนการแทนที่แต่ละช่องว่างด้วยแท็บ

คำอธิบาย

บรรทัดก่อนที่นิยามฟังก์ชันจะอ่านอินพุตและสร้างบอร์ดมาตรฐานในตัวแปรสตริงเดียว กระบวนการแทรกอักขระ "^" ลงในบรรทัดสั้น ๆ ที่แสดงถึงส่วนของถนนในแนวตั้ง นอกจากนี้ยังเสริมกระดานด้วยอักขระ "^"

^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^________RR_R_^^^^^^^
^^^^^^_^^^_^^^R^^^_^^^^^^^
^^^^__RR_R_RRR_____R_^^^^^
^^^^B^^^_^^^_^^^_^^^R^^^^^
^^_B_________B__OO_OOR_^^^
^^B^^^_^^^_^^^B^^^_^^^R^^^
^^BB_BBB_____B____RR_R_^^^
^^^^O^^^B^^^B^^^_^^^O^^^^^
^^^^OO__BB_BB__OOO_OO^^^^^
^^^^^^O^^^_^^^O^^^_^^^^^^^
^^^^^^_O_OOO_O_____^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^

เมื่อเรียกพร้อมกับพารามิเตอร์เริ่มต้นฟังก์ชั่นจะส่งกลับความยาวของถนนที่มีสีที่กำหนด การวนซ้ำครั้งแรกจะทำงานเฉพาะเมื่อมีการระบุพารามิเตอร์ position (p) มันจะค้นหาความยาวของถนนซ้ำในตำแหน่งถนนที่ถูกต้องในแต่ละตำแหน่งและติดตามเส้นทางที่ยาวที่สุด เมื่อมีถนนที่พารามิเตอร์ตำแหน่งฟังก์ชั่นจะเพิ่มความยาวของถนนที่อยู่ติดกันที่มีสีเดียวกันซ้ำ ๆ ถนนจะถูกแทนที่ด้วย "~" ในสำเนาการทำงานของบอร์ดเพื่อให้แน่ใจว่าจะไม่นับกลุ่มที่นับใหม่แล้ว

รหัสต่อไปนี้นิยามฟังก์ชั่นเรียกใช้ฟังก์ชั่นสำหรับแต่ละสีในบอร์ดและพิมพ์สีและความยาวให้คะแนนสูงสุด

สาธิตได้ที่นี่

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