Objectif
Générez la liste brouillée d'origine, à partir des mouvements qu'un tri d'insertion ferait pour le trier. La liste d'origine aura tous les nombres de 0
à N-1
(inclus) où N
est la taille de l'entrée.
Contribution
Une liste contenant les mouvements nécessaires pour trier la liste. Chaque valeur représente le nombre d'emplacements déplacés par le numéro d'origine (brouillé) pour se trouver dans sa bonne position, gardez à l'esprit que ce processus se déroule de gauche à droite.
La valeur à la position (indexée 0) i
dans la liste d'entrée sera comprise entre 0
et i
inclusive.
Vous n'avez pas besoin de gérer des entrées invalides, tout comportement est acceptable dans ce cas (crash, boucle infinie, etc.).
Production
La liste brouillée
Pas à pas pour générer les mouvements
Scrambled List | Moves to sort
[4,0,2,1,3,5] | [0, , , , , ] #4 stay in place
[4,0,2,1,3,5] | [0,1, , , , ] #0 is moved 1 slot to the left
[0,4,2,1,3,5] | [0,1,1, , , ] #2 is moved 1 slot
[0,2,4,1,3,5] | [0,1,1,2, , ] #1 is moved 2 slot
[0,1,2,4,3,5] | [0,1,1,2,1, ] #3 is moved 1 slot
[0,1,2,3,4,5] | [0,1,1,2,1,0] #5 is in the right place already
[0,1,2,3,4,5]
Donc, pour l'entrée que [0,1,1,2,1,0]
votre programme doit produire [4,0,2,1,3,5]
.
Gardez à l'esprit que les mouvements ne sont pas à la position dans la liste triée (finale), mais dans le segment trié (la section en gras)
Cas de test
[0,0,0] -> [0,1,2]
[0,1,0,1] -> [1,0,3,2]
[0,0,0,0,0,5] -> [1,2,3,4,5,0]
[0,1,2,3] -> [3,2,1,0]
[0,1,1,1] -> [3,0,1,2]
[0,1,1,2,1,0] -> [4,0,2,1,3,5]
Gagnant
C'est le golf de code , donc la réponse la plus courte l'emporte.
la source
Réponses:
Gelée , 12 octets
Essayez-le en ligne!
Explication
Nous pouvons essentiellement voir les deux listes (l'entrée et la sortie) comme encodant un entier; l'entrée code un entier en base factorielle et la sortie code un entier en permutation. Heureusement, Jelly a des intrinsèques qui sont déjà très proches de ces deux encodages, il s'agit donc simplement d'écrire de petits morceaux de code à convertir en un entier, puis de revenir à l'autre encodage.
Dans le cas de la factorielle de base, on peut observer que le premier élément de la liste doit être 0, le second peut être 0 ou 1, le troisième doit être 0/1/2, etc. Ainsi, nous devons inverser l'entrée afin de placer ses éléments dans l'ordre d'écriture normal pour la conversion de base.
De plus, pour que les ordres relatifs de la conversion factorielle et de la conversion de permutation correspondent à l'opération utilisée par le tri par insertion, nous devons effectuer deux ajustements: inverser la séquence des permutations et inverser l'ordre de la liste de sortie. Inverser la liste de sortie est assez facile, ne nécessitant qu'un
U
à la fin du programme. Pour inverser la séquence des permutations, nous soustrayons de la factorielle de la longueur d'entrée (cela fonctionne parce que la factorielle de base produit un nombre compris entre 0 et (longueur! -1), tandis que les permutations sont numérotées par Jelly de 1 à la longueur! , produisant un off-by-one implicite qui annule le off-by-one que vous obtenez normalement en soustrayant un indice de permutation d'une factorielle).Jelly , 9 octets, en collaboration avec @JonathanAllan
Cette version du programme est très similaire, mais utilise une méthode différente pour inverser la séquence des permutations; il suffit de nier l'entrée avec
N
pour faireœ?
traiter l'ordre à l'envers. En dehors de cela, il fonctionne de manière identique au programme précédent.Essayez-le en ligne!
la source
Æ¡
et moiœ?
fonctionneraient pour cela (j'avais déjà commencé à essayer de les utiliser pour ce défi plus tôt - j'étais si proche, j'avais juste besoin de çaL!
).UÆ¡Nœ?L’U
parce que j'ai implémentéœ?
(et similaire) pour agir de manière modulaire (comme s'ils utilisaient des listes Jelly). LeN
juste indexe avec la valeur négative. Remarque: j'ai changéJ
pourL
- c'est simplement parce que, étant donné un certain nombre, cela fait une gamme sous le capot de toute façon).Mathematica, 92 octets
Fonction pure prenant une liste d'entiers non négatifs en entrée et renvoyant une liste d'entiers non négatifs. Le code ci-dessus contient un
©
, ce qui est incorrect: c'est un espace réservé pour le symbole à 3 octets U + F3DE, que Mathematica représente par un cercle avec un point dedans, et qui représente la composition des permutations.c=Cycles@{#}&
définit une fonction qui convertit une liste d'entiers en unCycles
objet représentant une permutation; par exemple,c[{3,4}]
est la transposition des éléments d'échange 3 et 4 d'une liste.c[i-0~Range~#[[i]]]~Table~{i,l,1,-1}]
prend la liste d'entrée et génère les permutations nécessaires pour annuler le tri par insertion. Ensuite,c@{}©##&@@
compose toutes ces permutations ensemble, en commençant par la permutation d'identitéc@{}
. Enfin,Permute[Range[l=Length@#]-1,...]
applique cette permutation à la liste indexée 0 de longueur appropriée.la source
@{#}&)@{}©##&@@
est effrayant.Python 2,
7968 octetsMerci à Krazor pour avoir économisé 10 octets
Merci à TuukkaX pour avoir économisé 1 octet
Fonctionne en générant les mouvements à l'envers
la source
a=input();b=range(len(a));print[b.pop(j-a[j]) for j in b[::-1]][::-1]
. Liste des compréhensions ftw!for
, alors faites-en 65 je suppose: DJavaScript (ES6),
696563 octetsDe manière ennuyeuse, l'entrée et la sortie sont dans le mauvais ordre. Edit: 4 octets enregistrés grâce à @Arnauld. Enregistré 2 octets grâce à @ETHproductions.
la source
i
, n'est -ce pas?i
...o=>+b.splice(~o,1)
JavaScript (ES6),
7371 octetsSauvegardé 2 octets grâce à ETHproductions
Cas de test
Afficher l'extrait de code
la source
a=m.map(_=>j++,j=0)
, mais c'est la même longueur et je suis sûr que vous l'avez déjà essayé.j
àa.length
plutôt quea.length-1
et nécessiteraita.splice(--j,0,a.splice(j-m[j],1)[0])
)+a.splice(j-m[j--],1)
Haskell , 85 octets
Essayez-le en ligne! Exemple d'utilisation:
f [0,1,1,2,1,0]
rendements[4,0,2,1,3,5]
.f x
appelle la fonction#
avec listex
inversée et une liste[length x - 1, length x - 2, ... , 0]
.(n:r)#l
effectue le tri par insertion inverse en retirant récursivement len
th élémentl
, oùl!!n
renvoie len
th élément ettake n l++drop(n+1)l
produit la listel
avec len
th élément supprimé.la source
perl, 61 octets
La sortie se retrouve dans le tableau @o. Exemple avec un tableau d'entrée comme arguments de ligne de commande:
la source
Rubis, 49 octets
Effectue «l'insertion inverse» en place dans la liste, en commençant par le plus grand nombre.
la source