เส้นทางที่สั้นที่สุดผ่านระบบทางเดียว


9

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

อินพุต

อินพุตจะเปิดSTDINและจะเป็นรายการของจุดเริ่มต้นและจุดสิ้นสุดตามด้วยบรรทัดว่างตามด้วยรายการของแบบสอบถามดังนี้:

A B
B A
B C
C D
D C

A D
C A
B A

ถนนแต่ละเส้นสามารถเดินทางได้ในทิศทางที่กำหนดดังนั้นในตัวอย่างข้างต้นถนน A - B เป็นถนนสองทางในขณะที่ B - C เป็นถนนเดินรถทางเดียวจาก B ถึง C การเดินทางจาก C ไป B เป็นสิ่งต้องห้าม

จุดเริ่มต้นและจุดสิ้นสุดทั้งหมดจะถูกแสดงด้วยตัวอักษรตัวพิมพ์ใหญ่ตัวเดียว

เอาท์พุต

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

สำหรับตัวอย่างข้างต้นผลลัพธ์จะเป็น:

A B C D

B A

สคริปต์ทดสอบ

เมื่อก่อนฉันได้ทำการทดสอบสำหรับงานนี้โดยอ้างอิงจากสคริปต์ที่เขียนโดยJoeyและVentero : -

และยังทดสอบและส่งออกที่คาดหวังสำหรับผู้ที่ไม่สามารถใช้สคริปต์ด้านบน

การใช้งาน: ./test [your program and its arguments]

รางวัล

คำตอบทั้งหมดที่เห็นได้ชัดว่ามีความพยายามในการเล่นกอล์ฟที่ตรงตามข้อกำหนดและผ่านการทดสอบทั้งหมดจะได้รับ upvote ของฉัน คำตอบที่สั้นที่สุดภายใน 26/01/2012 จะได้รับการยอมรับ


output the first when sorting all shortest routes lexicographically- ดังนั้นถ้าA B DและA C Dทั้งคู่เป็นทางออกที่ถูกต้อง, เอาท์พุทA B Dแทน?
Mr. Llama

@GigaWatt ใช่ถูกต้อง
Gareth

นี่ใกล้เคียงกับซ้ำกับcodegolf.stackexchange.com/questions/3474/…
Peter Taylor

1
@PeterTaylor ทำไมคุณไม่ยกตอนที่อยู่ในกล่องคำถาม? คุณแนะนำอะไร? ฉันสามารถลบได้ในขณะที่ไม่มีคำตอบฉันคิดว่า?
Gareth

@ Gareth เพราะเมื่อมีกิจกรรมในเธรดไม่กี่รายการในเวลาเดียวกันและฉันไม่ได้สังเกตว่ามีคำตอบใหม่ในกล่องคำถาม การลบคือความเป็นไปได้ หรือคุณสามารถขยายให้ได้น้ำหนักที่ขอบ - เรายังไม่มีคำถาม Dijkstra กำกับ
Peter Taylor

คำตอบ:


3

Haskell, 223 207 ตัวอักษร

main=interact$unlines.f.break null.map words.lines
s%[f,t]=[[f]]#t where[]#_="";x#t|y@(_:_)<-[z|z<-x,last z==t]=unwords$minimum y|1<3=s&x#t
s&z=[x++[b]|x<-z,[a,b]<-s,last x==a,notElem b x];f(s,_:q)=map(s%)q

2

Python (2.x), 382 369 358 338 323 318 ตัวอักษร

ยินดีต้อนรับเคล็ดลับและความคิดเห็นทั้งหมด!

import os;u=str.split;l=u(os.read(0,1e9),'\n')
p,g,c=l.index(''),{},map;o=g.setdefault
def f(g,s,e,q=[]):q=q+[s];y=([],[q])[s==e];[c(y.append,f(g,n,e,q))for n in set(o(s,[]))-set(q)];return y
for k,v in c(u,l[:p]):o(k,[]);g[k]+=v
for w,e in c(u,l[p+1:]):h=sorted(f(g,w,e));print''if not h else' '.join(min(h,key=len))

ควรผ่านการทดสอบในรูปแบบนี้ การป้อนข้อมูลผ่านทางฟีด stdin python shortestroute.py < test.txtเช่น


ดูเหมือนว่าจะล้มเหลวแบบสอบถาม 2 ของการทดสอบ 4. ผลตอบแทนแทนA B I J M A B G J M
Gareth

@Gareth: มีแน่นอนข้อผิดพลาดเล็ก ๆ พิจารณาเรียงลำดับของการแก้ปัญหา lexographical ยาวใกล้เคียงกันควรได้รับการแก้ไขในขณะนี้ ...
ChristopheD

1

C: 450 , 437 , 404 , 390 ตัวอักษร

#include<stdio.h>
#include <string.h>
r[99][99],p[99],q[99],m[99],i,j,x,y,s;
char t[9],e[9999];
F(k)
{
    m[k]^s?r[p[k]=q[i]][k]?m[q[j++]=k]=s:0:0;
    if(++k<99)F(k);
}
f()
{
    F(0);
    if(++i^j)f();
}
P(o)
{
    if(p[o])P(p[o]);
    *t=m[o]^s?0:o;
    strcat(e,t);
}
w()
{
    gets(t);
    r[*t][t[2]]=*t?w():0;
}
W()
{
    gets(t);
    x=*t,x?y=t[j=2],s=x+y*99,m[q[t[2]=i=p[x]=0]=x]=s,f(),P(y),strcat(e,"\n"),W():0; 
}
main()
{
    w();
    W();
    puts(e);
}

puts("\n")พิมพ์สองบรรทัดใหม่ puts()เพิ่มตัวสิ้นสุดจุดสิ้นสุดบรรทัดให้กับสตริงที่พิมพ์โดยอัตโนมัติ เพื่อหลีกเลี่ยงการว่าพฤติกรรมการใช้งานหรือเพียงแค่fputs(str, stdout) printf(str)
JB

ก้มกฏเล็กน้อย - ควรรับอินพุตทั้งหมดในครั้งเดียวแล้วส่งออกคำตอบทั้งหมดสำหรับเคียวรีในครั้งเดียว ฉันจะ +1 มันเพราะมันใช้งานได้ดี (และพบข้อผิดพลาดในการทดสอบ) แต่ฉันจะไม่สามารถยอมรับได้ในโปรแกรมที่ยาวกว่าซึ่งสอดคล้องกับข้อกำหนดอินพุต / เอาต์พุตอย่างสมบูรณ์
Gareth

@Gareth: แก้ไขแล้ว แม้ว่าเอาต์พุตคำตอบไม่ควรยาวเกิน 9999 ตัวอักษร!
Ali1S232
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.