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.


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

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.


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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.