Geç Kalacak Bir Tren Sabote Edin [kapalı]


15

"Aşık olduğum kişiye hediye almak için Araby pazarına gitmek istiyorum. Ancak, çok geç kalırsam tüm mağazalar kapanacak ve hiçbir şey satın alamayacağım. ben? "

Amaç: Tüm mağazalar kapanmadan önce çocuğu North Richmond Street'ten Araby'ye götür.
Gerçek Hedef: Çocuğun dükkanlar kapanmadan Araby'ye gelmediğinden emin olun.

Programınız aşağıdaki biçimde girdi alacaktır:

<time> <map>

nerede

  • <time>çocuğun dakika olarak seyahat edebileceği maksimum süredir. Pozitif bir tamsayıdır.
  • <map> trenin izleyebileceği rotaların bir grafiğidir.

Grafiğin biçimi şu şekilde çalışır:

  • Her ifade noktalı virgülle sonlandırılır.
  • Haritadaki düğümler (anahtarları temsil eder) tek küçük harfler kullanılarak temsil edilir.
  • Düğümler arasındaki bir yol sözdizimi ile temsil edilir a,X,b, burada Xyolun ağırlığını temsil eden bir tamsayıdır. Yolun ağırlığı, trenin bu iki düğümden geçmesi için geçen süredir.
  • Araby, aKuzey Richmond Caddesin .
  • Tüm yollar çift yönlüdür.

Örneğin, bu grafik (yolların çift yönlü olduğunu varsayalım):

grafik
Görüntü Wikimedia Commons aracılığıyla Artyom Kalinin tarafından. CC BY-SA 3.0 lisansı altında kullanılır .

grafik gösterimine şu şekilde kaydedilir:

a,4,b;a,2,c;b,5,c;b,10,d;c,3,e;e,4,d;d,11,f;

Bu girişin bir işareti olmadığından, ngeçersiz bir giriş olduğunu unutmayın. Geçersiz bir giriş verilirse programınız her şeyi yapabilir.

İşte bir örnek giriş:

21 n,4,b;n,2,c;b,5,c;b,10,d;c,3,e;e,4,d;d,11,a;

(Yukarıdaki resim ile aynı grafikle adeğiştirilir nve fdeğiştirilir a).

Oğlan dan almak gerekir niçin a21 dakika içinde. n-> c-> e-> d-> rotasını aalırsa, 20 dakika içinde oraya varır, ki bu da zamanındadır. Bu rotayı virgülle ayrılmış bir düğüm listesi olarak gösterebiliriz:

n,c,e,d,a

Öte yandan, n-> b-> c-> e-> d-> rotası a, çocuğun 27 dakika sürmesine neden olur, bu da zaman içinde değildir. O rotayı şu şekilde temsil edebiliriz:

n,b,c,e,d,a

Çocuğun zamanında yapmamasına neden olacak bir başka olası yol:

n,b,c,b,c,b,c,b,c,b,c,b,c,b,c,b,c,b,c,e,d,a

Programınız girişi yukarıda açıklandığı gibi almalı ve ilk bakışta çocuğun zamanında yapmasına neden olacak bir yol çıkmış gibi görünmelidir, ancak aslında çocuğun zaman içinde yapmamasına neden olan bir yol çıkar. Herhangi bir giriş için, her zaman geri izlemeden, çocuğun zamanında yapmamasına neden olan bir rota olacaktır.

Bu el yapımı bir popülerlik yarışmasıdır, bu yüzden en çok oy alan giriş kazanır. Oylama hatayı gizleme konusunda ustalık için verilir - ne kadar az belirgin olursa o kadar iyidir.

Programınızı test etmek için bazı örnek grafikler.

Giriş:

12 a,2,c;a,2,e;b,5,c;b,4,d;b,11,e;d,7,n;e,4,n;

Görsel bir sunum (bu görsel sunum sadece açıklık içindir ve mücadelenin bir parçası değildir):

Giriş 1

Bir olası çıkışı:

n,d,b,e,a

Giriş:

10 a,8,b;a,12,d;b,1,n;d,11,n;a,1,n;

Grafiğin görsel bir görüntüsü:

Giriş 2

Bir olası çıkışı:

n,d,a

 


Bir işlev yazabilir miyiz (tek başına bir program yerine)?
golfer9338

@ golfer9338 Evet. Mümkünse ben bir program tercih ediyorum, ama el altından kısmı fonksiyonunu olmak buna dayanıyorsa o zaman bir işlev izin verilir.
pelin otu

Soruyorum çünkü bunu Javascript ile yapmayı planlıyorum.
golfer9338

3
Asıl soru şu ki, bu sevgi dolu çocuğa neden tükürüyoruz? Belki de ailemize hakaret etti? Sevgimizin nesnesi ile ilgili tasarımlarımız var mı? Bilmeliyiz!
Claudiu

3
Bu soruyu konu dışı olarak kapatmak için oy kullanıyorum çünkü Underhanded zorluklar bu görüşte konu dışı
Rohan Jhunjhunwala

Yanıtlar:


2

Python 3 (2 değil)

Düzenleme: Bu sabah ungolf edeceğim, ayy

Tamamen normal bir A-yıldızlı arama. Sağ? Riiiiiiight? Tüm test senaryoları için çalışıyor gibi görünüyor.

def a(b,c,d):
    e,f,g=[],{},{}
    f[c]=0
    while f:
        h=sorted(f.keys(),key=lambda z:-f[z],reverse=True)[-1]
        if h==d:break
        e.append(h)
        for z in b[h]:
            if z in e:continue
            if z in f and f[z]>f[h]+b[z][h]:continue
            g[z]=h
            f[z]=f[h]+b[z][h]
        del f[h]
    i=[]
    j=d
    q=0
    while j!=c:
        i.append(j)
        q+=b[j][g[j]]
        j=g[j]
    return q,(i+[c])[::-1]
t,q=input().split(" ")
t=int(t)
q=q[:-1]
q=[i.split(",")for i in q.split(";")]
g={a:{}for a in __import__("functools").reduce(lambda zz,zy:zz+zy,[[v[0],v[2]]for v in q])}
for l in q:g[l[0]][l[2]]=g[l[2]][l[0]]=int(l[1])

r=a(g,'n','a')
print("time-good: %d, time-ours: %d" % (t, r[0]))
print("path: %s" % " -> ".join(r[1]))
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.