Ein einfacher Start in die Woche! Sie erhalten drei Arrays: das Basis-Array B
, das Wert-Array V
und das Index-Array I
. Sie sollten ein anderes Array erzeugen, in das die Werte von an den durch angegebenen Indizes V
eingefügt B
werden I
. Hier ist ein Beispiel:
Base: [5, 1, 4, 1, 3]
Values: [0, 0, 7]
Indices: [5, 0, 3]
Die Indizes zeigen auf folgende Positionen im Basisarray:
[ 5, 1, 4, 1, 3 ]
^ ^ ^
0 3 5
Wenn Sie also die entsprechenden Elemente aus dem Wertearray einfügen, sollte das Ergebnis sein:
[0, 5, 1, 4, 7, 1, 3, 0]
Regeln
Sie können ein Programm oder eine Funktion schreiben, Eingaben über STDIN (oder die nächstgelegene Alternative), Befehlszeilenargumente oder Funktionsargumente vornehmen und das Ergebnis über STDOUT (oder die nächstgelegene Alternative), Funktionsrückgabewert oder durch Ändern des als B
Parameter angegebenen Arrays ausgeben .
Wenn es sich bei Ihrer Einreichung um eine Funktion handelt, die auf irgendeine Weise geändert werden kann I
und nicht für die Ausgabe verwendet wird.V
B
Sie können die folgenden Annahmen bezüglich der Eingabe treffen:
- Alle Elemente des Basis- und Wertearrays sind nicht negative Ganzzahlen.
- Das Wertearray enthält höchstens ein Element mehr als das Basisarray.
- Das Wertearray und das Indexarray haben die gleiche Anzahl von Elementen.
- Das Index-Array enthält keine wiederholten Indizes, und alle Indizes befinden sich im Bereich.
- Die Basis- und Wertearrays können wiederholte Elemente enthalten.
- Einige oder alle Arrays sind möglicherweise leer.
- Sie dürfen nicht davon ausgehen, dass die Indizes in einer bestimmten Reihenfolge angegeben sind.
- Sie können Eingaben empfangen und Ausgaben in jedem geeigneten, eindeutigen Zeichenfolgen- oder Listenformat erstellen. Sie können die drei Arrays auch in einer anderen Reihenfolge erhalten.
- Sie können zwischen 0-basierter und 1-basierter Indizierung wählen.
Dies ist Codegolf, daher gewinnt die kürzeste Antwort (in Bytes).
Testfälle
Wird im Format B V I => Result
für die 0-basierte Indizierung angegeben. Wenn Sie eine 1-basierte Indizierung verwenden, erhöhen Sie die Elemente des dritten Arrays um 1.
[] [] [] => []
[] [1] [0] => [1]
[1,2] [] [] => [1,2]
[1,2] [3] [0] => [3,1,2]
[1,2] [3] [1] => [1,3,2]
[1,2] [3] [2] => [1,2,3]
[0,0,0] [1,1,1,1] [0,1,2,3] => [1,0,1,0,1,0,1]
[5,1,4,1,3] [0,0,7] [5,0,3] => [0,5,1,4,7,1,3,0]
[1,2,3,4] [4,3,2,1] [4,0,3,1] => [3,1,1,2,3,2,4,4]
Lassen Sie mich wissen, wenn Sie auf andere interessante Randfälle stoßen, und ich werde sie hinzufügen.
Bestenliste
Hier ist ein Stack-Snippet, um sowohl eine reguläre Rangliste als auch eine Übersicht der Gewinner nach Sprache zu erstellen.
Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:
# Language Name, N bytes
Wo N
ist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:
# Ruby, <s>104</s> <s>101</s> 96 bytes
quelle
NULL
einem leeren Array für Sprachen, in denen ein leeres Array vorhanden istNULL
?Antworten:
Pyth, 14 Bytes
Demonstration.
Dieses Programm nimmt die Eingaben als 3-Tupel-Listen in der Reihenfolge Basis, Indizes, Werte.
Erklärung zum Beispiel
[5, 1, 4, 1, 3], [5, 0, 3], [0, 0, 7]
:Nehmen Sie die Eingabe: implizit ist Q die Eingabe.
Machen Sie den Index, Wertepaare:
CtQ
=[(5, 0), (0, 0), (3, 7)]
Sortieren Sie die Paare in aufsteigender Reihenfolge:
SCtQ
=[(0, 0), (3, 7), (5, 0)]
Nimm den Wert aus jedem Paar:
medSCtQ
=[0, 7, 0]
Teilen Sie die Basisliste am Ort der Angaben auf:
cFPQ
=[[], [5, 1, 4], [1, 3], []]
Interleave 3 und 4:
.icFPQmedSCtQ
=[[], 0, [5, 1, 4], 7, [1, 3], 0, []]
In einer Liste zusammenfassen:
s.icFPQmedSCtQ
=[0, 5, 1, 4, 7, 1, 3, 0]
quelle
ssC,cFPQamedSCtQ]
.Python 2, 54
Übernimmt die Eingabe als
B,I,V
. Ändert die Eingabe,B
wenn sie aufgerufen wird (danke an Martin Büttner, der mich daran erinnert hat, dass dies möglich ist).Verwendet
map
, umB.insert
jedes Index / Element-Paar aufzurufen . Um zu vermeiden, dass sich die Listenindizes beim Einfügen von Elementen verschieben, sortieren Sie die Paare in absteigender Reihenfolge des Indexes durch hässliches Zippen / Sortieren / Entpacken. Wenn das Problem der Verlagerung nicht wäre, könnten wir es einfach tunmap(B.insert,*X)
.Alte Methode (65):
quelle
Haskell, 62 Bytes
Anwendungsbeispiel:
f [5,1,4,1,3] [0,0,7] [5,0,3]
->[0,5,1,4,7,1,3,0]
.So funktioniert es: Ergänzen Sie die Basisliste mit "anderthalb" -Indizes, die bei
0.5
(z. B.[(0.5,5),(1.5,1),(2.5,4),(3.5,1),(4.5,3)]
) beginnen, und verknüpfen Sie sie mit den Index-Wert-Paaren. Sortieren und verwerfen Sie den Index.Bemerkung : Ich weiß nicht, ob ich hier betrüge. Aus mathematischer Sicht ist es in Ordnung, aber ein Programmierer könnte argumentieren, dass die Liste der Indizes
[5,0,3]
keine Liste derIntegers
angeforderten Indizes ist , sondern eine Liste der IndizesFractionals
(um genau zu sein, der Typ ist polymorph, muss aber zurFractional
Klasse gehören, z. B.Float
oderDouble
).quelle
Ruby,
605953 BytesUnd die ungolfed version
quelle
->a,b,c{...}
. Es besteht auch die Möglichkeit,insert
dass keine Klammern erforderlich sind.CJam,
342318 BytesMein erster CJam-Beitrag. Tipps sind willkommen, ich bin mir sicher, dass Golf viel zu bieten hat.
16 Bytes mit Hilfe von @ MartinBüttner und @Dennis gespeichert.
Die Funktion erwartet die Eingabe auf dem Stapel in der angegebenen Reihenfolge
B V I
(I ist die oberste).Anwendungsbeispiel:
Methode:
i
dritte Element des Arrays miti+0.5
quelle
q~.5fm.\2/\ee+$1f=p
Mit einer anonymen Funktion können Sie bis zu 19 Bytes mit und bis zu 18 Bytes erreichen:{.5fm.\2/\ee+$1f=}
{.\2/\ee+{0=}$1f=}
(immer noch 18 Bytes)get array element
Operator für nicht finden1f=
. Ich werde es jedoch als vollständiges Programm belassen.K,
22-21BytesWir definieren eine 3 Argumentfunktion
{…}
mit den impliziten Variablenx
,y
undz
die die Startliste, die Werteliste und die Indexliste, respectively. Der "cut" -Operator (_
) wird verwendet, um die Startliste an der sortierten Liste gegebener Indizes ((z@<z)
) aufzuteilen . Wir verschachteln Werte (nachdem wir sie entsprechend sortiert haben) mit den aufgeteilten Teilen des ursprünglichen Arrays, indem wir eine Liste bilden ((a;b)
), deren Transponierung nehmen (+
) und das Ergebnis abflachen (,//
).Anwendungsbeispiel:
Leerzeichen um den Unterstrich sind erforderlich, da K Unterstriche in Bezeichnern zulässt. K5 beseitigt diese potenzielle Mehrdeutigkeit. Wenn wir auf die aufsteigenden Indizes zählen könnten und Unterstriche keine gültigen Bezeichner wären, könnten wir das viel schönere 13-Byte-Programm verwenden:
(Seufzer.)
bearbeiten:
Bricht die Symmetrie, aber wir können ein Byte speichern, indem wir Bracket-Indexing (
[…]
) anstelle des Infix-@
Indexing-Operators verwenden. Normalerweise werden Programme dadurch länger, aber in diesem Fall mussten die Pars trotzdem sortiert werden,z
bevor der Schnitt ausgeführt werden konnte.quelle
Pyth, 17 Bytes
@isaacg hat meine Lösung schon geschlagen. Aber da ich meine Dokumentation fertig hatte, werde ich sie trotzdem posten.
Dies übernimmt die Eingabe im Format
B, I, V
. Sie können es hier ausprobieren: Demonstration oder Test SuiteErläuterung:
Ich verwende das Beispiel
B = [5,1,4,1,3], I = [5,0,3], V = [0,0,7]
aus dem OP.quelle
JavaScript (ES6), 75
Eine Funktion mit 3 Array-Parametern, die ein Array zurückgibt. Seltsamerweise ändert diese Funktion ihren
i
Parameter (wie freundlicherweise von OP erlaubt)Testen Sie das Snippet, Firefox nur wie gewohnt.
quelle
fat arrow function
ist auch in der Entwicklerversion von Chrome (AFAIK) nicht implementiertMathematica,
5251 BytesBeispiel:
Erläuterung:
Im obigen Beispiel.
Tr@#2->#&~MapIndexed~#
=>{1 -> 5, 2 -> 1, 3 -> 4, 4 -> 1, 5 -> 3}
Thread[#3+.5->#2]
=>{5.5 -> 0, 0.5 -> 0, 3.5 -> 7}
{0.5 -> 0, 1 -> 5, 2 -> 1, 3 -> 4, 3.5 -> 7, 4 -> 1, 5 -> 3, 5.5 -> 0}
){0, 5, 1, 4, 7, 1, 3, 0}
)quelle
CJam,
3029 BytesDas ist zu lang. Ich habe das Gefühl, dass dies keine Vorlage für eine Golfsprache ist: |
Probieren Sie es hier online aus
quelle
R, 75 Bytes
Dies erzeugt eine unbenannte Funktion. Um es zu nennen, geben Sie ihm einen Namen, z
f=function...
. Beachten Sie, dass die Arrays 1-indiziert sein müssen, da R genau so rollt.Ungolfed + Erklärung:
Beispiele:
Vorschläge sind wie immer willkommen!
quelle
CJam, 19 Bytes
Dies ist ein vollständiges Programm, das die Arrays B , I und V liest (eines pro Zeile in dieser Reihenfolge) aus STDIN liest.
Probieren Sie es online im CJam-Interpreter aus .
Wie es funktioniert
CJam, 20 Bytes
Dies ist eine anonyme Funktion, die B , V anzeigt und I (von oben nach unten) aus dem Stapel entfernt und im Gegenzug ein einzelnes Array auf dem Stapel belässt.
Probieren Sie es online in der CJam-Interpreter aus .
Wie es funktioniert
quelle
Ruby, 48 Bytes
Ich denke, dies entspricht den Regeln, aber bitte überprüfen Sie.
Unbenannte Funktion, die die drei Arrays als Eingabe verwendet. Gibt einen String aus, der mit dem Ruby-Ausdruck eindeutig in ein Array von Zahlen zerlegt werden kann
x.split(/:+/).map(&:to_i)
.Testfälle auf ideone .
Ich könnte 3 weitere Bytes einsparen, aber das Ausgabeformat
[1,2,[nil,5]]
dehnt die Regeln ein bisschen zu sehr aus, obwohl es eindeutig ist.quelle
nil
Werten sind etwas gedehnt. Aber in beiden Fällen gewinnt dies den Wettbewerb nicht, so dass ich mir darüber auch keine Sorgen mache.R 60
Als unbenannte Funktion, die b, v und i nimmt
Erweitert b mit NAs Füllt die erforderlichen Lücken mit v Gibt den Vektor ohne NAs zurück
quelle
Java,
253, 226, 219,209nicht gerade ein Gewinner, aber na ja.
Angenommen, B, V und ich sind nicht null. v (Kleinbuchstabe v) ist die Länge der Values / Indicies-Arrays. R ist das zurückgegebene Array. r ist die Länge des zurückgegebenen Arrays. x, y und ich sind alle temporäre ints.
erweitert:
quelle
APL, 22 Bytes
In ⎕IO ← 0, um die Testfälle abzugleichen.
Es ist ein Standardalgorithmus: Der Indexvektor des ersten Arguments wird an die angegebenen Indizes angehängt (3. Argument).
⍋
berechnet die Permutation, die die Indizes in aufsteigender Reihenfolge sortieren würde. Da der Sortieralgorithmus von APL per Definition stabil ist, setzt die berechnete Permutation das Element der Verkettung des zweiten und ersten Arguments an die richtige Stelle.Zum Beispiel :
quelle