Tek yönlü bir sistem üzerinden en kısa rota


9

Memleketim, Rhyl , mümkün olduğunca uzun uzağa gidecekleri insanları korumak için tasarlanmış gibi görünüyor tek yönlü trafik sistemi vardır. Göreviniz, bunu denemeyi seçerseniz, böyle bir trafik sistemi üzerinden en kısa yolu verecek bir program üretmektir.

Giriş

Girdi açık olacak STDINve başlangıç ​​ve bitiş noktalarının bir listesi ve ardından boş bir satır ve ardından aşağıdaki gibi bir sorgu listesi olacaktır:

A B
B A
B C
C D
D C

A D
C A
B A

Her yol sadece verilen yönde ilerleyebilir, bu nedenle yukarıdaki örnekte A - B yolu iki yönlü bir sokak iken B - C B'den C'ye tek yönlü bir sokaktır. yasak.

Başlangıç ​​ve bitiş noktalarının tümü tek bir büyük harfle temsil edilecektir.

Çıktı

Çıktı, alınan her sorgu için verilen başlangıç ​​noktasından belirli bir bitiş noktasına kadar olan en kısa yol olmalıdır (ziyaret edilen nokta sayısı ile ölçülür). Böyle bir rota yoksa, boş bir satır verin. Birden fazla kısa rota varsa, en kısa rotaları sözlükbilimsel olarak sıralarken ilk yolu kullanın.

Yukarıdaki örnek için çıktı:

A B C D

B A

Test Scriptleri

Daha önce olduğu gibi Joey ve Ventero tarafından yazılmış senaryolara dayanarak bu görev için testler veriyorum : -

ayrıca yukarıdaki komut dosyalarını kullanamayan herkes için testler ve beklenen çıktı

Kullanımı: ./test [your program and its arguments]

Ödüller

Açıkçası spec karşılamak ve tüm testleri geçmek golf bazı teşebbüs vardı tüm cevaplar benim oy alacak. 26/01/2012 tarihine kadar en kısa çalışma cevabı kabul edilecektir.


output the first when sorting all shortest routes lexicographically- Öyleyse A B Dve A C Dher ikisi de geçerli çözüm ise, çıktı A B Dyerine?
Bay Llama

@GigaWatt Evet, doğru.
Gareth


1
@PeterTaylor Bunu neden soru sanal alanındayken yükseltmediniz? Sen ne önerirsin? Cevap yokken silebilirim, sanırım?
Gareth

@Gareth, çünkü bir kez aynı anda meta üzerinde birkaç iş parçacığında etkinlik vardı ve soru sanal alanında yeni bir yanıt olduğunu fark etmedim. Silme bir olasılıktır; ya da kenarları ağırlıklandırmak için genişletebilirsiniz - henüz bir Dijkstra sorusu sormadık.
Peter Taylor

Yanıtlar:


3

Haskell, 223207 karakter

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 karakter

Tüm ipuçları ve yorumlar hoş geldiniz!

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))

Testleri bu formda geçmelidir. Stdin yoluyla besleme girişi, örn python shortestroute.py < test.txt.


4. İade testin sorgu 2 başarısız görünüyor A B I J Myerine A B G J M.
Gareth

@Gareth: Gerçekten de benzer uzunluktaki çözümlerin lexografik türünü göz önünde bulunduran küçük bir hata vardı, şimdi düzeltilmelidir ...
ChristopheD

1

C: 450 , 437 , 404 , 390 karakter

#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")iki satır basar. puts()yazdırdığı dizelere otomatik olarak bir hat sonu sonlandırıcı ekler. Bu davranışı önlemek için fputs(str, stdout)veya tuşunu kullanın printf(str).
JB

Kuralları hafifçe büker - tüm girdileri bir seferde almalı ve ardından tüm cevapları tek seferde çıkarmalıdır. İyi çalışacağından (ve testlerde hatalar bulduğundan) + 1'leyeceğim, ancak giriş / çıkış gereksinimlerine tam olarak uyan daha uzun bir programda kabul edemeyeceğim.
Gareth

@Gareth: düzeltildi. ancak cevap çıktısı 9999 karakterden daha uzun olmamalıdır!
Ali1S232
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.