J'ai récemment eu un problème à résoudre au travail où j'avais deux listes: une liste principale et une liste plus petite qui contient un sous-ensemble des éléments de la liste principale potentiellement dans un ordre différent. Je devais réorganiser la liste principale de manière à ce que les éléments du sous-ensemble apparaissent dans le même ordre sans modifier l'ordre des éléments non trouvés dans la liste et en gardant les éléments au même endroit dans la mesure du possible. D'accord, cela semble probablement déroutant, alors je vais le détailler:
- La liste principale définit l'ordre par défaut des éléments.
- La liste des sous-ensembles définit l'ordre relatif de certains éléments.
- Lorsque la liste principale contient deux éléments en désordre selon la liste de sous-ensembles, l'élément qui se trouve plus tôt dans la liste principale doit être déplacé vers le premier index où il se trouve au bon emplacement par rapport aux autres éléments de la liste de sous-ensembles. (c'est-à-dire immédiatement après le dernier élément)
Votre tâche consiste à implémenter cet algorithme de réorganisation.
Exemples de cas de test
Master: [1, 2, 3]
Subset: []
Result: [1, 2, 3]
Master: [9001, 42, 69, 1337, 420]
Subset: [69]
Result: [9001, 42, 69, 1337, 420]
Master: [9001, 42, 69, 1337, 420, 99, 255]
Subset: [69, 9001, 1337]
Result: [42, 69, 9001, 1337, 420, 99, 255]
Master: [1, 2, 3, 4, 5]
Subset: [2, 5]
Result: [1, 2, 3, 4, 5]
Master: [apple, banana, carrot, duck, elephant]
Subset: [duck, apple]
Result: [banana, carrot, duck, apple, elephant]
Master: [Alice, Betty, Carol, Debbie, Elaine, Felicia, Georgia, Helen, Ilene, Julia]
Subset: [Betty, Felicia, Carol, Julia]
Result: [Alice, Betty, Debbie, Elaine, Felicia, Carol, Georgia, Helen, Ilene, Julia]
Master: [snake, lizard, frog, werewolf, vulture, dog, human]
Subset: [snake, werewolf, lizard, human, dog]
Result: [snake, frog, werewolf, lizard, vulture, human, dog]
Master: [Pete, Rob, Jeff, Stan, Chris, Doug, Reggie, Paul, Alex]
Subset: [Jeff, Stan, Pete, Paul]
Result: [Rob, Jeff, Stan, Pete, Chris, Doug, Reggie, Paul, Alex]
Master: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
Subset: [8, 1, 2, 12, 11, 10]
Result: [3, 4, 5, 6, 7, 8, 1, 2, 9, 12, 11, 10]
Master: [lol, rofl, lmao, roflmao, lqtm, smh, jk, wat]
Subset: [wat, lmao, rofl]
Result: [lol, roflmao, lqtm, smh, jk, wat, lmao, rofl]
Règles
- Failles standard, yadda yadda, E / S pratiques, bla bla.
- Même si les exemples utilisent des nombres et des chaînes, vous ne devez prendre en charge qu'un seul type d'élément, qu'il s'agisse d'entiers, de chaînes ou de tout autre élément avec une sémantique d'égalité bien définie, y compris des listes hétérogènes si cela vous convient dans votre langue.
- Vous pouvez supposer que la liste principale et la liste de sous-ensembles ne contiennent aucun doublon
- Vous pouvez supposer que tous les éléments trouvés dans la liste des sous-ensembles se trouvent dans la liste principale
- L'une ou l'autre liste peut être vide
- Vous devez, au minimum, prendre en charge des tableaux jusqu'à 100 éléments.
- La réorganisation peut être implémentée sur place ou par la création d'une nouvelle liste / tableau.
Bon golf!
code-golf
array-manipulation
Beefster
la source
la source
8 1 3 4 5 6 7 2 9 12 11 10
solution valable à l'avant-dernier?Réponses:
Retina 0.8.2 , 51 octets
Essayez-le en ligne! Prend l'entrée comme une liste de sous-mots séparés par des virgules sur la première ligne et une liste principale de mots séparés par des virgules sur la deuxième ligne. Explication:
Trouvez deux sous-mots adjacents où le deuxième mot précède le premier de la liste principale.
Déplacez le deuxième mot pour qu'il apparaisse après le premier mot de la liste principale.
Répétez jusqu'à ce qu'aucun mot n'apparaisse en désordre.
Supprimez les sous-mots.
la source
JavaScript (ES6),
96 89 7471 octetsCela a commencé comme un désordre encombrant et a finalement été réduit à une forme plutôt concise et élégante. Je remercie la méthode .splice () pour sa collaboration fructueuse sur celle-ci. ;)
Prend l'entrée comme
(master)(subset)
. Sorties en mettant à jour la liste principale.Essayez-le en ligne!
Comment?
Nous utilisons deux imbriquésje p
Commenté
la source
Haskell, 79 octets
Essayez-le en ligne!
la source
Rubis ,
7368 octetsEssayez-le en ligne!
Comment?
a
etb
contient tous les éléments deb
, mais dans le même ordre que nous les trouverions dansa
b
et sur l'intersection en parallèle, dès que nous trouvons une différence, nous pouvons déplacer un seul élément.a
la position de l'élément dans lequel nous avons trouvéb
, puis en supprimant l'élément que nous avons trouvé dans l'intersection, puis en ajoutant le reste de a.b
soient dans le bon ordrea
la source
0while
?Python 2 ,
124109106 1069996 octetsEssayez-le en ligne!
la source
Perl 6 , 40 octets
Essayez-le en ligne!
Bloc de code anonyme qui prend le curry d'entrée (comme
f(subList)(masterList)
, et trouve la première permutation lexographique des index de la liste principale où les éléments de la sous-liste sont dans le bon ordre.Intuitivement, la première permutation satisfaisante laissera les éléments correctement ordonnés dans l'ordre d'origine, tout en déplaçant ceux mal placés la distance minimale nécessaire vers l'avant afin de les avoir dans l'ordre correct, ce qui les place directement après l'élément précédent dans le sous-ensemble.
Explication:
la source
Gelée , 9 octets
Essayez-le en ligne! ou Suite de tests
Inefficace, en particulier avec de grandes listes principales. Génère toutes les permutations possibles, filtre celles dont le sous-ensemble est dans le mauvais ordre, puis renvoie la première.
Explication
la source
J , 49 octets
Essayez-le en ligne!
explication
Nous prenons le sous-ensemble comme argument gauche et l'entrée complète comme droite.
Nous allons travailler sur le code avec un exemple spécifique pour plus de clarté:
Prenez les infixes encadrés de taille deux du sous-ensemble:
produisant:
ajoutez-les à l'entrée d'origine et inversez le tout:
On a:
La résolution du problème devient une réduction de droite à gauche sur ce qui précède. Il suffit de trouver le bon verbe à insérer
/
entre les éléments.Chaque itération de la réduction mettra à jour la case la plus à droite (l'entrée complète, que nous transformons) afin qu'elle soit conforme à la contrainte de commande représentée par la paire à sa gauche. Une fois la réduction terminée, l'entrée respectera l'ordre de sous-ensemble complet.
Si l'ordre de la paire est le même que l'ordre dans l'entrée, ce qui suit sera évalué à 0 et nous ne ferons rien:
Sinon, il sera évalué à 1 et nous appliquerons le verbe à gauche de
^:
qui déplace l'élément gauche vers la droite de l'élément droit. Ce mouvement est simplement une permutation cyclique de tous les éléments entre (et y compris) les deux éléments en question.
J a primitif pour appliquer une telle permutation cyclique:
et le reste du verbe ne fait que sélectionner les index dont nous avons besoin pour faire un cycle:
ce qui semble plus long qu'il ne devrait l'être, mais je n'ai pas pu jouer plus loin cette phrase.
Enfin, nous rebox le résultat
<@
et nous avons terminé.la source
Gelée , 24 octets
Essayez-le en ligne! ou Suite de tests
Explication
Un lien dyadique qui prend le sous-ensemble comme gauche et la liste principale comme arguments de droite. L'exemple ci-dessous utilise 9001, 42, 69, 1337, 420, 99, 255 comme maître et 69, 9001, 1337 comme sous-ensemble.
la source
C # (Visual C # Interactive Compiler) , 118 octets
Essayez-le en ligne!
Tirer parti de certaines classes de l'
System.Collections.Generic
espace de noms. Le maître est unList<T>
et le sous-ensemble est unQueue<T>
.la source