トロリー問題を解く


14

哲学者はトロリー問題を長い間熟考してきた。残念ながら、この問題を解決した人はいません。幸運なことに、プログラマーとしてコンピューターを使用して問題を解決できます!

入力

プログラムは、(より多くても1つのエッジで入力として有向グラフを(有限の)を取るxyいずれかのために、xおよびy)、指定されたノードと、各エッジに取り付けられた非負の整数(そのトラックに関連付けられた人々の数を表します) 。さらに、すべてのノードには少なくとも1つの出口エッジがあります。

トロリーは指定されたノードで開始します。各ターン、トロリーがnodeにあるx場合、功利主義者はedgeを選択します(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、aからc(1人を殺す)に移動してから、トロリーを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(実利主義者が取る可能性のある2つの異なるオプションがあり、どちらも1人だけを殺すことに注意してください)

これはなので、最短の答えが勝ちです!幸運を。

注:病気のループデループはなく、マルチトラックドリフトは禁止されています。また、私はこの問題をアシモフの3つの法則(/ s)の観点から考えることを好みますが、ピーターテイラーはサンドボックスで、この問題は重みが最小のrho(ループ自体に戻るパス)を見つけることと数学的に同等であると述べています。


4
任意のある脂肪の男性は
ベータ崩壊

2
@BetaDecayはい、ただし、トロリーへのアップグレードにより、この質問の目的で通常の人々と同じように動作します。
-PyRulez

回答:


6

ゼリー27 23バイト

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

オンラインでお試しください!(最後のテストケース)

残酷なバージョン(ほとんどの人を傷つける)

入力を数値として受け取ります。最後の例で1は、is aおよび2is bです。0開始ノードです。最初の引数はエッジのリスト(例[0,1],[0,2],[1,1],[2,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、どういう意味か分からない?ゼリーはあなたの目または何かを傷つけますか?
エリックアウトゴルファー

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])

オンラインでお試しください!

ノード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.