Selesaikan Masalah Troli

14

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 xke y, untuk setiap xdan 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 norang terikat padanya, dan kereta berjalan atas mereka, mengatakan, 100 kali, itu akan masih hanya menghasilkan nkematian.

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,0untuk 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 , 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. .

PyRulez
sumber
4
Apakah ada pria gemuk ?
Beta Decay
2
@BetaDecay ya, tetapi karena upgrade ke troli, mereka berperilaku sama dengan orang biasa untuk keperluan pertanyaan ini.
PyRulez

Jawaban:

6

Jelly , 27 23 byte

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

Cobalah online! (kasus uji terakhir)

Versi Kejam (Mutilasi sebagian besar orang)

Mengambil input sebagai angka. Untuk contoh terakhir, 1adalah adan 2sekarang b. 0adalah 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

ṗ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.
fireflame241
sumber
@ Shaggy Umm, tidak yakin apa yang Anda maksud? Apakah Jelly menyakiti mata Anda atau sesuatu?
Erik the Outgolfer
1
@EriktheOutgolfer dia merujuk pada versi program yang mencoba memutilasi sebagian besar orang.
fireflame241
@ Shaggy Itu akan menjadi tantangan yang menarik.
PyRulez
9

Python 3 , 80 byte

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

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: {1: 0}, 1: {2: 5, 3: 1}, 2: {2: 0}, 3: {3: 0}}

0 adalah simpul awal, 1 adalah simpul 'a', 2 adalah simpul 'b', dll.

RootTwo
sumber