哲学者はトロリー問題を長い間熟考してきた。残念ながら、この問題を解決した人はいません。幸運なことに、プログラマーとしてコンピューターを使用して問題を解決できます!
入力
プログラムは、(より多くても1つのエッジで入力として有向グラフを(有限の)を取るx
のy
いずれかのために、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人だけを殺すことに注意してください)
これはcode-golfなので、最短の答えが勝ちです!幸運を。
注:病気のループデループはなく、マルチトラックドリフトは禁止されています。また、私はこの問題をアシモフの3つの法則(/ s)の観点から考えることを好みますが、ピーターテイラーはサンドボックスで、この問題は重みが最小のrho(ループ自体に戻るパス)を見つけることと数学的に同等であると述べています。