Imagine os diagramas a seguir como conjuntos de tubos verticais cruzados.
1 2 1 2 1 2 3 4
\ / \ / \ / \ /
X | | |
/ \ / \ / \ / \
2 1 1 2 | X |
\ / \ /
X X
/ \ / \
3 1 4 2
No diagrama mais à esquerda, o 1
e 2
deslizar para baixo as respectivas barras, atravessar no X
, e sair em lados opostos do local onde iniciada.
É a mesma idéia no diagrama do meio, mas |
significa que os caminhos não se cruzam, então nada muda.
O diagrama mais à direita mostra um roteamento de tubo mais complexo que permite a 1 2 3 4
entrada 3 1 4 2
.
Objetivo
Seu objetivo neste desafio do código de golfe é desenhar esses "diagramas de roteamento de tubos", com uma permutação como 3 1 4 2
. O programa mais curto em bytes vencerá.
Detalhes
- A entrada vem de stdin como qualquer permutação dos números de 1 a n separados por espaços, onde n é um número inteiro positivo. Você pode assumir que todas as informações estão bem formadas.
A saída do diagrama de roteamento vai para stdout.
- "Soltar" os números de 1 a n em ordem na parte superior do diagrama deve resultar na permutação de entrada saindo na parte inferior. (Superior e inferior são sempre camadas de barras.)
- O diagrama não precisa ser otimamente pequeno. Pode ser quantos níveis forem necessários, desde que esteja correto.
- O diagrama deve conter apenas os caracteres
\/ X|
e as novas linhas (sem números). |
sempre deve ser usado nas interseções mais externas, pois o usoX
não faria sentido.- Alguns espaços à esquerda ou à direita são bons, desde que o diagrama esteja alinhado corretamente.
Exemplos
Uma entrada de 3 1 4 2
pode produzir (o mesmo que acima)
\ / \ /
| |
/ \ / \
| X |
\ / \ /
X X
/ \ / \
Uma entrada de 1
pode produzir
\
|
/
|
\
|
/
Uma entrada de 3 2 1
pode produzir
\ / \
X |
/ \ /
| X
\ / \
X |
/ \ /
Uma entrada de 2 1 3 4 6 5
pode produzir
\ / \ / \ /
X | X
/ \ / \ / \
fonte
X
conectar - se diretamente a um|
modo como o/
faz? Para outroX
?row of slashes
,row of X's and |'s
,row of slashes
,row of X's and |'s
, ... formato.n
ser maior que 10?Respostas:
Python 2, 218
219220222224227243247252259261264Adotei uma abordagem um pouco diferente: acho os swaps necessários para classificar a entrada e inverto verticalmente para obter os swaps necessários para transformar a lista classificada na entrada. Como um bônus adicional dessa abordagem, ele pode usar uma lista arbitrária de números e fornecer o caminho de permutação para transformar o tipo de entrada na entrada.
Exemplo:
Melhorias:
264 -> 261: Loop externo comutado de para para enquanto.
261 -> 259: Usado em
f%2
vez de(c^m)
, porque em python os operadores aritméticos têm maior prioridade do que os operadores bit a bit.259 -> 252: loop interno comutado de para para enquanto. Combinado
i
ec
variáveis.252 -> 247: Compilação alterada e reversa para compilar apenas na ordem inversa.
247 -> 243: Adicionadas novas linhas manualmente, em vez de usar junção.
243 -> 227: Adotou o método do grc de geração de barras (obrigado grc!) E adicionou s.
227 -> 224: Movida a geração da linha de barra para o loop while interno para remover ae
%4
salvar um caractere usando o fatiamento estendido.224 -> 222: Removido m.
222 -> 220:
f%2+n%2
->f+n&1
220 -> 219:
| 1<n-1|
->|~i>-n|
(espaço inicial removido)219 -> 218: initializations combinados de
o
es
e mudou-se a fatia até o fim.fonte
Python, 290
Eu fui para uma abordagem bastante básica, mas acabou um pouco mais do que eu esperava. Ele considera a lista em pares e decide se deve ou não trocar cada par. Isso é repetido para todas as linhas que cruzam até a lista corresponder à entrada.
Exemplo:
fonte
JavaScript HTML,
553419Obrigado a @izlin e @TomHart por apontar meus erros.
Teste aqui: http://goo.gl/NRsXEj
fonte
Javascript - 395
378 se eu não imprimir os números na minha saída, mas parecerá muito melhor e melhorará a legibilidade.
Teste aqui . (com versão ungolfed) versão
golfed:
Explicação
Primeiro subestudo a entrada, com o número do índice e altero a primeira linha com os resultados. Por exemplo
Com essa substituição, posso usar um algoritmo de classificação por bolhas para classificar 2,4,1,3 a 1,2,3,4 e o gráfico será o mais curto possível que estamos procurando.
Se você tiver alguma idéia de como eu posso diminuir o código, basta comentar :)
Exemplo
fonte
<br>
tag e a textarea apenas no jsfiddle, porque parece muito melhor. O alerta não possui fonte monoespaçada, portanto a saída parece ruim. Na minha versão golfed eu uso alerta e \ n. Sua página da web é pública?Cobra - 334
344356360Ele funciona movendo cada elemento para o local a partir da esquerda. Devido a isso, ele geralmente gera um mapa de caminho ridiculamente grande (embora ainda correto).
Exemplos:
fonte