Introdução
Minha sobrinha quer fazer uma pista de corrida. Ela tem peças de madeira que se encaixam para formar a pista. Cada parte é quadrada e contém uma forma diferente. Usarei os caracteres de desenho de tubo para ilustrar:
│
: a estrada que segue verticalmente─
: a estrada que percorre horizontalmente┌
┐
└
┘
: as estradas que viram em uma direção┼
: Uma ponte com passagem subterrânea
Curiosamente, não existem peças do entroncamento.
Aqui está um exemplo de uma possível pista de carro de corrida:
┌─┐
│ │┌─┐
│ └┼─┘
└──┘
As regras para uma pista de corrida válida são as seguintes:
- Não pode haver estradas que não levam a lugar nenhum.
- Ele deve formar um loop (e todas as peças devem fazer parte do mesmo loop).
- Nas pontes / passagens inferiores, você não pode virar (então você precisa passar direto por elas).
Infelizmente, as peças de pista de corrida que eu e minha sobrinha são limitadas. Mas definitivamente queremos usar todos eles na pista. Escreva um programa que, dada uma lista de quais peças estejam em nosso inventário, produza uma pista de carro de corrida que use todas essas peças.
Descrição da entrada
Gostaríamos que a entrada chegasse via STDIN, argumentos de linha de comando, leitura de arquivo ou uma função de entrada do usuário (como raw_input
ou prompt
). A entrada é números inteiros positivos separados por vírgula no formato
│,─,┌,┐,└,┘,┼
onde cada um deles representa a quantidade daquela peça em particular que temos. Então, por exemplo, a entrada:
1,1,1,1,1,1,1
significaria que tínhamos um de cada peça.
Descrição da saída
Crie uma pista de carro de corrida usando os caracteres de desenho de tubo listados acima. A pista de corrida deve usar exatamente o número de cada peça especificada na entrada - nem mais nem menos. Haverá pelo menos uma pista de carro de corrida válida para cada entrada.
Exemplo de entradas e saídas
Entrada: 3,5,2,2,2,2,1
Uma saída possível:
┌─┐
│ │┌─┐
│ └┼─┘
└──┘
Entrada: 0,0,1,4,4,1,3
Uma saída possível:
┌┐
└┼┐
└┼┐
└┼┐
└┘
Respostas:
Ruby 664
671 677 687 701(678 bytes)Este não é o programa mais curto que eu poderia criar, mas sacrifiquei alguma brevidade pela velocidade de execução.
Você pode experimentar o programa aqui . Observe que o ideone possui um limite de tempo de execução; portanto, para entradas que consistem em mais de 12 partes, o programa provavelmente expirará.
Há também uma suíte de testes para o programa. Observe que os dois últimos testes estão desativados no ideone, devido ao limite de tempo mencionado acima. Para ativar esses testes, exclua o
x_
prefixo de seus nomes.O programa encontra uma solução usando a pesquisa Depth first; coloca peças uma de cada vez e mantém registros de pontas soltas. A pesquisa é interrompida quando não há mais pontas soltas (não conectadas) e todas as peças foram colocadas.
Este é o programa não destruído:
fonte