Sammle und platziere Gegenstände

13

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 Twahr und Ffalsch ist):

Bildbeschreibung hier eingeben

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,5und die Reihenfolge der nicht ausgewählten Elemente muss sein 2,3,6,7)!

Bildbeschreibung hier eingeben

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 7Kästchen, sodass die ausgewählten Elemente vor dem Kästchen eingefügt werden sollten 7.

Bildbeschreibung hier eingeben

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:

  1. 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).
  2. 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.
  3. 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 ist ending_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.

helloworld922
quelle
Kann die Eingabe und Ausgabe wie "1 2 3", "1 0 0", 1 "sein?
Betseg
Ja, alles, was zwei endlich geordnete Ganzzahlsequenzen und einen Ganzzahlindex in darstellt, ist in Ordnung.
helloworld922
Enthält das erste Array negative Elemente oder Null?
Undichte Nonne
Ich möchte nein sagen, aber ich bin auch gespannt, welche Lösung Sie haben, die dies erfordert. Sie können also davon ausgehen, dass die erste Liste nur positive Ganzzahlen enthält.
helloworld922
@ PeterTaylor Nr. Ich habe es so gefixt, dass es "Eine Liste wahrer / falscher Werte ..." lautet. Gibt es einen guten Namen, um den "Typ" wahrer / falscher Werte zu beschreiben? Boolesche?
helloworld922

Antworten:

10

MATL, 9 Bytes

&)i:&)bwv

Diese Lösung akzeptiert ein Array von T(true) und F(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

    % Implicitly grab the first two inputs
&)  % Index into the first array using the boolean, places two items on the stack:
    % 1) The values where the boolean is TRUE and 2) the values where it is FALSE.
i   % Explicitly grab the third input (N)
:   % Create an array from 1...N
&)  % Index into the FALSE group using this array as an index. Puts two items on the stack:
    % 1) The first N elements of the FALSE group and 2) other members of the FALSE group
b   % Bubble the TRUE members up to the top of the stack
w   % Flip the top two stack elements to get things in the right order
v   % Vertically concatenate all arrays on the stack
    % Implicitly display the result
Suever
quelle
5

Mathematica, 66 62 Bytes

4 Bytes von @MartinEnder gespeichert .

a=#2~Extract~Position[#3,#4>0]&;##&@@@Insert[##~a~0,##~a~1,#]&

Anonyme Funktion. Nimmt den 1-basierten Index, die Liste und die Marken als Eingabe und gibt die neu geordnete Liste als Ausgabe zurück.

LegionMammal978
quelle
3

Haskell, 70 Bytes

m%n=[e|(e,b)<-zip m n,b]
(l#s)p|(h,t)<-splitAt p$l%(not<$>s)=h++l%s++t

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:

m%n=[e|(e,b)<-zip m n,b]        -- helper function, that extracts the elements of m
                                -- with corresponding True values in n
(l#s)p                          -- l: list of values
                                   s: list of booleans
                                   p: position to insert
  |                   (not<$>s) -- negate the booleans in s
                    l%          -- extract elements of l
          splitAt p             -- split this list at index p
   (h,t)<-                      -- bind h to the part before the split
                                -- t to the part after the split
     = h++l%s++t                -- insert elements at True positions between h and t
nimi
quelle
3

JavaScript (ES6), 76 Byte

(a,b,c)=>(d=a.filter((_,i)=>!b[i]),d.splice(c,0,...a.filter((_,i)=>b[i])),d)
Neil
quelle
1

Gelee , 10 Bytes

¬+\>⁵Ḥ³oỤị

Probieren Sie es online!

Wie es funktioniert

¬+\>⁵Ḥ³oỤị  Main link.
            Arguments: x (list of Booleans), y (list of inputs), z (index)
¬           Logical NOT; invert all Booleans in x.
 +\         Take the cumulative sum.
            This replaces each entry with the number of zeroes up to that entry.
   >⁵       Compare the results with z.
            This yields 0 for the first z zeroes, 1 for all others. The behavior
            for ones is not important.
    Ḥ       Unhalve; multiply the previous resulting by 2.
     ³o     Take the element-wise logical NOT of x and the previous result.
            This replaces all but the first z zeroes in x with twos.
       Ụ    Grade up; sort the indices of the result according to the corr. values.
        ị   Retrieve the items of y at those indices.
Dennis
quelle
0

C #, 132 Bytes

int[]r(int[]a,bool[]b,int l){var x=a.Where((i,j)=>!b[j]);return x.Take(l).Concat(a.Where((i,j)=>b[j])).Concat(x.Skip(l)).ToArray();}

ungolfed:

    public static int[] r(int[] a,bool[] b,int l)
    {
        var x = a.Where((i, j) => !b[j]);
        return x.Take(l).Concat(a.Where((i, j) => b[j])).Concat(x.Skip(l)).ToArray();
    }

Verbesserungsvorschläge erwünscht.

downrep_nation
quelle
0

Python 3, 91 Bytes

def f(a,x,i):b=[c for c,z in zip(a,x)if z<1];return b[:i]+[c for c in a if(c in b)<1]+b[i:]

wo aist die Liste der Elemente / Zahlen, xist die True/FalseListe undi ist der Index.

Mehrzeilige Version für verbesserte Lesbarkeit:

def f(a,x,i):
    b=[c for c,z in zip(a,x)if z<1]
    return b[:i]+[c for c in a if(c in b)<1]+b[i:] 

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 haben 0(False ) Wert zugeordnet.

Danach, die die Liste der Elemente einen haben True|1Wert zugeordnet (die durch Prüfen bestimmt wird , die Elemente ain nicht vorhanden sind b: [c for c in a if(c in b)<1]) wird in die Liste mit allen Elementen eingesetzt , die einen haben 0( False) Wert zugeordnet (list b) bei der angegebenen Index iund die resultierende Liste wird zurückgegeben.

Ioannes
quelle
0

Python 3, 106 93 Bytes

def f(x,y,z):
 t,f=[],[]
 for n in range(len(x)):(f,t)[y[n]].append(x[n])
 f[z:z]=t
 return f

Ältere Version:

def f(x,y,z):
 t,f=[],[]
 for n in range(len(x)):
  if y[n]:t+=[x[n]]
  else:f+=[x[n]]
 f[z:z]=t
 return f
Daniel
quelle