Hintergrund
Heutzutage können Programmierer ihre Puffer nicht gerade halten! Eine häufige Fehlerquelle ist der Versuch, einen Array-Index zu verwenden, der für den Puffer zu groß ist. Ihre Aufgabe ist es, einen Puffer zu implementieren, in dem große Indizes auf eine Größe reduziert werden, die der Puffer verarbeiten kann. Da ich genau entscheide, was für jeden das Beste ist, implementieren Sie diesen Puffer nach meinen genauen Spezifikationen.
Überblick
Sie haben einen Puffer nur zum Einfügen, der größer wird, wenn Elemente hinzugefügt werden. Der Puffer ist nullindexiert und auch modulo seiner aktuellen Größe indexiert . Die Sonderregel für diese Herausforderung lautet:
- So fügen Sie ein Element am Index i bedeuten , zu berechnen , j ,
j = i % buffer.length()
und setzen Sie das neue Element nach dem j - ten Elemente in der Liste.
Der einzige Sonderfall ist, wenn der Puffer leer ist, da das arithmetische Modulo Null nicht funktioniert. Wenn der Puffer derzeit leer ist, erhält das neue Element den Index 0 .
Wenn der Puffer nur ein Element enthält, wird immer nach dem 0. Element eingefügt . Dies ist nur ein Beispiel für den allgemeinen Fall.
Wenn der Puffer 6 Elemente enthält: [4, 9, 14, 8, 5, 2]
und Sie aufgefordert werden, ein neues Element 10
bei Index 15 einzufügen , finden Sie das 15 % 6 == 3
und fügen Sie das Neue 10
nach dem 8
bei Index 3 ein , was einen resultierenden Puffer von ergibt [4, 9, 14, 8, 10, 5, 2]
Problem
Schreiben Sie eine Funktion oder ein Programm, das eine geordnete Liste positiver Ganzzahlen und positive Ganzzahlindizes zum Einfügen enthält.
Beginnen Sie mit einem leeren Puffer und fügen Sie die angegebenen Ganzzahlen an den entsprechenden Indizes zum Puffer hinzu.
Gibt die geordnete Liste der Ganzzahlen aus, die sich im Puffer befinden, nachdem alle angegebenen Einfügungen vorgenommen wurden.
Dies ist eine Code-Golf-Herausforderung, also gewinnt der kürzeste Code.
Eingaberichtlinien
Sie können die Eingabelisten nach Belieben übernehmen. Beispiele:
- Liste der Paare:
[ [1,1], [2,4], [3,9], [4,16], [5,25]...]
- Artikelliste und Indexliste:
[1, 2, 3, 4, 5...], [1, 4, 9, 16, 25]
- Abgeflacht:
[1, 1, 2, 4, 3, 9, 4, 16, 5, 25 ...]
- etc.
Sie können davon ausgehen, dass die Eingabe immer mindestens ein Element und einen entsprechenden Index enthält.
Testfälle
Quadrate von oben:
[(1, 1), (2, 4), (3, 9), (4, 16), (5, 25), (6, 36), (7, 49), (8, 64)] -> [1, 2, 8, 7, 6, 5, 4, 3]
Ich habe diese zufällig generiert:
[(11, 9), (13, 14)] -> [11, 13]
[(1, 18), (11, 7), (3, 35), (16, 22)] -> [1, 11, 16, 3]
[(3, 16), (16, 37), (0, 28), (18, 24)] -> [3, 18, 0, 16]
[(7, 26), (8, 20), (11, 39), (1, 23), (17, 27)] -> [7, 8, 11, 1, 17]
[(15, 35), (17, 7), (16, 15), (1, 13), (2, 6), (11, 34)] -> [15, 17, 1, 2, 16, 11]
[(2, 13), (1, 20), (16, 25), (8, 21), (5, 2), (16, 37), (3, 0)] -> [2, 3, 8, 1, 16, 5, 16]
[(6, 20), (15, 15), (12, 26), (10, 27), (17, 13), (7, 18), (4, 16)] -> [6, 10, 17, 12, 7, 4, 15]
[(18, 9), (5, 34), (15, 4), (12, 29), (2, 5), (7, 0), (7, 10), (16, 38)] -> [18, 7, 15, 2, 16, 5, 7, 12]
[(0, 12), (12, 0), (4, 16), (15, 12), (6, 28), (8, 10), (11, 24), (0, 25)] -> [0, 11, 8, 6, 15, 0, 4, 12]
[(6, 12), (14, 13), (10, 33), (11, 35), (1, 3), (0, 28), (15, 27), (8, 10), (1, 2)] -> [6, 14, 10, 1, 11, 8, 15, 0, 1]
[(2, 29), (19, 30), (18, 17), (13, 3), (0, 21), (19, 19), (11, 13), (12, 31), (3, 25)] -> [2, 13, 3, 11, 0, 12, 19, 18, 19]
Python3-Referenzimplementierung
def f(inputs):
# `inputs` is a list of pairs
buff = []
for item, index in inputs:
if len(buff) == 0:
buff.insert(0, item)
else:
insert_after = index % len(buff)
buff.insert(insert_after+1, item)
return buff
Antworten:
MATL ,
2422 BytesEingabe ist eine Matrix (mit
;
als Zeilentrennzeichen), die die Werte in der ersten Zeile und die Indizes in der zweiten Zeile enthält.Die Ausgabe ist ein Spaltenarray, das als durch Zeilenumbrüche getrennte Zahlen angezeigt wird.
Probieren Sie es online! Oder überprüfen Sie alle Testfälle , wobei jedes Ergebnis in einer einzelnen Zeile angezeigt wird.
Erläuterung
quelle
Perl, 37 Bytes
35 Byte Code + 2 Byte für
-lp
Flags.Probieren Sie es online!
Die Implementierung ist recht einfach,
splice
fügt das Array@F
am Index ein1+<>%(@F||1)
(Anmerkung,@F||1
die den Fall behandelt , dass das Array leer ist).Nur ein paar Worte zu den (scheinbar) unübertroffenen Klammern
}{
(weil ich einen Kommentar dazu hatte und ich denke, es ist ziemlich seltsam für Leute, die Perl nicht kennen), und es ist ein ganz normaler Trick in Perl-Golfspielen:-p
Flag umgibt den Code mit (ungefähr)while(<>){ CODE } continue { print }
, (continue
wird nach jeder Iteration ausgeführt). Wenn diese nicht übereinstimmen}{
, ändere ich meinen Code inwhile(<>) { CODE}{ } continue { print }
. Es wird also ein leerer Block direkt nach meinem Code erstellt (aber das ist kein Problem), und dercontinue
wird nur einmal ausgeführt, nach demwhile
(dh wenn alle Eingaben gelesen wurden).quelle
}{
macht mich verrückt ...}{
erinnert mich an diese IllusionES6 (Javascript),
58,57,5350 BytesGolf gespielt
Nimmt ein Array von Index-Wert-Paaren als Eingabe.
EDITS
&&
, um den Wert -1 Byte zurückzugeben|0
(da Spleiß offenbar mit NaN gut umgehen kann), -2 Bytesb=[]
ein zweites "Argument" für map () , -2 Bytes (Thx @ETHproductions!)Prüfung
quelle
a=>a.map(e=>...,b=[])&&b
e=>
,(e,i)=>
indem Siei
anstelle vonb.length
Haskell ,
7069 BytesProbieren Sie es online! Verbrauch:
foldl(!)[] [(1,5),(2,4),(3,7)]
. Dank @nimi ein Byte gespart!Erläuterung:
Lösung ohne Berechnung des Moduls: (90 Bytes)
Probieren Sie es online!
quelle
j<-1+i`mod`length b
Speichert ein Byte.Python 2 ,
64625856 BytesVielen Dank an @xnor für das Golfen mit 2 Bytes!
Probieren Sie es online!
quelle
(len(x)or 1)
anstatt die Länge zu initialisieren?len(x or[0])
und-~len(x[1:])
Krawatte.Python 2 ,
6260 BytesNimmt die Eingabe als eine Liste von Paaren, druckt das Ergebnis. Edit: Outgolfed von Dennis
Probieren Sie es online!
Dies ist ganz einfach: Durchlaufen Sie die Eingabe, fügen Sie die Elemente an der richtigen Stelle ein und drucken Sie das Ergebnis aus. Die Entscheidung, in welchen Index eingefügt werden soll, erfolgt mit
1+y%(len(b)or 1)
. Dies ist die Standardmethode für die modulare Indizierung, bei deror 1
der Randfall einer leeren Liste behandelt wird.quelle
JavaScript (ES6), 60 Byte
Testschnipsel
Code-Snippet anzeigen
quelle
V ,
384035 BytesDiese Antwort beugt sich die Definition der Liste, und ist normalerweise nicht eine Sprache , die Sie für die Liste Manipulation verwenden würde, aber ich wollte verwenden ,
[count]/{regex}
die ich vor kurzem V. hinzugefügt Der Eingang wie genommen[index] [num] [index] [num] ...
und kehrte wie[num] [num] [num]
.Probieren Sie es online!
Hexdump für 2 versteckte Zeichen:
Erläuterung
Der Code bis
dG@"
formatiert alle\d+ \d+
Paare so, dass eine Liste 1 2 3 4 5 6 wie folgt enden würdeund dann
dG@"
führt das alles als V-Code wie folgt aus:quelle
PHP,
7292 BytesNimmt Eingaben, die von Befehlszeilenargumenten abgeflacht wurden. Laufen Sie mit
-nr
.quelle
Fatal error: Uncaught DivisionByZeroError: Modulo by zero
1 1 1 2 1 3
[1=>null]
[1,3,2]
j+1
anstatt danach einzufügenj
, nein?18 1 7 11 35 3 22 16
=>[1,11,16]
anstatt[1,11,16,3]
insert
Keyword verpasst . Vielen Dank; Fest.Java 7,
125124 BytesAkzeptiert eine flache Liste von Werten, gefolgt von Indizes. Für den Quadrattestfall wäre die Eingabe
new int[] {1, 2, 3, 4, 5, 6, 7, 8, 1, 4, 9, 16, 25, 36, 49, 64}
Probieren Sie es online!
quelle
Mathematica, 62 Bytes
Reine Funktion, wobei als erstes Argument
#
eine Liste von Paaren erwartet wird. Beginnen Sie mit der leeren Liste{}
und verlassen SieFold
die Eingabeliste#
mit der folgenden Funktion:quelle
Perl 6 , 51 Bytes
Nimmt die abgeflachte Eingabe auf.
quelle
Clojure, 87 Bytes
quelle