Ich hatte kürzlich ein Problem bei der Arbeit zu lösen, bei dem ich zwei Listen hatte: eine Hauptliste und eine kleinere Liste, die eine Teilmenge der Elemente in der Hauptliste möglicherweise in einer anderen Reihenfolge enthält. Ich musste die Hauptliste so neu anordnen, dass die Elemente in der Teilmenge in derselben Reihenfolge angezeigt wurden, ohne die Reihenfolge der nicht in der Liste gefundenen Elemente zu ändern, und die Elemente nach Möglichkeit an derselben Stelle aufbewahren. Okay, das klingt wahrscheinlich verwirrend, also werde ich es aufschlüsseln:
- Die Hauptliste definiert die Standardreihenfolge der Elemente.
- Die Teilmengenliste definiert die relative Reihenfolge bestimmter Elemente.
- Wenn die Hauptliste zwei Elemente enthält, die gemäß der Teilmengenliste nicht in der richtigen Reihenfolge sind, sollte das Element, das sich früher in der Hauptliste befindet, in den frühesten Index verschoben werden, in dem es sich relativ zu anderen Elementen in der Teilmengenliste an der richtigen Stelle befindet. (dh unmittelbar nach dem späteren Punkt)
Ihre Aufgabe ist es, diesen Neuordnungsalgorithmus zu implementieren.
Beispiel Testfälle
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]
Regeln
- Standard Schlupflöcher, Yadda Yadda, bequeme I / O, bla bla.
- Obwohl in den Beispielen Zahlen und Zeichenfolgen verwendet werden, müssen Sie nur einen Elementtyp unterstützen, unabhängig davon, ob es sich um Ganzzahlen, Zeichenfolgen oder andere Elemente mit genau definierter Gleichheitssemantik handelt, einschließlich heterogener Listen, sofern dies in Ihrer Sprache sinnvoll ist.
- Sie können davon ausgehen, dass sowohl die Master-Liste als auch die Subset-Liste keine Duplikate enthalten
- Sie können davon ausgehen, dass sich alle in der Teilmengenliste gefundenen Elemente in der Masterliste befinden
- Jede Liste kann leer sein
- Sie müssen mindestens Arrays mit einer Länge von bis zu 100 Elementen unterstützen.
- Die Neuordnung kann vor Ort oder durch die Erstellung einer neuen Liste / eines neuen Arrays implementiert werden.
Viel Spaß beim Golfen!
code-golf
array-manipulation
Beefster
quelle
quelle
8 1 3 4 5 6 7 2 9 12 11 10
eine gültige Lösung für die vorletzte?Antworten:
Retina 0,8,2 , 51 Bytes
Probieren Sie es online! Übernimmt die Eingabe als durch Kommas getrennte Liste von Unterwörtern in der ersten Zeile und als durch Kommas getrennte Hauptliste von Wörtern in der zweiten Zeile. Erläuterung:
Finden Sie zwei benachbarte Unterwörter, wobei das zweite Wort dem ersten in der Hauptliste vorausgeht.
Bewegen Sie das zweite Wort nach dem ersten Wort in der Hauptliste.
Wiederholen, bis keine Wörter mehr in der falschen Reihenfolge angezeigt werden.
Löschen Sie die Unterwörter.
quelle
JavaScript (ES6),
96 89 7471 ByteDies begann als sperriges Durcheinander und wurde schließlich zu einer ziemlich prägnanten und eleganten Form geschrumpft. Ich möchte mich bei der .splice () -Methode für die fruchtbare Zusammenarbeit bedanken . ;)
Übernimmt die Eingabe als
(master)(subset)
. Ausgaben durch Aktualisierung der Masterliste.Probieren Sie es online!
Wie?
Kommentiert
quelle
Haskell, 79 Bytes
Probieren Sie es online!
quelle
Ruby ,
7368 BytesProbieren Sie es online!
Wie?
a
undb
enthält alle Elemente vonb
, jedoch in derselben Reihenfolge, in der wir sie finden würdena
b
parallel auf und an der Kreuzung iterieren , können wir ein einzelnes Element verschieben, sobald wir einen Unterschied feststellen.a
der Position des Elements, in dem wir gefunden habenb
, Entfernen des Elements, das wir in der Schnittmenge gefunden haben, und Hinzufügen des Restes von a.b
in der richtigen Reihenfolge sinda
quelle
0while
?Python 2 ,
1241091069996 BytesProbieren Sie es online!
quelle
Perl 6 , 40 Bytes
Probieren Sie es online!
Anonymer Codeblock, der die Eingabe als Curry
f(subList)(masterList)
akzeptiert ( und die erste lexografische Permutation der Indizes der Master-Liste findet, in der sich die Elemente aus der Unterliste in der richtigen Reihenfolge befinden).Intuitiv belässt die erste zufriedenstellende Permutation die richtig angeordneten Elemente in der ursprünglichen Reihenfolge, während die falsch angeordneten Elemente um den minimal erforderlichen Abstand nach vorne verschoben werden, um sie in der richtigen Reihenfolge zu haben, wodurch sie direkt nach dem vorherigen Element in der Teilmenge platziert werden.
Erläuterung:
quelle
Gelee , 9 Bytes
Probieren Sie es online! oder Testsuite
Ineffizient, insbesondere bei großen Masterlisten. Generiert alle möglichen Permutationen, filtert diejenigen heraus, bei denen sich die Teilmenge in der falschen Reihenfolge befindet, und gibt dann die erste zurück.
Erläuterung
quelle
J , 49 Bytes
Probieren Sie es online!
Erläuterung
Wir nehmen die Teilmenge als linkes Argument und die volle Eingabe als rechtes.
Der Übersichtlichkeit halber werden wir den Code anhand eines speziellen Beispiels durcharbeiten:
Nehmen Sie die boxed Infixes der Größe zwei der Teilmenge:
produzieren:
Hänge sie an die ursprüngliche Eingabe an und kehre das Ganze um:
Wir bekommen:
Die Lösung des Problems führt zu einer Reduzierung von rechts nach links. Wir müssen nur das richtige Verb finden, um es
/
zwischen die Elemente einzufügen .Bei jeder Iteration der Verkleinerung wird das Feld ganz rechts (die vollständige Eingabe, die wir transformieren) aktualisiert, sodass es der durch das Paar auf der linken Seite dargestellten Ordnungsbeschränkung entspricht. Wenn die Reduzierung abgeschlossen ist, berücksichtigt die Eingabe die vollständige Teilmengenreihenfolge.
Wenn die Reihenfolge des Paares mit der Reihenfolge in der Eingabe übereinstimmt, wird Folgendes mit 0 ausgewertet, und es wird nichts unternommen:
Andernfalls wird 1 ausgewertet und das Verb links von angewendet
^:
Das verschiebt das linke Element nach rechts vom rechten Element. Diese Bewegung ist einfach eine zyklische Permutation aller Elemente zwischen (und einschließlich) den zwei fraglichen Elementen.
J hat eine Grundform, um eine solche zyklische Permutation anzuwenden:
und der Rest des Verbs tut nichts anderes, als die Indizes auszuwählen, die wir zum Durchlaufen benötigen:
Das scheint länger zu sein, als es sein sollte, aber ich war nicht in der Lage, diesen Satz weiter zu spielen.
Schließlich packen wir das Ergebnis neu
<@
und wir sind fertig.quelle
Gelee , 24 Bytes
Probieren Sie es online! oder Testsuite
Erläuterung
Eine dyadische Verknüpfung, die die Teilmenge als linkes und die Hauptliste als rechtes Argument verwendet. Im folgenden Beispiel werden 9001, 42, 69, 1337, 420, 99, 255 als Master und 69, 9001, 1337 als Teilmenge verwendet.
quelle
C # (Visual C # Interactive Compiler) , 118 Byte
Probieren Sie es online!
Nutzung einiger Klassen im
System.Collections.Generic
Namespace. Der Master ist aList<T>
und die Teilmenge ist aQueue<T>
.quelle