Imaginez les diagrammes suivants comme des ensembles de tubes croisés verticaux.
1 2 1 2 1 2 3 4
\ / \ / \ / \ /
X | | |
/ \ / \ / \ / \
2 1 1 2 | X |
\ / \ /
X X
/ \ / \
3 1 4 2
Dans le diagramme le plus à gauche, les 1
et 2
glissent vers le bas de leurs barres obliques respectives, se croisent X
et sortent de part et d'autre de leur point de départ.
C'est la même idée dans le diagramme du milieu, mais le |
signifie que les chemins ne se croisent pas, donc rien ne change.
Le diagramme le plus à droite montre un routage de tube plus complexe qui s'infiltre 1 2 3 4
dans 3 1 4 2
.
Objectif
Votre objectif dans ce défi de golf de code est de dessiner ces "diagrammes de routage de tubes" étant donné une permutation telle que 3 1 4 2
. Le programme le plus court en octets gagnera.
Détails
- L'entrée provient de stdin comme toute permutation des nombres de 1 à n séparés par des espaces, où n est un entier positif. Vous pouvez supposer que toutes les entrées sont bien formées.
La sortie du diagramme de routage passe à stdout.
- La «suppression» des nombres de 1 à n dans le haut du diagramme devrait entraîner la permutation d'entrée en bas. (Le haut et le bas sont toujours des couches de barres obliques.)
- Le diagramme n'a pas besoin d'être de petite taille optimale. Il peut y avoir autant de niveaux que nécessaire tant qu'il est correct.
- Le diagramme ne doit contenir que les caractères
\/ X|
ainsi que les retours à la ligne (pas de chiffres). |
doit toujours être utilisé sur les intersections les plus externes, car l'utilisationX
n'aurait aucun sens.- Quelques espaces de début ou de fin sont corrects tant que le diagramme est correctement aligné.
Exemples
Une entrée de 3 1 4 2
pourrait produire (comme ci-dessus)
\ / \ /
| |
/ \ / \
| X |
\ / \ /
X X
/ \ / \
Un apport de 1
pourrait produire
\
|
/
|
\
|
/
Un apport de 3 2 1
pourrait produire
\ / \
X |
/ \ /
| X
\ / \
X |
/ \ /
Un apport de 2 1 3 4 6 5
pourrait produire
\ / \ / \ /
X | X
/ \ / \ / \
la source
X
connecter directement à un comme|
le fait un/
? À un autreX
?row of slashes
,row of X's and |'s
,row of slashes
,row of X's and |'s
, ... format.n
être supérieur à 10?Réponses:
Python 2, 218
219220222224227243247252259261264J'ai adopté une approche légèrement différente: je trouve les swaps nécessaires pour trier l'entrée, puis inverser verticalement pour obtenir les swaps nécessaires pour transformer la liste triée en entrée. En prime de cette approche, il peut prendre une liste arbitraire de nombres et donner le chemin de permutation pour transformer le type d'entrée en entrée.
Exemple:
Améliorations:
264 -> 261: Boucle externe commutée de pour à while.
261 -> 259: utilisé à la
f%2
place de(c^m)
, car en python, les opérateurs arithmétiques ont une priorité plus élevée que les opérateurs au niveau du bit.259 -> 252: Boucle intérieure commutée de pour à while. Combiné
i
etc
variables.252 -> 247: build modifié puis inversé pour simplement construire dans l'ordre inverse.
247 -> 243: Ajout de nouvelles lignes manuellement, au lieu d'utiliser la jointure.
243 -> 227: Adoption de la méthode de génération de lignes de barre oblique de grc (merci grc!) Et ajout de s.
227 -> 224: Déplacement de la génération de ligne de barre oblique avant la boucle while intérieure pour supprimer un
%4
et enregistrer un caractère en utilisant un découpage étendu.224 -> 222: Supprimé m.
222 -> 220:
f%2+n%2
->f+n&1
220 -> 219:
| 1<n-1|
->|~i>-n|
(espace de tête supprimé)219 -> 218: initialisations combinées de
o
ets
et déplacé la tranche à la fin.la source
Python, 290
J'ai opté pour une approche assez basique, mais elle s'est avérée un peu plus longue que ce que j'espérais. Il considère la liste par paires et décide de permuter ou non chaque paire. Cette opération est répétée pour chaque ligne entrecroisée jusqu'à ce que la liste corresponde à l'entrée.
Exemple:
la source
JavaScript HTML,
553419Merci à @izlin et @TomHart d'avoir signalé mes erreurs.
Testez ici: http://goo.gl/NRsXEj
la source
Javascript - 395
378 si je n'imprime pas les chiffres sur ma sortie, mais cela semble beaucoup mieux et améliore la lisibilité.
Testez-le ici . (avec version non golfée)
Version golfée :
Explication
D'abord, je sous-entrave l'entrée, avec le numéro d'index et change la première ligne avec les résultats. Par exemple
Avec cette substitution, je peux utiliser un algorithme de tri à bulles pour trier 2,4,1,3 à 1,2,3,4 et le graphique sera le plus court possible que nous recherchons.
Si vous avez des idées sur la façon de réduire le code, commentez :)
Exemple
la source
<br>
balise et la zone de texte uniquement sur jsfiddle, car cela semble beaucoup mieux. L'alerte n'a pas de police à espacement fixe, donc la sortie est mauvaise. Dans ma version golfée, j'utilise alert et \ n. Votre page Web est-elle publique?Cobra - 334
344356360Il fonctionne en déplaçant chaque élément en place à partir de la gauche. Pour cette raison, il produira souvent une carte des chemins ridiculement grande (bien que toujours correcte).
Exemples:
la source