Araba Sorununu Çözme


14

Filozoflar uzun zamandır Tramvay sorununu düşünüyorlar . Ne yazık ki, henüz hiçbir insan bu sorunu çözmedi. Neyse ki, programcılar olarak bizim için sorunu çözmek için bilgisayarları kullanabiliriz!

Giriş

İşletme programı (en az bir kenarı ile giriş olarak yönlendirilmiş grafik bir (sıvılan) alacak xkadar yherhangi biri için, xve y), belirli bir düğüm ile, ve her bir kenarına bağlanmış bir negatif olmayan bir tamsayı (o parçaya bağlı insan sayısını temsil eder) . Ayrıca, her düğümün en az bir çıkış kenarı vardır.

Araba, belirlenen düğümden başlar. Her dönüş, eğer araba düğümde xise, faydacı bir kenar seçer (x,y). O kenardaki insanlar ölüyor ve el arabası şimdi kenarda y. Bu süreç sonsuza dek sürüyor.

Kenar eğer insanlar sadece bu yüzden bir kez ölebilir Not (x,y)vardır nbunların üzerine ona bağlı insanları ve tramvay çalışır, hala sadece sonuçlanacaktır, 100 kez, demek nölümler.

Çıktı

Faydacı, seçimlerini ölen insanların sayısını en aza indirecek şekilde yapar (sadece sınırlı insanlar olduğu için sınırlı olması garanti edilir). Programınız bu numarayı verecektir.

Giriş biçimi

Giriş grafiğini istediğiniz herhangi bir şekilde alabilirsiniz. Örneğin, bunu bir matris olarak alabilir ve belirtilen düğümü 0 etiketli olarak sayabilirsiniz. Ya da benzer bir şey kullanabilirsiniz x1,y1,n1;x2,y2,n2;.... Örneğin 0,a,0;a,b,5;a,c,1;b,b,0;c,c,0, standart tramvay problemini temsil etmek (sonunda ilmeklerle).

testcases

  • 0,a,0;a,b,5;a,c,1;b,b,0;c,c,0 -> 1 (0'dan a'ya, a'dan c'ye geçin (bir kişiyi öldürür) ve ardından arabayı c'den c'ye çevirmeye devam edin).
  • 0,0,1;0,a,5;a,a,0 -> 1 (0'dan 0'a kadar devam edin, tüm sonsuzluk için 1 kişiyi çalıştırın),
  • 0,a,5;0,b,1;a,a,1;b,b,6 -> 6 (0 -> a -> a -> a -> a -> ... (b'ye gitmenin açgözlü çözümünün yanlış olacağını unutmayın))
  • 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 (Faydacıların her ikisinin sadece bir kişiyi öldürmesi için alabileceği iki farklı seçenek olduğunu unutmayın)

Bu , bu yüzden en kısa cevap kazanır! İyi şanslar.

Notlar: Hasta döngü döngüleri olmayacak ve çok parçalı sürüklenme yasaklanmıştır. Ayrıca, bu sorunu Asimov'un üç yasası (/ s) açısından düşünmeyi tercih etsem de, Peter Taylor sandbox'ta bu sorunun matematiksel olarak en düşük ağırlıktaki rho'yu (döngüler kendi kendine geri yol) bulma ile eşdeğer olduğunu belirtti. .


4
Herhangi var mıdır şişman erkekler ?
Beta Çürümesi

2
@BetaDecay evet, ancak arabaya yapılan yükseltmeler nedeniyle, bu sorunun amacı için normal insanlarla aynı şekilde davranıyorlar.
PyRulez

Yanıtlar:


6

Jöle , 27 23 bayt

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

Çevrimiçi deneyin! (son test durumu)

Zalim Versiyon (Çoğu insanı sakatla)

Girişi sayı olarak alır. Son örnek için, 1is ave 2is b. 0başlangıç ​​düğümüdür. İlk argüman kenarların listesidir (örn. [0,1],[0,2],[1,1],[2,2]) Ve ikinci argüman kenarların listesidir ve üzerlerindeki insan sayısıdır (örn. [[0,1],[0,2],[1,1],[2,2]],[1,1,0,0]).

Nasıl çalışır

ṗ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, ne demek istediğinizden emin değil misiniz? Jelly gözlerini incitiyor mu?
Outgolfer Erik

1
@EriktheOutgolfer, çoğu insanı parçalamaya çalışan programın versiyonuna atıfta bulunuyor .
fireflame241

@Shaggy Bu ilginç bir meydan okuma olurdu.
PyRulez

9

Python 3 , 80 bayt

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

Çevrimiçi deneyin!

Girdiyi düğüm kimliği ile anahtarlanmış bir sözlük olarak alır. Girişler, komşuların sözlüğü ve bir düğüm ile komşu arasındaki yolda bulunan kişi sayısıdır. Örneğin, ilk test durumu için:

{0: {1: 0}, 1: {2: 5, 3: 1}, 2: {2: 0}, 3: {3: 0}}

0 başlangıç ​​düğümü, 1 düğüm 'a', 2 düğüm 'b' vb.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.