一方向システムを通る最短ルート


9

私の出身地であるリルには、一方通行の交通システムがあり、目的地からできるだけ離れるように設計されているようです。あなたがそれを試みることを選択した場合のあなたの仕事は、そのような交通システムを通る最短ルートを与えるプログラムを作成することです。

入力

入力はになり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への移動禁止されています。

始点と終点はすべて1つの大文字で表されます。

出力

出力は、受け取ったクエリごとに、指定された開始点から指定された終了点までの最短ルート(訪問したポイントの数で測定)である必要があります。そのようなルートが存在しない場合は、空白行を出力します。複数の最短ルートが存在する場合は、すべての最短ルートを辞書順にソートするときに最初のルートを出力します。

上記の例の場合、出力は次のようになります。

A B C D

B A

テストスクリプト

前と同じように、JoeyVenteroによって書かれたスクリプトに基づいて、このタスクのテストを提供しています:-

上記のスクリプトを使用できない人のためのテストと予想される出力

使用法: ./test [your program and its arguments]

報酬

仕様に適合し、すべてのテストに合格したゴルフでの試みが明らかにあったすべての回答は、私の賛成票を獲得します。2012年1月26日までの最も短い有効な回答が受け入れられます。


output the first when sorting all shortest routes lexicographically-その場合A B DA C Dの両方の有効な解決策は、出力されるA B D代わりに?
Llama氏、

@GigaWattはい、そうです。
Gareth


1
@PeterTaylor質問のサンドボックスにいる間になぜそれを上げなかったのですか?何を指示してるんですか?答えがないのに削除できたのでは?
Gareth

@Gareth、メタのいくつかのスレッドで同時にアクティビティがあったため、質問サンドボックスに新しい返信があることに気づかなかったためです。削除は1つの可能性です。または、エッジを重み付けするように拡張することもできます-ダイクストラの直接的な質問はまだありません。
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


テスト4のクエリ2は失敗するA B I J MようですA B G J M。ではなくを返します。
Gareth

@Gareth:確かに、字句的な類似の長さソリューションを考慮した小さなバグがありましたが、今すぐ修正する必要があります...
ChristopheD

1

C:450437404、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")2つの改行を出力します。 puts()印刷する文字列に行末のターミネータを自動的に追加します。この動作を回避するには、fputs(str, stdout)またはを使用しますprintf(str)
JB

ルールを少し曲げます-すべての入力を一度に受け取り、クエリに対するすべての回答を一度に出力します。+1します。正常に動作するため(そしてテストでミスが見つかったため)、入力/出力の要件に完全に準拠しているより長いプログラムでは受け入れることができません。
Gareth

@Gareth:修正されました。ただし、回答の出力は9999文字以下にする必要があります。
Ali1S232 2012年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.