Percurso mais curto através de um sistema de sentido único

9

Minha cidade natal, Rhyl , possui um sistema de tráfego unidirecional que parece ter sido projetado para manter as pessoas afastadas de seu destino pelo maior tempo possível. Sua tarefa, se você optar por tentar, é produzir um programa para fornecer a rota mais curta através desse sistema de tráfego.

Entrada

A entrada estará ativada STDINe haverá uma lista de pontos de início e de término, seguidos por uma linha em branco seguida por uma lista de consultas, conforme a seguir:

A B
B A
B C
C D
D C

A D
C A
B A

Cada estrada só pode ser percorrida na (s) direção (ões) indicada (s), portanto, no exemplo acima, a estrada A - B é uma via de mão dupla, enquanto B - C é uma via de mão única de B para C. Viajando de C para B é proíbido.

Os pontos inicial e final serão todos representados por uma única letra maiúscula.

Resultado

A saída deve ser a rota mais curta (medida pelo número de pontos visitados) do ponto inicial especificado até o ponto final especificado para cada consulta recebida. Se não existir tal rota, produza uma linha em branco. Se existir mais de uma rota mais curta, imprima a primeira ao classificar todas as rotas mais curtas lexicograficamente.

Para o exemplo acima, a saída seria:

A B C D

B A

Scripts de teste

Como antes, estou fornecendo testes para esta tarefa com base em scripts escritos por Joey e Ventero : -

e também testes e resultados esperados para quem não pode usar os scripts acima

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

Recompensas

Todas as respostas que obviamente tiveram alguma tentativa de jogar golfe que atendam às especificações e passem em todos os testes receberão meu voto positivo. A resposta mais curta possível até 26/01/2012 será aceita.

Gareth
fonte
output the first when sorting all shortest routes lexicographically- Então, se A B De A C Dsão soluções válidas, em A B Dvez disso?
Mr. Llama
@GigaWatt Sim, está certo.
Gareth
Isso está muito perto de uma duplicata de codegolf.stackexchange.com/questions/3474/… #
Peter Taylor
11
@ PeterTaylor Por que você não levantou isso enquanto estava na sandbox de perguntas? O que você sugere? Eu poderia excluí-lo enquanto não houver respostas, suponho?
Gareth
@Gareth, porque pela primeira vez houve atividade em alguns threads no meta ao mesmo tempo, e eu não percebi que havia uma nova resposta na sandbox da pergunta. A exclusão é uma possibilidade; ou você pode estendê-lo para ponderar as arestas - ainda não temos uma pergunta direcionada à Dijkstra.
Peter Taylor

Respostas:

3

Haskell, 223 207 caracteres

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
fonte
2

Python (2.x), 382 369 358 338 323 318 caracteres

Todas as dicas e comentários são bem-vindos!

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

Deve passar nos testes neste formulário. Entrada de alimentação via stdin, por exemplo python shortestroute.py < test.txt.

ChristopheD
fonte
Parece falhar na consulta 2 do teste 4. Retorna em A B I J Mvez de A B G J M.
Gareth
@Gareth: houve de fato um pequeno bug considerando tipo lexographical de soluções de comprimento semelhantes, deve ser fixado agora ...
ChristopheD
1

C: 450 , 437 , 404 , 390 caracteres

#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
fonte
puts("\n")imprime duas novas linhas. puts()adiciona automaticamente um terminador de fim de linha às seqüências impressas. Para evitar esse comportamento, use fputs(str, stdout)ou simplesmente printf(str).
JB
Dobra um pouco as regras - deve receber toda a entrada de uma só vez e depois enviar todas as respostas para as consultas de uma só vez. Marcarei +1 porque funciona bem (e encontrei erros nos testes), mas não poderei aceitá-lo em um programa mais longo que atenda totalmente aos requisitos de entrada / saída.
Gareth
@Gareth: fixo. no entanto, a saída da resposta não deve exceder 9999 caracteres!
Ali1S232