Codewars Lösung | Adding values of arrays in a shifted way


coden
Codewars. Achieve mastery through challenge.
Daniel Kaser|3. Februar 2024
4 min.

Inhalt

  1. Die Fakten
  2. Beschreibung
  3. Lösung
    1. Pseudo-Code
    2. Code
  4. Feedback

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á! 💪

Fragen?

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;
}

Feedback

Schreib mir!