Advent Challenge 2: The Vault Raid!


9

<< ก่อนหน้า ถัดไป >>

ท้าทาย

ตอนนี้ซานต้าได้คิดในท้ายที่สุดว่าจะเข้าห้องนิรภัยในปัจจุบันของเขาได้อย่างไรเขาตระหนักดีว่าพวกเอลฟ์เข้ามาอยู่ข้างหน้าเขาแล้วขโมยของขวัญของเขา! พวกเขาไม่ได้คิดวิธีออกจากหลุมฝังศพ แต่ซานต้าจึงต้องพยายามและจับพวกเขาทั้งหมด ทั้งซานต้าและพวกเอลฟ์ต่างก็มีพลังงานไม่ จำกัด ที่จะวิ่งไปรอบ ๆ แต่น่าเสียดายที่พวกเอลฟ์นั้นมีพลังงานที่ไม่มีที่สิ้นสุดดังนั้นถ้าพวกมันวิ่งวนเป็นวง ๆ ทุกที่พวกเอลฟ์ก็จะได้รับอิสระ

ให้กราฟของnโหนและeขอบโดยมีการเดินที่มีอยู่ระหว่างสองโหนและตำแหน่งของเอลฟ์และซานต้ากำหนดจำนวนเอลฟ์ซานต้าที่สามารถจับได้ก่อนที่เขาจะเหนื่อย

การไล่ล่านั้นเป็นแบบเลี้ยว แต่ละรอบเอลฟ์จะย้ายไปพร้อม ๆ กันก่อน (พวกมันสามารถเคลื่อนที่ผ่านกันและกันและเข้าสู่โหนดเดียวกันได้เช่นกัน) จากนั้นซานต้าก็จะเคลื่อนที่ หากซานต้าย้ายไปยังโหนดเดียวกันกับเอลฟ์เขาจะจับเอลฟ์นั้นได้ เอลฟ์แต่ละคนสามารถย้ายจากโหนดเดียวไปยังเพื่อนบ้านได้ในขั้นตอนเดียว ซานต้าก็เหมือนกันในตอนแรก แต่สำหรับเอลฟ์ทุกคนที่เขาจับได้ซานต้าสามารถก้าวไปอีกขั้นหนึ่งได้ ดังนั้นถ้าซานต้าจับเอลฟ์แล้วเขาสามารถย้ายจากโหนดไปยังเพื่อนบ้านของเพื่อนบ้านได้ ซึ่งหมายความว่าเขาสามารถย้ายไปยังโหนดและกลับมา อย่างไรก็ตามเนื่องจากซานต้าทำงานเร็วเกินไปในช่วงเวลานี้เขาจะไม่จับเอลฟ์ที่ผ่านกลางขั้น (ดังนั้นถ้าเขาอยู่บน A, A เชื่อมต่อกับ B, B เชื่อมต่อกับ C จึงมีเอลฟ์อยู่ B และซานต้าย้ายจาก A -> B -> C เอลฟ์ยังไม่ถูกจับ) อย่างไรก็ตามซานต้าไม่จำเป็นต้องย้ายหลายขั้นตอนพร้อมกัน เขาขยับขึ้นไป 1 + (จำนวนเอลฟ์ที่ถูกจับ) ในแต่ละเทิร์น

โปรดทราบว่าพวกเอลฟ์ทุกคนจะต้องย้ายแต่ละเทิร์นและหากเอลฟ์เคลื่อนไปยังโหนดของซานต้าพวกเขาจะถูกจับได้

เอนทิตีทั้งหมด (เอลฟ์ซานต้า) จะอยู่บนโหนดที่ต่างกันในตอนแรก

ข้อมูลจำเพาะและกฎ

โปรแกรมของคุณควรทำงานในเชิงทฤษฎีสำหรับการป้อนข้อมูลทุกขนาด การป้อนข้อมูลจะได้รับเป็นกราฟตำแหน่งของเอลฟ์และตำแหน่งของซานต้า คุณสามารถนำกราฟในรูปแบบที่สมเหตุสมผล (รายการของโหนด + รายการของขอบ, รายการของขอบ, เมทริกซ์ adjacency, สัญลักษณ์วงรอบ, ฯลฯ ) และคุณอาจรับตำแหน่งในรูปแบบที่สมเหตุสมผลใด ๆ ที่ทำงานกับรูปแบบอินพุตกราฟของคุณ (ดัชนี ในรายการโหนด ฯลฯ ) ผลลัพธ์ควรเป็นจำนวนเต็มบวกเดียวซึ่งระบุจำนวนเอลฟ์สูงสุดที่ซานต้าสามารถจับได้

กรณีทดสอบ

สิ่งเหล่านี้ถูกกำหนดให้เป็นรายการของขอบและหมายเลขโหนดสำหรับตำแหน่ง

Input -> Output
[(0, 1), (1, 2)], [0, 2], 1 -> 2 # Easy win for Santa, the elves get themselves caught :P
[(0, 1), (1, 2), (2, 3), (3, 0)], [0, 1], 2 -> 2 # The elf opposite of Santa cannot escape but the other one can always just run away each turn, until Santa catches the first elf. Then he can easily just catch the rest.
[(0, 1), (1, 2), (2, 3), (3, 0)], [1], 0 -> 0 # Santa will never catch up
[(0, 1), (1, 2), (2, 3), (3, 0), (1, 4), (4, 5), ..., (10, 11), (11, 3)], [2, 6], 0 -> 2 # The first elf moves to either 1 or 3 and then gets caught. Then, Santa can use his 2-step move to catch up to the second elf no matter what.

ผมคิดว่าซานตาสามารถจับอย่างใดอย่างหนึ่งหรือเอลฟ์เอลฟ์ทั้งหมดดังนั้นความท้าทายนี้ก็อาจจะ "เขาสามารถจับเอลฟ์" คำใบ้คำใบ้

กฎระเบียบ

  • ช่องโหว่มาตรฐานใช้
  • มันคือ ความท้าทายดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ
  • จะไม่ยอมรับคำตอบ

มีความสุขในการเล่นกอล์ฟ!

หมายเหตุ: ผมดึงแรงบันดาลใจสำหรับชุดความท้าทายนี้จากการจุติของรหัส ฉันไม่มีส่วนเกี่ยวข้องกับเว็บไซต์นี้

คุณสามารถดูรายการของความท้าทายทั้งหมดในซีรีส์โดยดูที่ส่วน 'เชื่อมโยง' ของความท้าทายแรกที่นี่


1
ฉันหวังว่าฉันจะรู้ว่าพวกเอลฟ์ของซานต้านั้นชั่วร้ายมาก่อน ...
Mr. Xcoder

วิธีการแก้ปัญหานี้น่าจะเป็น: 1พิสูจน์งบคณิตศาสตร์ 2โพสต์คำตอบของเยลลี่ (/ ... ) ในเวลาน้อยกว่า 10 ไบต์
user202729

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

แก้ไข: ไม่ใช่สำหรับคำถามแรก แต่อาจเป็นสำหรับคำถามที่สอง
user202729

3
@ user202729 โปรดทราบว่าซานต้าไม่จำเป็นต้องย้ายช่องว่าง 3 ช่อง เขาสามารถย้ายที่ใดก็ได้จาก 1 ถึง 3 ช่องว่าง นั่นอาจเป็นสาเหตุของความสับสนที่นี่
HyperNeutrino

คำตอบ:


1

ภาษา Wolfram (Mathematica) , 129 ไบต์

Block[{a=#},Clear@f;s_~f~e_:=If[s==e,1,s~f~e=0;s~f~e=Min[(hMax[#~f~h&/@a@s,Boole[h==s]])/@a@e]];Tr[Max[(e#3~f~e)/@#2]^#2]]&

ลองออนไลน์!

วิธีการที่คล้ายกันกับคำตอบของฉันสำหรับคำถามนี้

ฟังก์ชั่นใช้เวลา 3 ข้อโต้แย้งเป็นอินพุต: รายการ adjacency แสดงเป็นสมาคม ( เครื่องมือในการสร้างรายการ adjacency จากรายการขอบ ), ตำแหน่งเอลฟ์และตำแหน่งซานตา

โปรดทราบว่าClear[f]จำเป็นเพราะการส่งฟังก์ชั่นจะต้องใช้ซ้ำได้

รหัสด้านล่างนี้เป็นรหัสที่ไม่ได้รับการดมกลิ่นพร้อมคำอธิบายบางส่วน คำอธิบายเพิ่มเติมในภายหลัง

reverseBoole = # != 0 &

(* Or@@{a, b} === reverseBoole[booleOr[Boole[{a, b}]]] *)
booleOr = Max

booleAnd = Min

(* Boole@f[s, e] = Santa can catch Elf ? *)

mainfunc = Block[{adjlist = #},
  Clear[f];
  f[s_, e_] := If[ s == e, f[s, e] = 1,
    f[s, e] = Boole[False];
    f[s, e] = booleAnd[
      (e1  booleOr[
        ( s1  f[s1, e1] ) /@ adjlist[s],
        Boole[e1 == s]
      ]) /@ adjlist[e]
    ]
  ];
  If [ 0 == booleOr[ ( e  f[#3, e] ) /@ #2 ] , 0, Length[#2] ]
]&

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