Inspiriert von einer Frage bei Stack Overflow .
Berechnen Sie bei einem nicht leeren Array von Ganzzahlen x
und einer positiven Ganzzahl n
die Summe der einzelnen Gleitblöcke mit der Länge n
des Arrays x
, und füllen Sie die fehlenden Werte links zirkulär mit Werten von rechts wie folgt:
- Der erste Block enthält den ersten Eintrag von
x
, demn-1
zirkulär verschobene Einträge vorangestellt sind . - der zweite Block hat die ersten und zweiten Einträge von
x
, denenn-2
zirkulär verschobene Einträge vorausgehen ; und so weiter.
Das Ausgabearray y
hat die gleiche Größe wie x
. Es ist möglich n
, die Länge von zu überschreiten x
, und dann werden die Werte von mehrmalsx
zirkulär wiederverwendet .
Beispiele
Beispiel 1 (Werte werden nur einmal verwendet)
x = [2, 4, -3, 0, -4]
n = 3
als Ausgabe geben
y = [-2, 2, 3, 1, -7]
woher
-2
ist die Summe des Blocks[0, -4, 2]
(die ersten beiden Werte stammen aus der zirkularen Verschiebung)2
ist die Summe von[-4, 2, 4]
(der erste Wert ergibt sich aus der zirkularen Verschiebung)3
ist die Summe von[2, 4, -3]
(keine zirkuläre Verschiebung mehr notwendig)1
ist die Summe von[4, -3, 0]
-7
ist die Summe von[-3, 0, -4]
.
Beispiel 2 (Werte werden mehrfach wiederverwendet)
x = [1, 2]
n = 5
geben
y = [7, 8]
woher
7
ist die Summe des Blocks[1, 2, 1, 2, 1]
(die ersten vier Werte wurden zirkulär wiederverwendet)8
ist die Summe des Blocks[2, 1, 2, 1, 2]
(die ersten drei Werte wurden zirkulär wiederverwendet)
Zusätzliche Regeln
- Der Algorithmus sollte für Arrays beliebiger Größe und für beliebige ganzzahlige Werte funktionieren. Es ist akzeptabel, wenn das Programm durch Datentyp- oder Speicherbeschränkungen eingeschränkt ist. Es müssen jedoch sowohl positive als auch negative ganzzahlige Werte behandelt werden.
- Input / Output kann auf jede vernünftige Weise genommen / produziert werden .
- Programme oder Funktionen sind in jeder Programmiersprache zulässig . Standardlücken sind verboten.
- Kürzester Code in Bytes gewinnt.
Testfälle
x, n, -> y
[2, 4, -3, 0, -4], 3 -> [-2, 2, 3, 1, -7]
[1, 2], 5 -> [7, 8]
[2], 7 -> [14]
[-5, 4, 0, 1, 0, -10, -4], 4 -> [-19, -15, -5, 0, 5, -9, -13]
[-5, 4, 0, 1, 0, -10, -4], 1 -> [-5, 4, 0, 1, 0, -10, -4]
[-2, -1, 0, 1, 2, 3], 5 -> [4, 3, 2, 1, 0, 5]
[-10, 0, 10], 4 -> [-10, 0, 10]
code-golf
math
arithmetic
array-manipulation
integer
Luis Mendo
quelle
quelle
Antworten:
Gelee , 5 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
MATL,
111097 Bytes3 Bytes gespart dank @Luis!
Die erste Eingabe ist die Größe des Fensters und die zweite Eingabe ist das Array
Probieren Sie es bei MATL Online aus
Erläuterung
quelle
Mathematica, 29 Bytes
Oder gleich lang:
quelle
CJam (16 Bytes)
Online-Testsuite . Dies ist ein anonymer Block (eine Funktion), der das Array und die Länge auf dem Stapel übernimmt und ein Array auf dem Stapel belässt.
Präparation
quelle
Haskell, 57 Bytes
Probieren Sie es online!
Nur einige Indexschleifen und der Zugriff auf die Eingabeliste bei Indizes modulieren die Länge der Liste.
quelle
Haskell ,
696564 BytesProbieren Sie es online! Beispiel Nutzung:
[2, 4, -3, 0, -4] # 3
.Die Verwendung von
n
erfolgreichen anstelle von vorhergehenden Einträgen kann50 bis46 Byte umfassen (das Gegenteil am Anfang und am Ende wird entfernt):Probieren Sie es online!
quelle
Japt , 12 Bytes
Probieren Sie es online!
TIO unterstützt das nicht
Ë
, daher funktioniert der TIO-Link nicht. Versuchen Sie es stattdessen hier .quelle
Pyth ,
1816 Bytes2 Bytes gespart dank @FryAmTheEggman !
Probieren Sie es hier aus oder überprüfen Sie alle Testfälle.
Alle Fehler wurden mit einem Preis von -6 Bytes behoben ! Vielen Dank an Luis, der mir die Aufgabe im Chat erklärt hat.
Erklärung (zu aktualisieren)
quelle
Java 8, 102 Bytes
Lambda (Curry) von
int[]
bis Lambda vonInteger
bisint[]
. Zuweisen zuFunction<int[], Function<Integer, int[]>>
.Probieren Sie es online
Ungolfed Lambda
(j % l + l) % l
berechnet einen nichtnegativen Rest für anyj
. Von hier genommen .quelle
C 91 Bytes
Probieren Sie es online!
quelle
Oktave, 53 Bytes
Probieren Sie es online!
imfilter
Funktion mit Optioncircular
berechnet die kreisförmige Faltung in der Mitte des Fensters, sodass das Ergebnis verschoben werden sollte.quelle
05AB1E , 10 Bytes
Probieren Sie es online!
Erläuterung
quelle
Perl 6 ,
4239 BytesProbieren Sie es online!
Mein erster Perl 6 Eintrag. Kann wohl verbessert werden.
quelle
->\a,\b{[«+»] map {a.rotate(-$_)},^b}
Beachten Sie, dass es in diesem Fall nicht tut , aber es wäre , wenn es eine andere Instanz$b
im Code.Kotlin ,
141140138 BytesNur ein erster Versuch
Einreichung
Verschönert
TryItOnline
Bearbeitungen
quelle
Röda , 52 Bytes
Probieren Sie es online!
Erläuterung:
quelle
JavaScript ES6
8078 Bytes2 Bytes gespart dank Neil
Verwendung:
quelle
,N
sieht für mich unnötig aus ...Perl 5 , 66 + 1 (-a) = 67 Bytes
Probieren Sie es online!
quelle
Python 2 ,
6961 Bytes- 8 Bytes Vielen Dank @muru
Probieren Sie es online!
Erläuterung:
Zuerst müssen wir sicherstellen, dass links von der ursprünglichen Liste genügend Nummern vorhanden sind. Dies wird durch die erreicht
x*n+x
Teil erreicht.Zum Beispiel
[2,4,-3,0,4],5
:Dann kehren wir die Liste um:
Als nächstes erhalten wir für jedes Element entsprechende Blöcke von
[len(x)+~i:][:n]
. Das Slice wird umgekehrt sein, dh 2 wird einen Block erhalten:[2,-4,0,-3,4]
Dies ist umgekehrt zu den erwarteten[4,-3,0,-4,2]
, aber wir brauchen schließlich die Summe. Das funktioniert also. :)quelle
x[-n+1:]+x*n
, Sie sollten die Liste mit ausreichender Polsterung auf beiden Seiten geben, ohne (lambda x,n:[sum((x[-n+1:]+x*n)[i:i+n])for i in range(len(x))]
) umkehren zu müssenR ,
1019389 BytesProbieren Sie es online!
quelle
K (oK) , 18 Bytes
Lösung:
Probieren Sie es online!
Beispiele:
Erläuterung:
Wollte gerade eine 31-Byte- Lösung veröffentlichen, dann fiel mir ein, dass in OK ein Schiebefenster eingebaut ist ...
Bonus:
Die 31-Byte- Lösung, die auch in K4 funktioniert :
quelle