Itinéraire le plus court à travers un système à sens unique

9

Ma ville natale, Rhyl , a un système de circulation à sens unique qui semble avoir été conçu pour éloigner les gens de leur destination aussi longtemps que possible. Votre tâche, si vous choisissez de l'essayer, est de produire un programme pour donner l'itinéraire le plus court à travers un tel système de circulation.

Contribution

L'entrée sera activée STDINet sera une liste de points de début et de fin suivie d'une ligne vierge suivie d'une liste de requêtes, comme suit:

A B
B A
B C
C D
D C

A D
C A
B A

Chaque route ne peut être parcourue que dans la ou les directions données, donc, dans l'exemple ci-dessus, la route A - B est une rue à double sens tandis que B - C est une rue à sens unique de B à C. Voyager de C à B est interdit.

Les points de départ et d'arrivée seront tous représentés par une seule lettre majuscule.

Production

La sortie doit être l'itinéraire le plus court (mesuré par le nombre de points visités) du point de départ donné au point final donné pour chaque requête reçue. Si aucune route de ce type n'existe, affichez une ligne vierge. S'il existe plusieurs itinéraires les plus courts, sortez le premier lors du tri de tous les itinéraires les plus courts lexicographiquement.

Pour l'exemple ci-dessus, la sortie serait:

A B C D

B A

Scripts de test

Comme précédemment, je fournis des tests pour cette tâche sur la base de scripts écrits par Joey et Ventero : -

et également des tests et des résultats attendus pour quiconque ne peut pas utiliser les scripts ci-dessus

Usage: ./test [your program and its arguments]

Récompenses

Toutes les réponses qui ont évidemment eu une tentative de golf qui répondent aux spécifications et réussissent tous les tests obtiendront mon vote positif. La réponse la plus courte au plus tard le 26/01/2012 sera acceptée.

Gareth
la source
output the first when sorting all shortest routes lexicographically- Donc, si A B Det A C Dsont les deux solutions valides, sortez-vous à la A B Dplace?
M. Llama
@GigaWatt Oui, c'est vrai.
Gareth
C'est terriblement proche d'un doublon de codegolf.stackexchange.com/questions/3474/…
Peter Taylor
1
@PeterTaylor Pourquoi n'avez-vous pas soulevé cela alors que c'était dans le bac à sable de la question? Que suggérez-vous? Je pourrais le supprimer sans réponse, je suppose?
Gareth
@Gareth, car pour une fois, il y avait de l'activité sur quelques threads sur la méta en même temps, et je n'ai pas remarqué qu'il y avait une nouvelle réponse dans le bac à sable de la question. La suppression est une possibilité; ou vous pouvez l'étendre pour alourdir les bords - nous n'avons pas encore posé de question Dijkstra.
Peter Taylor

Réponses:

3

Haskell, 223 207 caractères

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
hammar
la source
2

Python (2.x), 382 369 358 338 323 318 caractères

Tous les conseils et commentaires sont les bienvenus!

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

Devrait passer les tests sous cette forme. Entrée de flux via stdin, par exemple python shortestroute.py < test.txt.

ChristopheD
la source
Semble échouer la requête 2 du test 4. Renvoie A B I J Mau lieu de A B G J M.
Gareth
@Gareth: il y avait en effet un petit bug considérant le type lexographique de solutions de longueur similaire, devrait être corrigé maintenant ...
ChristopheD
1

C: 450 , 437 , 404 , 390 caractères

#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);
}
Ali1S232
la source
puts("\n")imprime deux nouvelles lignes. puts()ajoute automatiquement un terminateur de fin de ligne aux chaînes qu'il imprime. Pour éviter ce comportement, utilisez fputs(str, stdout)ou simplement printf(str).
JB
Contourne légèrement les règles - devrait prendre toutes les entrées en une seule fois, puis afficher toutes les réponses aux requêtes en une seule fois. Je vais le +1 car cela fonctionne bien (et a trouvé des erreurs dans les tests), mais je ne serai pas en mesure de l'accepter sur un programme plus long qui respecte pleinement les exigences d'entrée / sortie.
Gareth
@Gareth: fixe. cependant, la réponse ne doit pas dépasser 9 999 caractères!
Ali1S232