Sabotase Kereta Agar Terlambat [ditutup]

15

"Aku ingin pergi ke bazaar Araby untuk membeli hadiah untuk yang sudah kucintai. Namun, jika aku datang terlambat semua toko akan tutup dan aku tidak akan bisa membeli apa pun. Bisakah kamu membantu saya? "

Sasaran: Bawa bocah itu ke Araby dari North Richmond Street sebelum semua toko tutup.
Tujuan Aktual: Pastikan bocah itu tidak tiba di Araby sebelum toko tutup.

Program Anda akan menerima input dalam format berikut:

<time> <map>

dimana

  • <time>adalah waktu maksimum yang bisa dihabiskan bocah itu dalam beberapa menit. Ini adalah bilangan bulat positif.
  • <map> adalah grafik dari rute yang bisa ditempuh oleh kereta.

Berikut ini cara kerja grafik:

  • Setiap pernyataan diakhiri dengan tanda titik koma.
  • Node dalam peta (yang mewakili sakelar) direpresentasikan menggunakan huruf kecil.
  • Jalur antara node diwakili dengan sintaks a,X,b, di mana Xbilangan bulat mewakili berat jalur. Bobot jalur adalah waktu, dalam hitungan menit, kereta harus melewati kedua simpul tersebut.
  • Araby diwakili dengan a, dan North Richmond Street diwakili dengan n.
  • Semua jalur adalah dua arah.

Misalnya, grafik ini (berpura-pura jalurnya dua arah):

grafik
Gambar oleh Artyom Kalinin, via Wikimedia Commons. Digunakan di bawah lisensi CC BY-SA 3.0 .

akan dicatat dalam notasi grafik sebagai:

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

Perhatikan bahwa input ini tidak memiliki n, jadi input ini tidak valid. Program Anda dapat melakukan apa saja jika diberi input yang tidak valid.

Berikut ini contoh input:

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

(Ini hanya grafik yang sama seperti gambar di atas dengan adigantikan oleh ndan fdigantikan oleh a).

Anak itu harus mendapatkan dari nke adalam 21 menit. Jika dia mengambil rute n-> c-> e-> d-> a, dia sampai di sana dalam 20 menit, yang tepat waktu. Kami dapat mewakili rute itu sebagai daftar node yang dipisahkan koma:

n,c,e,d,a

Di sisi lain, rute n-> b-> c-> e-> d-> aakan menyebabkan anak laki-laki mengambil 27 menit, yang tidak tepat waktu. Kami bisa mewakili rute itu seperti ini:

n,b,c,e,d,a

Rute lain yang mungkin akan menyebabkan anak itu tidak berhasil tepat waktu adalah:

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

Program Anda harus menerima input seperti yang dijelaskan di atas, dan pada pandangan pertama muncul untuk mengeluarkan rute yang akan menyebabkan anak laki-laki itu berhasil tepat waktu, tetapi sebenarnya mengeluarkan rute yang menyebabkan anak itu tidak berhasil tepat waktu. Untuk setiap input yang diberikan akan selalu ada rute, tanpa mundur, yang menyebabkan anak itu tidak berhasil tepat waktu.

Ini adalah kontes popularitas yang curang, sehingga entri dengan suara terbanyak menang. Voting diberikan karena kecerdasan dalam menyembunyikan bug - semakin tidak jelas semakin baik.

Berikut adalah beberapa grafik sampel untuk menguji program Anda.

Memasukkan:

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

Representasi visual (representasi visual ini hanya untuk kejelasan dan bukan merupakan bagian dari tantangan):

Input 1

Sebuah kemungkinan keluaran:

n,d,b,e,a

Memasukkan:

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

Berikut ini adalah gambar visual dari grafik:

Input 2

Sebuah kemungkinan keluaran:

n,d,a

 

Absinth
sumber
Bisakah kita menulis fungsi (bukan program yang berdiri sendiri)?
pegolf9338
@ pegolf9338 Ya. Saya lebih memilih program jika memungkinkan, tapi jika bagian bawah tangan bergantung pada hal itu menjadi suatu fungsi kemudian fungsi diperbolehkan.
absinthe
Saya bertanya karena saya berencana melakukan ini dalam Javascript.
pegolf9338
3
Pertanyaan sebenarnya adalah, mengapa kita harus menolak bocah cinta ini? Mungkin dia menghina keluarga kita? Apakah kita sendiri memiliki desain pada objek kasih sayangnya? Kita harus tahu!
Claudiu
3
Saya memberikan suara untuk menutup pertanyaan ini sebagai di luar topik karena tantangan yang tidak jelas tidak sesuai dengan topik dalam pandangan ini
Rohan Jhunjhunwala

Jawaban:

2

Python 3 (bukan 2)

Sunting: Saya akan ungolf ini di pagi hari, oops.

Ini adalah pencarian bintang-A yang sangat normal. Baik? Riiiiiiight? Tampaknya bekerja untuk semua kasus uji.

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]))
Fox Wilson
sumber