Para filsuf telah lama merenungkan masalah Trolley . Sayangnya, belum ada manusia yang memecahkan masalah ini. Untungnya, sebagai programmer kita dapat menggunakan komputer untuk menyelesaikan masalah bagi kita!
Memasukkan
Program Anda akan mengambil sebagai masukan (terbatas) grafik diarahkan (dengan paling banyak satu ujung dari x
ke y
, untuk setiap x
dan y
), dengan node yang ditunjuk, dan bilangan bulat positif yang melekat pada setiap tepi (mewakili jumlah orang yang terkait dengan lagu yang) . Selain itu, setiap node memiliki setidaknya satu tepi keluar.
Troli dimulai di simpul yang ditunjuk. Setiap belokan, jika troli berada di simpul x
, utilitarian memilih tepi (x,y)
. Orang-orang di tepi itu mati, dan troli sekarang di tepi y
. Proses ini berlanjut selamanya.
Perhatikan bahwa orang hanya bisa mati sekali, jadi jika tepi (x,y)
memiliki n
orang terikat padanya, dan kereta berjalan atas mereka, mengatakan, 100 kali, itu akan masih hanya menghasilkan n
kematian.
Keluaran
Utilitarian membuat pilihannya sedemikian rupa untuk meminimalkan jumlah orang yang mati (yang dijamin terbatas, karena hanya ada orang terbatas). Program Anda akan menampilkan nomor ini.
Masukkan format
Anda dapat mengambil grafik input dengan cara apa pun yang Anda suka. Misalnya, Anda bisa menganggapnya sebagai matriks, dan menghitung simpul yang ditunjuk sebagai yang berlabel 0. Atau Anda bisa menggunakan sesuatu seperti x1,y1,n1;x2,y2,n2;...
. Misalnya 0,a,0;a,b,5;a,c,1;b,b,0;c,c,0
untuk mewakili masalah troli standar (dengan loop di akhir).
Testcases
0,a,0;a,b,5;a,c,1;b,b,0;c,c,0
-> 1 (Pergi dari 0 ke a, a ke c (membunuh satu orang), dan kemudian terus memutar troli dari c ke c).0,0,1;0,a,5;a,a,0
-> 1 (Terus dari 0 hingga 0, melebihi 1 orang untuk selamanya),0,a,5;0,b,1;a,a,1;b,b,6
-> 6 (0 -> a -> a -> a -> a -> ... (perhatikan bahwa solusi serakah untuk pergi ke b akan salah))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 (Perhatikan bahwa ada dua opsi berbeda yang mungkin diambil utilitarian, yang keduanya hanya membunuh satu orang)
Ini kode-golf , jadi jawaban terpendek menang! Semoga berhasil.
Catatan: Tidak akan ada loop loop sakit dan drift multitrack dilarang. Juga, walaupun saya lebih suka memikirkan masalah ini dalam kaitannya dengan tiga undang-undang Asimov (/ s) Peter Taylor telah mencatat di kotak pasir bahwa masalah ini secara matematis setara dengan menemukan rho (jalur lilitan balik sendiri) dengan bobot terendah. .
sumber
Jawaban:
Jelly ,
2723 byteCobalah online! (kasus uji terakhir)
Versi Kejam (Mutilasi sebagian besar orang)
Mengambil input sebagai angka. Untuk contoh terakhir,
1
adalaha
dan2
sekarangb
.0
adalah simpul awal. Argumen pertama adalah daftar tepi (mis.[0,1],[0,2],[1,1],[2,2]
), Dan argumen kedua adalah daftar tepi dan jumlah orang di atasnya (misalnya[[0,1],[0,2],[1,1],[2,2]],[1,1,0,0]
).Bagaimana itu bekerja
sumber
Python 3 , 80 byte
Cobalah online!
Mengambil input sebagai kamus yang diketik oleh id node. Entri adalah kamus tetangga dan jumlah orang di jalur antara simpul dan tetangga. Misalnya, untuk test case pertama:
0 adalah simpul awal, 1 adalah simpul 'a', 2 adalah simpul 'b', dll.
sumber
Perl 6 ,
9074 byteTerima kasih kepada Jo King untuk -16 byte.
Solusi Port of RootTwo tentang Python .
Cobalah online!
sumber