introduction
J'ai défini la classe des permutations angoissées dans un défi précédent . Pour rappel, une permutation p des nombres de 0 à r-1 est angoissée, si pour chaque entrée p [i] sauf la première, il y a une entrée antérieure p [ik] telle que p [i] == p [ ik] ± 1 . Comme fait amusant, j'ai également déclaré que pour r ≥ 1 , il y a exactement 2 r-1 permutations antsy de longueur r . Cela signifie qu'il existe une correspondance biunivoque entre les permutations antsy de longueur r et les vecteurs binaires de longueur r-1. Dans ce défi, votre tâche consiste à mettre en œuvre une telle correspondance.
La tâche
Votre tâche consiste à écrire un programme ou une fonction qui prend un vecteur binaire de longueur 1 ≤ n ≤ 99 et génère une permutation antsy de longueur n + 1 . La permutation peut être basée sur 0 ou sur 1 (mais cela doit être cohérent), et l'entrée et la sortie peuvent être dans n'importe quel format raisonnable. De plus, différentes entrées doivent toujours donner des sorties différentes; à part cela, vous êtes libre de retourner quelle que soit la permutation angoissée que vous souhaitez.
Le nombre d'octets le plus bas gagne.
Exemple
Les permutations antsy (basées sur 0) de longueur 4 sont
0 1 2 3
1 0 2 3
1 2 0 3
1 2 3 0
2 1 0 3
2 1 3 0
2 3 1 0
3 2 1 0
et votre programme devrait renvoyer l'un d'eux pour chacun des vecteurs de huit bits de longueur 3:
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
la source
0 1
et0 0 1
devrait donner des sorties de différentes longueurs.Réponses:
Gelée ,
121110 octetsEssayez-le en ligne! ou générer toutes les permutations de longueur 4 .
Comment ça fonctionne
la source
Python 2,
6260 octetsMerci à @xnor d'avoir joué au golf sur 2 octets!
Testez-le sur Ideone .
la source
x=0,
?0,
est un tuple. Sans la virgule, le mappage sur x échouerait.n
pour faire[n*len(x)]
et changer la carte en une liste comp.Python, 54 octets
Utilise la procédure suivante:
Par exemple,
l=[1,0,1,0]
donnef(l) == [2,1,3,0,4]
Ajouter un 0 donnerait également le même résultat. C'est
enumerate
maladroit, je vais voir si ça peut faire mieux récursivement.la source
sum
syntaxe et du découpage.JavaScript (ES6),
484745 octetsCela s'est avéré être similaire à la méthode de @ETHproductions, sauf que j'avais commencé par calculer directement le premier élément, puis en utilisant le vecteur binaire pour déterminer si chaque chiffre est un nouveau haut ou un nouveau bas. Edit: 1 octet enregistré grâce à @ETHproductions. Sauvegardé 2 octets en commençant par zéro et en ajustant par la suite. Ma méthode précédente s'est avérée similaire à la méthode de @ Dennis, mais a pris 54 octets:
la source
Perl, 33 octets
Comprend +1 pour
-p
Donnez le vecteur comme chaîne sans espaces sur STDIN:
antsy.pl
:la source
JavaScript (ES6), 52 octets
Testez-le:
Explication
Cela profite du fait que lorsqu'une permutation angoissée est inversée, chaque élément est soit 1 de plus que le maximum des entrées basses précédentes, soit 1 de moins que le minimum des entrées hautes précédentes. En désignant un élément supérieur comme a
0
et un élément inférieur comme a1
, nous pouvons créer une correspondance exacte entre les permutations antsy de longueur n et les vecteurs binaires de longueur n - 1 .Le mieux que j'ai pu faire avec la technique de Dennis est de
5751 octets:La solution de xnor est 56 (sauvé 1 octet grâce à @Neil):
la source
i-i*x
pourrait êtrei*!x
.Haskell, 40 octets
La solution Python de Dennis joue merveilleusement à Haskell avec
map
etfold
. C'est plus court que mes tentatives de porter ma construction directe en entrée:la source
Lot, 127 octets
Prend l'entrée comme paramètres de ligne de commande, la sortie est séparée par ligne. (Il est possible de saisir des espaces séparés sur STDIN sans frais supplémentaires.)
la source