ट्रॉली समस्या का समाधान करें


14

दार्शनिकों ने लंबे समय से ट्रॉली समस्या की ओर इशारा किया है । दुर्भाग्य से, किसी भी मानव ने अभी तक इस समस्या को हल नहीं किया है। सौभाग्य से, प्रोग्रामर के रूप में हम अपने लिए समस्या को हल करने के लिए कंप्यूटर का उपयोग कर सकते हैं!

इनपुट

आपका कार्यक्रम इनपुट के रूप में (अधिकतम एक बढ़त के साथ से ले जाएगा एक (परिमित) निर्देशित ग्राफ xको y, किसी के लिए xऔर y) एक निर्दिष्ट नोड के साथ, और ग़ैर-ऋणात्मक पूर्णांक प्रत्येक बढ़त के साथ संलग्न (कि ट्रैक से बंधा लोगों की संख्या का प्रतिनिधित्व) । इसके अलावा, प्रत्येक नोड में कम से कम एक निकास किनारा होता है।

ट्रॉली निर्धारित नोड पर शुरू होती है। प्रत्येक मोड़, यदि ट्रॉली नोड पर है 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मानक ट्रॉली समस्या (अंत में छोरों के साथ) का प्रतिनिधित्व करने के लिए ।

परीक्षण के मामलों

  • 0,a,0;a,b,5;a,c,1;b,b,0;c,c,0 -> 1 (0 से a, c से (एक व्यक्ति को मार रहा है), और फिर ट्रॉली को 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µ€Ṃ

इसे ऑनलाइन आज़माएं! (अंतिम परीक्षण मामला)

क्रूर संस्करण (सबसे अधिक लोगों को प्रेरित करें)

नंबर के रूप में इनपुट लेता है। अंतिम उदाहरण के लिए, 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.

@ शागि उम्म, निश्चित नहीं कि आपका क्या मतलब है? क्या जेली आपकी आँखों या किसी चीज़ को चोट पहुँचाती है?
निकोलग्राफ जूल

1
@EriktheOutgolfer वह उस कार्यक्रम के संस्करण का उल्लेख कर रहा है जो अधिकांश लोगों को उत्परिवर्तित करने की कोशिश करता है ।
फ़ायरफ़्लेम २४१

@ शैगी एक दिलचस्प चुनौती होगी।
प्युर्लेज़

9

पायथन 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])

इसे ऑनलाइन आज़माएं!

नोड आईडी द्वारा मुख्य शब्दकोश के रूप में इनपुट लेता है। प्रविष्टियां पड़ोसियों और नोड और पड़ोसी के बीच ट्रैक पर लोगों की संख्या का एक शब्दकोश हैं। जैसे, पहले टेस्ट केस के लिए:

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

0 प्रारंभ नोड है, 1 नोड 'ए' है, 2 नोड 'बी' है, आदि।


1

पर्ल 6 , 90 74 बाइट्स

-16 बाइट्स के लिए जो किंग को धन्यवाद।

my&g=->\a,\b=0,\c=@,\d=0 {a{d}&&b||min map {g a,b+$^f,(|c,d),$^e},a{d}.kv}

RootTwo के पायथन समाधान का पोर्ट ।

इसे ऑनलाइन आज़माएं!


पर्ल में डिफ़ॉल्ट पैरामीटर भी हैं! यह 74 बाइट्स
जो किंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.