แก้ไขปัญหารถเข็น


14

นักปรัชญาได้ไตร่ตรองปัญหารถเข็นมานานแล้ว น่าเสียดายที่ยังไม่มีมนุษย์คนใดแก้ปัญหานี้ได้ โชคดีที่ในฐานะโปรแกรมเมอร์เราสามารถใช้คอมพิวเตอร์เพื่อแก้ปัญหาให้เราได้!

อินพุต

โปรแกรมของคุณจะทำหน้าที่ป้อนกราฟกำกับ (จำกัด ) (โดยมีขอบอย่างใดอย่างหนึ่งมากที่สุดจากxถึงถึงyสำหรับใด ๆxและy) พร้อมโหนดที่กำหนดและจำนวนเต็มที่ไม่ใช่ค่าลบที่แนบมากับแต่ละขอบ (แสดงถึงจำนวนคนที่ผูกติดกับแทร็กนั้น) . นอกจากนี้ทุกโหนดมี edge exit อย่างน้อยหนึ่งตัว

รถเข็นเริ่มต้นที่โหนดที่กำหนด กลับกันถ้ารถเข็นที่โหนดx, (x,y)ประโยชน์เลือกขอบ yคนที่อยู่บนขอบที่ตายและรถเข็นอยู่ในขณะนี้ที่ขอบ กระบวนการนี้จะดำเนินต่อไปตลอดกาล

โปรดทราบว่าผู้คนสามารถตายได้เพียงครั้งเดียวดังนั้นหากขอบ(x,y)มีnคนผูกไว้กับมันและรถเข็นวิ่งข้ามพวกเขาพูดว่า 100 ครั้งมันจะยังคงส่งผลให้เกิดการnเสียชีวิต

เอาท์พุต

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

รูปแบบอินพุต

คุณอาจใช้กราฟอินพุตในแบบที่คุณต้องการ ตัวอย่างเช่นคุณสามารถใช้มันเป็นเมทริกซ์และนับโหนดที่กำหนดเป็นหนึ่งที่มีข้อความ 0. x1,y1,n1;x2,y2,n2;...หรือคุณอาจจะใช้สิ่งที่ต้องการ ตัวอย่างเช่น0,a,0;a,b,5;a,c,1;b,b,0;c,c,0เพื่อเป็นตัวแทนของปัญหารถเข็นมาตรฐาน (มีลูปที่ส่วนท้าย)

Testcases

  • 0,a,0;a,b,5;a,c,1;b,b,0;c,c,0 -> 1 (ไปจาก 0 ถึง a, a ถึง c (ฆ่าหนึ่งคน) จากนั้นวนลูปจากรถเข็นไปยัง c)
  • 0,0,1;0,a,5;a,a,0 -> 1 (เดินจาก 0 เป็น 0 วิ่งต่อ 1 คนตลอดชั่วนิรันดร์)
  • 0,a,5;0,b,1;a,a,1;b,b,6 -> 6 (0 -> a -> a -> a -> a -> ... (โปรดทราบว่าคำตอบที่โลภของการไปที่ b จะไม่ถูกต้อง))
  • 0,a,1;0,b,5;a,b,1;b,a,1 -> 3 (0 -> a -> b -> a -> b -> ... )
  • 0,a,1;0,b,1;a,a,0;b,b,0 -> 1 (โปรดทราบว่ามีสองตัวเลือกที่แตกต่างกันซึ่งผู้ใช้อาจใช้ว่าทั้งสองฆ่าเพียงคนเดียว)

นี่คือดังนั้นคำตอบที่สั้นที่สุดชนะ! โชคดี.

หมายเหตุ: จะไม่มีลูปลูปป่วยและการดริฟท์มัลติแทร็คถูกแบน นอกจากนี้แม้ว่าฉันชอบที่จะคิดถึงปัญหานี้ในแง่ของกฎสามข้อของอาซิมอฟ (/ s) ปีเตอร์เทย์เลอร์ได้ตั้งข้อสังเกตไว้ในกล่องทรายว่าปัญหานี้มีปัญหาทางคณิตศาสตร์เทียบเท่ากับการค้นหาโรห์ .



2
@BetaDecay ใช่ แต่เนื่องจากการอัปเกรดเป็นรถเข็นพวกเขามีพฤติกรรมเหมือนกับคนทั่วไปสำหรับจุดประสงค์ของคำถามนี้
PyRulez

คำตอบ:


6

เยลลี่ , 27 23 ไบต์

ṗL$µṭ0FIm2ASµÐḟµQ⁴ySµ€Ṃ

ลองออนไลน์! (กรณีทดสอบล่าสุด)

Cruel Version (ทำลายคนส่วนใหญ่)

ใช้อินพุตเป็นตัวเลข ยกตัวอย่างเช่นที่ผ่านมา1เป็นaและเป็น2 เป็นโหนดเริ่มต้น อาร์กิวเมนต์แรกคือรายการของขอบ (เช่น) และอาร์กิวเมนต์ที่สองคือรายการของขอบและจำนวนคนที่อยู่บนพวกเขา (เช่น)b0[0,1],[0,2],[1,1],[2,2][[0,1],[0,2],[1,1],[2,2]],[1,1,0,0]

มันทำงานอย่างไร

ṗL$µṭ0FIm2ASµÐḟµQ⁴ySµ€Ṃ
ṗL$                       - on the first argument, get the Cartesian power of it to its length.
                            this gives all paths of the length of the input. Cycles are implicit
   µ        µÐḟ           - get valid paths starting with 0 -- filter by:
    ṭ0                      - prepend 0
      F                     - flatten
       I                    - get the difference between elements
        m2                  - every second difference: 0 for each edge that starts at the node the previous edge ended at, nonzero otherwise.
          AS                - 0 iff all elements are 0
               µ    µ€    - on each path:
                Q           - remove repeat edges.
                 ⁴y         - translate according to the mapping in the second program argument
                   S        - Sum
                      Ṃ   - get the minimum of these.

@Shaggy Umm ไม่แน่ใจว่าคุณหมายถึงอะไร? เยลลี่ทำร้ายดวงตาหรืออะไรบางอย่างของคุณหรือไม่?
Erik the Outgolfer

1
@EriktheOutgolfer เขาอ้างถึงเวอร์ชันของโปรแกรมที่พยายามจะทำลายคนส่วนใหญ่
fireflame241

@Shaggy นั่นเป็นความท้าทายที่น่าสนใจ
PyRulez

9

Python 3 , 80 ไบต์

y=lambda d,s=0,p=[],f=0:f in p and s or min(y(d,s+d[f][t],p+[f],t)for t in d[f])

ลองออนไลน์!

รับอินพุตเป็นพจนานุกรมที่คีย์โดย node id รายการเป็นพจนานุกรมของประเทศเพื่อนบ้านและจำนวนคนในการติดตามระหว่างโหนดและเพื่อนบ้าน เช่นสำหรับกรณีทดสอบครั้งแรก:

{0: {1: 0}, 1: {2: 5, 3: 1}, 2: {2: 0}, 3: {3: 0}}

0 คือโหนดเริ่มต้น 1 คือโหนด 'a', 2 คือโหนด 'b' เป็นต้น


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