ก่อวินาศกรรมรถไฟเพื่อให้มันสาย [ปิด]


15

"ฉันต้องการไปที่ Araby bazaar เพื่อซื้อของขวัญสำหรับที่ฉันตกหลุมรักด้วยอย่างไรก็ตามถ้าฉันมาสายเกินไปร้านค้าทั้งหมดจะถูกปิดและฉันจะไม่สามารถซื้ออะไรได้คุณช่วยได้ไหม ผมได้ไหม "

เป้าหมาย:พาเด็กชายไปที่ Araby จาก North Richmond Street ก่อนที่ร้านค้าทั้งหมดจะปิด
เป้าหมายที่แท้จริง:ตรวจสอบให้แน่ใจว่าเด็กผู้ชายไม่ได้มาถึง Araby ก่อนที่ร้านค้าจะปิด

โปรแกรมของคุณจะรับอินพุตในรูปแบบต่อไปนี้:

<time> <map>

ที่ไหน

  • <time>เป็นเวลาสูงสุดที่เด็กชายสามารถใช้เวลาเดินทางเป็นนาที มันเป็นจำนวนเต็มบวก
  • <map> เป็นกราฟของเส้นทางที่รถไฟสามารถรับได้

นี่คือรูปแบบของกราฟที่ใช้งานได้:

  • แต่ละคำสั่งจะจบด้วยเซมิโคลอน
  • โหนดในแผนที่ (ซึ่งเป็นตัวแทนของสวิทช์) จะถูกแสดงโดยใช้ตัวอักษรตัวพิมพ์เล็ก
  • เส้นทางระหว่างโหนดจะถูกแสดงด้วยไวยากรณ์a,X,bโดยที่Xเป็นจำนวนเต็มแทนน้ำหนักของเส้นทาง น้ำหนักของเส้นทางคือเวลาเป็นนาทีรถไฟจะผ่านทั้งสองโหนด
  • อาราบีเป็นตัวแทนที่มีและนอร์ทริชมอนด์ถนนเป็นตัวแทนที่มี an
  • เส้นทางทั้งหมดเป็นแบบสองทิศทาง

ตัวอย่างเช่นกราฟนี้ (เสแสร้งเส้นทางเป็นแบบสองทิศทาง):

กราฟ
ภาพโดย Artyom Kalinin ผ่าน Wikimedia Commons ใช้ภายใต้ใบอนุญาตCC BY-SA 3.0

จะถูกบันทึกไว้ในสัญกรณ์กราฟเป็น:

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

โปรดทราบว่าข้อมูลนี้ไม่มีn, ดังนั้นจึงเป็นข้อมูลที่ไม่ถูกต้อง โปรแกรมของคุณอาจทำอะไรก็ได้ถ้ามีการป้อนข้อมูลที่ไม่ถูกต้อง

นี่คือตัวอย่างอินพุต:

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

(เป็นกราฟเดียวกับภาพด้านบนที่aถูกแทนที่ด้วยnและfแทนที่ด้วยa)

เด็กจะต้องได้รับจากnการaภายใน 21 นาที หากเขาใช้เส้นทางn-> c-> e-> d-> aเขาจะไปถึงที่นั่นภายใน 20 นาทีซึ่งเป็นเวลา เราสามารถแสดงเส้นทางนั้นเป็นรายการของโหนดที่คั่นด้วยเครื่องหมายจุลภาค:

n,c,e,d,a

ในทางกลับกันเส้นทางn-> b-> c-> e-> d-> aจะทำให้เด็กชายใช้เวลา 27 นาทีซึ่งไม่ตรงเวลา เราสามารถแสดงเส้นทางนั้นดังนี้:

n,b,c,e,d,a

เส้นทางที่เป็นไปได้อีกเส้นทางหนึ่งที่จะทำให้เด็กชายไม่สามารถทำได้ทันเวลาคือ:

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

โปรแกรมของคุณควรป้อนข้อมูลตามที่อธิบายไว้ข้างต้นและเมื่อเห็นอย่างรวดเร็วก่อนจะเห็นเส้นทางที่จะทำให้เด็กผู้ชายทำทันเวลา แต่จริง ๆ แล้วเป็นเส้นทางที่ทำให้เด็กไม่ทำตามเวลาจริง สำหรับอินพุตที่กำหนดจะมีเส้นทางอยู่เสมอโดยไม่มีการย้อนรอยซึ่งทำให้เด็กไม่สามารถทำได้ทันเวลา

นี่คือการประกวดความนิยมที่เลื่องลือดังนั้นผลงานที่ได้คะแนนโหวตมากที่สุดชนะ คะแนนโหวตจะได้รับจากความเฉลียวฉลาดในการซ่อนบั๊ก - ยิ่งชัดเจนว่าดีกว่า

นี่คือตัวอย่างกราฟเพื่อทดสอบโปรแกรมของคุณ

การป้อนข้อมูล:

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

การแสดงด้วยภาพ (การแสดงด้วยภาพนี้ใช้เพื่อความชัดเจนเท่านั้นและไม่ถือเป็นส่วนหนึ่งของการท้าทาย):

อินพุต 1

เป็นไปได้ที่การส่งออก:

n,d,b,e,a

การป้อนข้อมูล:

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

นี่คือภาพที่มองเห็นได้ของกราฟ:

อินพุต 2

เป็นไปได้ที่การส่งออก:

n,d,a

 


เราสามารถเขียนฟังก์ชั่น (แทนที่จะเป็นโปรแกรมสแตนด์อะโลน) ได้หรือไม่?
golfer9338

@ golfer9338 ใช่ ฉันไม่ต้องการโปรแกรมถ้าเป็นไปได้ แต่ถ้าส่วนที่ซ่อนเร้นอาศัยมันเป็นฟังก์ชั่นแล้วฟังก์ชั่นที่ได้รับอนุญาต.
แอ็บซิน

ฉันถามเพราะฉันวางแผนที่จะทำใน Javascript
golfer9338

3
คำถามที่แท้จริงคือทำไมเราถึงออกไปโจมตีเด็กผู้ชายที่หลงรักนี้ บางทีเขาดูถูกครอบครัวของเรา ตัวเราเองมีการออกแบบบนวัตถุของความรักของเขา? เราต้องรู้!
Claudiu

3
ฉันลงคะแนนให้ปิดคำถามนี้เป็นหัวข้อนอกเพราะความท้าทายที่ซ่อนเร้นอยู่นอกหัวข้อนี้
Rohan Jhunjhunwala

คำตอบ:


2

Python 3 (ไม่ใช่ 2)

แก้ไข: ฉันจะ ungolf นี้ในตอนเช้าอุ้ย

มันเป็นการค้นหาระดับดาวปกติอย่างสมบูรณ์แบบ ขวา? Riiiiiiight? ดูเหมือนว่าจะใช้ได้กับทุกกรณีทดสอบ

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]))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.