Imagine los siguientes diagramas como conjuntos de tubos verticales entrecruzados.
1 2 1 2 1 2 3 4
\ / \ / \ / \ /
X | | |
/ \ / \ / \ / \
2 1 1 2 | X |
\ / \ /
X X
/ \ / \
3 1 4 2
En el diagrama de la izquierda, el 1
y 2
deslice hacia abajo sus barras diagonales respectivas, cruce en X
y salga en lados opuestos de donde comenzaron.
Es la misma idea en el diagrama del medio, pero |
significa que los caminos no se cruzan, por lo que nada cambia.
El diagrama de la derecha muestra una ruta de tubo más compleja que permuta 1 2 3 4
en 3 1 4 2
.
Objetivo
Su objetivo en este desafío de golf de código es dibujar estos "diagramas de enrutamiento de tubos" dada una permutación como 3 1 4 2
. El programa más corto en bytes ganará.
Detalles
- La entrada proviene de stdin como cualquier permutación de los números del 1 al n separados por espacios, donde n es un entero positivo. Puede suponer que todas las entradas están bien formadas.
La salida del diagrama de enrutamiento va a stdout.
- "Dejar caer" los números del 1 al n en orden en la parte superior del diagrama debería dar como resultado que la permutación de entrada salga en la parte inferior. (Arriba y abajo siempre son capas de barras).
- El diagrama no necesita ser óptimamente pequeño. Puede ser tantos niveles como sea necesario siempre que sea correcto.
- El diagrama solo debe contener los caracteres
\/ X|
y las nuevas líneas (sin números). |
siempre debe usarse en las intersecciones más externas ya que usarloX
no tendría sentido.- Algunos espacios iniciales o finales están bien siempre que el diagrama esté alineado correctamente.
Ejemplos
Una entrada de 3 1 4 2
podría producir (igual que arriba)
\ / \ /
| |
/ \ / \
| X |
\ / \ /
X X
/ \ / \
Una entrada de 1
podría producir
\
|
/
|
\
|
/
Una entrada de 3 2 1
podría producir
\ / \
X |
/ \ /
| X
\ / \
X |
/ \ /
Una entrada de 2 1 3 4 6 5
podría producir
\ / \ / \ /
X | X
/ \ / \ / \
fuente
X
conectar directamente a un|
modo como lo/
hace? A otroX
?row of slashes
,row of X's and |'s
,row of slashes
,row of X's and |'s
, ... formato.n
ser mayor de 10?Respuestas:
Python 2, 218
219220222224227243247252259261264Tomé un enfoque ligeramente diferente: encuentro los intercambios necesarios para ordenar la entrada, luego lo invierto verticalmente para obtener los intercambios necesarios para convertir la lista ordenada en la entrada. Como una ventaja adicional de este enfoque, puede tomar una lista arbitraria de números y proporcionar la ruta de permutación para convertir el tipo de entrada en la entrada.
Ejemplo:
Mejoras:
264 -> 261: bucle externo conmutado de for a while.
261 -> 259: se usa en
f%2
lugar de(c^m)
, porque en python los operadores aritméticos tienen mayor prioridad que los operadores bit a bit.259 -> 252: bucle interno conmutado de por a mientras. Combinados
i
yc
variables.252 -> 247: Se modificó la construcción y luego se invirtió para simplemente construir en orden inverso.
247 -> 243: se agregaron nuevas líneas manualmente, en lugar de usar join.
243 -> 227: Se adoptó el método de generación de líneas diagonales de grc (¡gracias grc!) Y se agregó s.
227 -> 224: Se movió la generación de línea de barra diagonal al bucle while interno anterior para eliminar ay
%4
guardar un carácter mediante el corte por división extendido.224 -> 222: eliminado m.
222 -> 220:
f%2+n%2
->f+n&1
220 -> 219:
| 1<n-1|
->|~i>-n|
(espacio inicial eliminado)219 -> 218: Inicializaciones combinadas de
o
ys
y movieron el corte al final.fuente
Python, 290
Seguí un enfoque bastante básico, pero resultó un poco más de lo que esperaba. Considera la lista en pares y decide si intercambia o no cada par. Esto se repite para cada fila de intersección hasta que la lista coincida con la entrada.
Ejemplo:
fuente
HTML JavaScript,
553419Gracias a @izlin y @TomHart por señalar mis errores.
Prueba aquí: http://goo.gl/NRsXEj
fuente
Javascript - 395
378 si no imprimo los números en mi salida, pero se ve mucho mejor y mejora la legibilidad.
Pruébalo aquí . (con versión sin
golf ) Versión con golf:
Explicación
Primero sustituyo la entrada, con el número de índice y cambio la primera línea con los resultados. Por ejemplo
Con esta sustitución puedo usar un algoritmo de clasificación de burbujas para clasificar 2,4,1,3 a 1,2,3,4 y el gráfico será el más corto posible que estamos buscando.
Si tienes alguna idea de cómo puedo hacer que el código sea más pequeño, solo comenta :)
Ejemplo
fuente
<br>
etiqueta y textarea solo en jsfiddle, porque se ve mucho mejor. La alerta no tiene una fuente monoespaciada, por lo que la salida se ve mal. En mi versión de golf utilizo alerta y \ n. ¿Tu página web es pública?Cobra - 334
344356360Funciona moviendo cada elemento a su lugar comenzando desde la izquierda. Debido a esto, a menudo generará un mapa de ruta ridículamente grande (aunque todavía correcto).
Ejemplos:
fuente