Percorso più breve attraverso un sistema a senso unico


9

La mia città natale, Rhyl , ha un sistema di traffico a senso unico che sembra essere stato progettato per tenere le persone lontano dalla loro destinazione il più a lungo possibile. Il tuo compito, se scegli di tentarlo, è quello di produrre un programma per fornire il percorso più breve attraverso un tale sistema di traffico.

Ingresso

L'input sarà attivo STDINe sarà un elenco di punti iniziale e finale seguito da una riga vuota seguita da un elenco di query, come segue:

A B
B A
B C
C D
D C

A D
C A
B A

Ogni strada può essere percorsa solo nella direzione (e) indicata (e), quindi nell'esempio sopra la strada A - B è una strada a doppio senso mentre B - C è una strada a senso unico da B a C. Viaggiando da C a B è proibito.

I punti iniziale e finale saranno tutti rappresentati da una singola lettera maiuscola.

Produzione

L'output dovrebbe essere il percorso più breve (misurato dal numero di punti visitati) dal punto di partenza dato al punto di fine dato per ogni query ricevuta. Se non esiste tale route, emettere una riga vuota. Se esiste più di un percorso più breve, emettere il primo durante l'ordinamento lessicografico di tutti i percorsi più brevi.

Per l'esempio sopra, l'output sarebbe:

A B C D

B A

Script di test

Come prima sto fornendo test per questo compito basato su script scritti da Joey e Ventero : -

e anche test e output attesi per chiunque non possa usare gli script sopra

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

Rewards

Tutte le risposte che hanno ovviamente tentato di giocare a golf che soddisfano le specifiche e superano tutti i test otterranno il mio voto. La risposta operativa più breve entro il 26/01/2012 sarà accettata.


output the first when sorting all shortest routes lexicographically- Quindi se A B De A C Dsono entrambe valide soluzioni, output A B Dinvece?
Mr. Llama,

@GigaWatt Sì, esatto.
Gareth,

Questo è terribilmente vicino a un duplicato di codegolf.stackexchange.com/questions/3474/…
Peter Taylor,

1
@PeterTaylor Perché non l'hai sollevato mentre era nella sandbox delle domande? Che cosa suggerisci? Potrei cancellarlo mentre non ci sono risposte, suppongo?
Gareth,

@Gareth, perché per una volta ci sono state attività su alcuni thread su meta contemporaneamente e non ho notato che c'era una nuova risposta nella sandbox delle domande. La cancellazione è una possibilità; oppure potresti estenderlo per pesare i bordi - non abbiamo ancora avuto una domanda diretta su Dijkstra.
Peter Taylor,

Risposte:


3

Haskell, 223 207 caratteri

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

Pitone (2.x), 382 369 358 338 323 318 caratteri

Tutti i suggerimenti e i commenti sono benvenuti!

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

Dovrebbe superare i test in questo modulo. Ingresso di alimentazione tramite stdin, ad es python shortestroute.py < test.txt.


Sembra non riuscire la query 2 del test 4. Restituisce A B I J Minvece di A B G J M.
Gareth,

@Gareth: c'era davvero un piccolo bug che considerava una sorta di soluzione lessicale di lunghezza simile, che ora dovrebbe essere risolto ...
ChristopheD,

1

C: 450 , 437 , 404 , 390 caratteri

#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")stampa due nuove righe. puts()aggiunge automaticamente un terminatore di fine riga alle stringhe che stampa. Per evitare tale comportamento, utilizzare fputs(str, stdout)o semplicemente printf(str).
JB

Piega leggermente le regole - dovrebbe prendere tutti gli input in una volta sola e quindi produrre tutte le risposte alle query in una volta sola. Lo farò +1 perché funziona bene (e ho trovato errori nei test), ma non sarò in grado di accettarlo su un programma più lungo che rispetta pienamente i requisiti di input / output.
Gareth,

@Gareth: risolto. tuttavia, l'output della risposta non dovrebbe essere più lungo di 9999 caratteri!
Ali1S232,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.