
Inhalt
Die Fakten:
Plattform: | codewars.com |
Name: | Adding values of arrays in a shifted way |
Level: | 7 kyu |
Sprache: | TypeScript |
Beschreibung:
#Adding values of arrays in a shifted way
You have to write a method, that gets two parameter:
1. An array of arrays with int-numbers
2. The shifting value
#The method should add the values of the arrays to one new array.
The arrays in the array will all have the same size and this size will always be greater than 0.
The shifting value is always a value from 0 up to the size of the arrays.
There are always arrays in the array, so you do not need to check for null or empty.
#1. Example:
[[1,2,3,4,5,6], [7,7,7,7,7,-7]], 0
1,2,3,4,5,6
7,7,7,7,7,-7
--> [8,9,10,11,12,-1]
#2. Example
[[1,2,3,4,5,6], [7,7,7,7,7,7]], 3
1,2,3,4,5,6
7,7,7,7,7,7
--> [1,2,3,11,12,13,7,7,7]
#3. Example
[[1,2,3,4,5,6], [7,7,7,-7,7,7], [1,1,1,1,1,1]], 3
1,2,3,4,5,6
7,7,7,-7,7,7
1,1,1,1,1,1
--> [1,2,3,11,12,13,-6,8,8,1,1,1]
Have fun coding it and please don't forget to vote and rank this kata! :-)
I have created other katas. Have a look if you like coding and challenges.
Quelle: codewars.com
Lösung
Pseudo-Code
Es gibt wie immer viele Varianten, hier ist eine meiner.
Erst die Lösungsschritte in Pseudo-Code. Los geht’s:
Lösungsschritte
Schritt 1
Zuerst müssen wir rauskriegen, wie lang unser Ergebnis-Array sein wird
Schritt 2
Dann können wir dieses schon mal erstellen
Schritt 3
Danach können wir loopen
Schritt 4
Wir werden 2 Loops brauchen
Schritt 5
Der äußere so lange, wie unser Ergebnis-Array lang ist
Schritt 6
Der innere so lange, wie die Anzahl der Unter-Arrays
Schritt 7
Dann können wir die Zahlen untereinander zusammenrechnen
Schritt 8
Und dann im Ergebnis-Array speichern
Code
Geil. Übersetzen wir unseren Pseudo-Code in TypeScript:
Lösungsschritte
Meine erste Zeile (ich fand arrayOfArrays
etwas unglücklich und habe es in arrays
umbenannt):
export function addingShifted(arrays: number[][], shift: number): number[] {
Die Länge des Ergebnis-Arrays berechnen:
const subArrLength = arrays[0].length;
const resultLength = subArrLength + (arrays.length - 1) * shift;
Dafür kucken wir zuerst wie lang ein inneres Array ist. An diese Länge hängen wir so oft shift
dran, wie wir innere Arrays haben - aber ein Mal weniger. OK?! Jut.
Wenn wir also einen shift
von 3
haben und unser array
2
innere Arrays hat, die jeweils 6
Elemente haben, ist die Länge des Ergebnis-Arrays:
6
+ (2
- 1
) * 3
= 9
Bei 3
inneren Arrays:
6
+ (3
- 1
) * 3
= 12
Jetzt erstellen wir unser Ergebnis-Array:
const sums = Array(resultLength).fill(0);
Das Array hat die Länge resultLength
und wir füllen es mit Nullen.
Jetzt der erste, der äußere Loop:
for (let i = 0; i < resultLength; i++) {
Hier iterieren wir horizontal, also von links nach rechts, durch unser Ergebnis-Array.
Und der zweite, der innere Loop:
for (let j = 0; j < arrays.length; j++) {
Hier iterieren wir vertikal, also von oben nach unten, durch das Input-Array. D.h., von einem inneren Array zum nächsten.
Jetzt checken wir das jeweilige Element im aktuellen inneren Array:
const k = i - shift * j;
Dafür bauen wir uns zunächst den Index des aktuellen Elements im aktuellen inneren Array.
Beispiel: 0
- 3
* 1
= -3
Und addieren den Wert des Elements an die aktuelle Stelle in unserem Ergebnis-Array:
sums[i] += arrays[j][k] || 0;
}
}
Im obigen Beispiel befindet sich unter der ersten Stelle (das Element mit Index 0
) des ersten Arrays das -3.
Element des zweiten Arrays. Das gibt es natürlich nicht. Darum addieren wir in diesem Fall nüscht. Nüscht ist 0
. Logisch, oder?!
Nach den Loops noch unsere Summen zurückgeben: 🐝💤
return sums;
}
Voilá! 💪
Komplettlösung
export function addingShifted(arrays: number[][], shift: number): number[] {
const subArrLength = arrays[0].length;
const resultLength = subArrLength + (arrays.length - 1) * shift;
const sums = Array(resultLength).fill(0);
for (let i = 0; i < resultLength; i++) {
for (let j = 0; j < arrays.length; j++) {
const k = i - shift * j;
sums[i] += arrays[j][k] || 0;
}
}
return sums;
}