Philosophen haben lange über das Trolley-Problem nachgedacht . Leider hat noch kein Mensch dieses Problem gelöst. Zum Glück können wir als Programmierer Computer verwenden, um das Problem für uns zu lösen!
Eingang
Ihr Programm verwendet als Eingabe einen (endlichen) gerichteten Graphen (mit höchstens einer Kante von x
bis y
für ein beliebiges x
und y
) mit einem festgelegten Knoten und einer nichtnegativen Ganzzahl, die an jede Kante angehängt ist (die Anzahl der Personen, die an diese Spur gebunden sind). . Zusätzlich hat jeder Knoten mindestens eine Austrittskante.
Der Wagen startet am angegebenen Knoten. Befindet sich der Wagen in jeder Runde am Knoten x
, wählt der Bediener eine Kante aus (x,y)
. Die Leute an diesem Rand sterben, und der Wagen ist jetzt am Rand y
. Dieser Prozess dauert für immer an.
Beachten Sie, dass Menschen nur einmal sterben können. Wenn (x,y)
also n
Personen an die Kante gebunden sind und der Wagen beispielsweise 100 Mal über sie fährt, führt dies nur zu n
Todesfällen.
Ausgabe
Der Utilitarist trifft seine Entscheidungen so, dass die Anzahl der Sterbenden so gering wie möglich gehalten wird (was garantiert endlich ist, da es nur endliche Menschen gibt). Ihr Programm gibt diese Nummer aus.
Eingabeformat
Sie können das Eingabediagramm nach Belieben anpassen. Zum Beispiel könnten Sie es als Matrix nehmen und den angegebenen Knoten als den mit 0 bezeichneten Knoten zählen. Oder Sie könnten so etwas verwenden x1,y1,n1;x2,y2,n2;...
. Zum Beispiel 0,a,0;a,b,5;a,c,1;b,b,0;c,c,0
, um das Standard-Trolley-Problem darzustellen (mit Schleifen am Ende).
Testfälle
0,a,0;a,b,5;a,c,1;b,b,0;c,c,0
-> 1 (Gehe von 0 nach a, a nach c (töte eine Person) und schleife dann den Wagen weiter von c nach c).0,0,1;0,a,5;a,a,0
-> 1 (Gehen Sie von 0 auf 0 und überflügeln Sie 1 Person für alle Ewigkeit),0,a,5;0,b,1;a,a,1;b,b,6
-> 6 (0 -> a -> a -> a -> a -> ... (beachte, dass die gierige Lösung, nach b zu gehen, falsch wäre))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 (Beachten Sie, dass es zwei verschiedene Möglichkeiten gibt, die der Utilitarist ergreifen könnte, wenn beide nur eine Person töten)
Das ist Code-Golf , also gewinnt die kürzeste Antwort! Viel Glück.
Hinweise: Es wird keine Sick-Loop-De-Loops geben und das Driften auf mehreren Spuren ist verboten. Auch, obwohl ich dieses Problem lieber in Bezug auf Asimovs drei Gesetze (n) sehe, hat Peter Taylor in der Sandbox festgestellt, dass dieses Problem mathematisch äquivalent zu dem Problem ist, den Rho (Pfad, auf dem die Schleifen zurückführen) mit dem geringsten Gewicht zu finden .
quelle
Antworten:
Jelly ,
2723 BytesProbieren Sie es online! (letzter Testfall)
Grausame Version (Verstümmle die meisten Leute)
Nimmt Eingaben als Zahlen entgegen. Für das letzte Beispiel
1
ista
und2
istb
.0
ist der Startknoten. Das erste Argument ist die Liste der Kanten (z. B.[0,1],[0,2],[1,1],[2,2]
), und das zweite Argument ist eine Liste der Kanten und der Anzahl der Personen darauf (z[[0,1],[0,2],[1,1],[2,2]],[1,1,0,0]
. B. ).Wie es funktioniert
quelle
Python 3 , 80 Bytes
Probieren Sie es online!
Übernimmt die Eingabe als Wörterbuch mit der Node-ID. Die Einträge sind ein Wörterbuch der Nachbarn und die Anzahl der Personen auf der Strecke zwischen einem Knoten und dem Nachbarn. ZB für den ersten Testfall:
0 ist der Startknoten, 1 ist der Knoten 'a', 2 ist der Knoten 'b' usw.
quelle
Perl 6 ,
9074 BytesVielen Dank an Jo King für -16 Bytes.
Port der Python-Lösung von RootTwo .
Probieren Sie es online!
quelle