Ziel dieser Herausforderung ist es, ausgewählte Elemente in einer Liste zu sammeln und an eine bestimmte Stelle in der Liste zu verschieben.
Nehmen Sie als visuelles Beispiel die Eingabewerte (dargestellt durch Ganzzahlen mit schwarzen Kästchen) und eine entsprechende Liste von Wahrheitswerten, wobei wahr bedeutet, dass das Element ausgewählt ist (dargestellt durch blaue Kästchen, wobei T
wahr und F
falsch ist):
Der erste logische Schritt besteht darin, die als wahr und nicht wahr gekennzeichneten Elemente in die entsprechenden Listen zu unterteilen. Beachten Sie, dass die relative Reihenfolge in jeder Liste beibehalten werden muss (dh die Reihenfolge der ausgewählten Elemente muss 1,4,5
und die Reihenfolge der nicht ausgewählten Elemente muss sein 2,3,6,7
)!
Der zweite logische Schritt erhält einen Index in der verbleibenden Liste der nicht ausgewählten Elemente. Fügen Sie alle ausgewählten Elemente vor dem Element am angegebenen Index ein. Angenommen, die Indizierung beginnt bei 0, möchten Sie die Auswahl bei Index 3 einfügen. Dies entspricht der Stelle vor dem 7
Kästchen, sodass die ausgewählten Elemente vor dem Kästchen eingefügt werden sollten 7
.
Die endgültige Lösung ist dann 2,3,6,1,4,5,7
.
Beachten Sie, dass dieses logische Diagramm eine Möglichkeit darstellt, dies zu tun. Ihr Programm muss nicht dieselben logischen Schritte ausführen, solange die Ausgabe immer dasselbe beobachtbare Ergebnis liefert.
Eingang
Ihr Programm erhält 3 Eingaben:
- Eine Liste von Ganzzahlen, die die Elemente darstellen. Dies kann eine leere Liste sein. Diese Liste besteht immer aus eindeutigen positiven ganzen Zahlen, nicht unbedingt in sortierter Reihenfolge (dh 5 sind nicht zweimal in der Liste enthalten).
- Eine Liste von Wahrheits- / Falschwerten mit derselben Länge wie die Liste von Elementen, wobei ein Wahrheitswert angibt, dass das Element am selben Index ausgewählt wurde.
- Eine Ganzzahl, die angibt, wo die Auswahl eingefügt werden soll. Sie können den Index des ersten Elements der Liste so lange festlegen, wie er in jedem Programmlauf konstant ist (z. B. kann der erste Eintrag Index 0 oder Index 1 sein). Bitte geben Sie an, welcher Konvention Ihr Programm entspricht. Dieser Index sollte im Bereich liegen
[starting_idx, ending_idx+1]
, dh es handelt sich immer um einen gültigen Index. Für den Fallindex istending_idx+1
, sollte die Auswahl am Ende der Liste eingefügt werden. Sie können davon ausgehen, dass diese Ganzzahl in den systemeigenen Ganzzahltyp Ihrer Sprache passt.
Der Eingang kann von einer beliebigen Quelle stammen (stdio, Funktionsparameter usw.)
Ausgabe
Die Ausgabe ist eine Liste, die die endgültige Reihenfolge der Elemente darstellt. Dies kann eine beliebige Quelle sein (stdio, Rückgabewert, Funktionsausgangsparameter usw.). Sie können alle Eingaben direkt ändern (z. B. eine Liste mit Änderungsmöglichkeiten als Funktionsparameter angeben und Ihre Funktion direkt in dieser Liste ausführen lassen).
Testfälle
Alle folgenden Testfälle setzen eine 0-basierte Indizierung voraus. Ich habe 0 und 1 verwendet, um falsche / wahre Werte für die Auswahlmaske anzugeben.
Testfälle haben Listen, die formatiert sind als [a,b,c]
, aber solange Ihre Eingabelisten eine endlich geordnete Sequenz darstellen, die in Ordnung ist.
Eingang:
[]
[]
0
Ausgabe:
[]
Eingang:
[1,2,3,4,5,6,7]
[1,0,0,1,1,0,0]
3
Ausgabe:
[2,3,6,1,4,5,7]
Eingang:
[1,2,3,4,5,6,7]
[1,0,0,1,1,0,0]
0
Ausgabe:
[1,4,5,2,3,6,7]
Eingang:
[1,2,3,4,5,6,7]
[1,0,0,1,1,0,0]
4
Ausgabe:
[2,3,6,7,1,4,5]
Eingang:
[1,2,3,4,5,6,7]
[1,1,1,1,1,1,1]
0
Ausgabe:
[1,2,3,4,5,6,7]
Eingang:
[1,2,3,4,5,6,7]
[0,0,0,0,0,0,0]
5
Ausgabe:
[1,2,3,4,5,6,7]
Eingang:
[1,3,2,5,4,6]
[1,0,0,1,1,0]
3
Ausgabe:
[3,2,6,1,5,4]
Wertung
Das ist Code Golf; kürzeste Antwort in Bytes gewinnt. Standardlücken sind verboten. Sie dürfen alle gewünschten eingebauten Funktionen verwenden.
Antworten:
MATL, 9 Bytes
Diese Lösung akzeptiert ein Array von
T
(true) undF
(false) Werten als zweite Eingabe. Auch für den ersten Testfall mit leeren Arrays wird keine Ausgabe erzeugt.Probieren Sie es online! und eine leicht modifizierte Version für alle Testfälle.
Erläuterung
quelle
Mathematica,
6662 Bytes4 Bytes von @MartinEnder gespeichert .
Anonyme Funktion. Nimmt den 1-basierten Index, die Liste und die Marken als Eingabe und gibt die neu geordnete Liste als Ausgabe zurück.
quelle
Haskell, 70 Bytes
Anwendungsbeispiel:
([1,2,3,4,5,6,7]#[True,False,False,True,True,False,False]) 3
->[2,3,6,1,4,5,7]
.Wie es funktioniert:
quelle
JavaScript (ES6), 76 Byte
quelle
Gelee , 10 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
C #, 132 Bytes
ungolfed:
Verbesserungsvorschläge erwünscht.
quelle
Python 3, 91 Bytes
wo
a
ist die Liste der Elemente / Zahlen,x
ist dieTrue/False
Liste undi
ist der Index.Mehrzeilige Version für verbesserte Lesbarkeit:
Wie funktioniert es?
Der Aufruf an
zip(a,x)
Ergebnisse in einer Liste von Tupeln , wobei jedes von ihnen die Informationen enthält:(element,0|1)
. Dann wird ein Listenverständnis verwendet, um die Elemente zu bestimmen, die a haben0/False
Wert zugeordnet ist, und sie in der Variablen zu speichernb
.So
[c for c,z in zip(a,x)if z<1]
erstellt eine Liste , die alle Elemente enthält , die eine haben0
(False
) Wert zugeordnet.Danach, die die Liste der Elemente einen haben
True|1
Wert zugeordnet (die durch Prüfen bestimmt wird , die Elementea
in nicht vorhanden sindb
:[c for c in a if(c in b)<1]
) wird in die Liste mit allen Elementen eingesetzt , die einen haben0
(False
) Wert zugeordnet (listb
) bei der angegebenen Indexi
und die resultierende Liste wird zurückgegeben.quelle
Python 3,
10693 BytesÄltere Version:
quelle