Codewars Lösung | Sum consecutives


coden
Codewars. Achieve mastery through challenge.
Daniel Kaser|22. August 2024
3 min.

Inhalt

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

Die Fakten:

Plattform:codewars.com
Name:Sum consecutives
Level:6 kyu
Sprache:JavaScript

Beschreibung:

You are given a list/array which contains only integers (positive and negative). Your job is to sum only the numbers that are the same and consecutive. The result should be one list.

Extra credit if you solve it in one line. You can assume there is never an empty list/array and there will always be an integer.

Same meaning: 1 == 1

1 != -1

#Examples:

[1,4,4,4,0,4,3,3,1] # should return [1,12,0,4,6,1]

"""So as you can see sum of consecutives 1 is 1 
sum of 3 consecutives 4 is 12 
sum of 0... and sum of 2 
consecutives 3 is 6 ..."""

[1,1,7,7,3] # should return [2,14,3]
[-5,-5,7,7,12,0] # should return [-10,14,12,0]

Quelle: codewars.com

Lösung

EINES VORWEG
Auch wenn der Autor des Katas hier für einzeilige Lösungen großzügig Respekt verteilt. So einen Quark machen wir hier nicht. Wir kreieren eine lesbare, übersichtliche und ggf. wartbare Lösung. So, genug gepöbelt, los geht’s!

Pseudo-Code

Erst die Lösungsschritte in Pseudo-Code:

Lösungsschritte
Schritt 1

Zuerst brauchen wir Variablen. Eine für unser Endergebnis und eine für die aktuelle Summe

Schritt 2

Dann brauchen wir einen Loop! Wir loopen durch alle Zahlen im Input-Array

Schritt 3

Wenn die aktuelle Zahl gleich der nächsten, ODER gleich der vorigen ist, addieren wir sie zu unserer Zwischensumme

Schritt 4

Sollte sie dann allerdings nicht gleich der nächsten sein, können wir die Zwischensumme ans Endergebnis-Array anhängen

Schritt 5

Wenn sie weder gleich der nächsten, noch der vorigen Zahl ist hängen wir sie wie sie ist ans Endergebnis-Array

Schritt 6

Nach dem Loop nur noch das Endergebnis zurückgeben.

Code

Geil. Übersetzen wir unseren Pseudo-Code in JavaScript:

Lösungsschritte
Meine erste Zeile:
function sumConsecutives(nums) {
Zuerst die Variablen für Zwischensumme und Endergebnis initalisieren:
const result = [];
let sum = 0;
Dann der Loop durch die Input-Zahlen:
  for (let i = 0; i < nums.length; i++) {
    const prev = nums[i - 1];
    const curr = nums[i];
    const next = nums[i + 1];

Der Übersicht und Lesbarkeit halber erstelle ich mir jeweils eine Variable für das vorige, das aktuelle und das nächste Element.

Jetzt unsere erste Bedingung. Sind das nächste ODER das vorige Element gleich dem aktuellen?:
    if (curr === next || curr === prev) {
Wenn ja, können wir das aktuelle Element zu unserer Zwischensumme addieren:
      sum += curr;
Und checken dann noch mal extra, ob es nicht dem nächsten Element entspricht:
      if (curr !== next) {

Wenn es nicht dem nächsten Element enspricht heißt das, dass das aktuelle Element das letzte gleichartige seiner Art ist.

Wenn das zutrifft, können wir die aktuelle Zwischensumme ans Endergebnis hängen:
        result.push(sum);
        sum = 0;
      }

      continue;
    }

Nach dem Pushen nicht vergessen die Zwischensumme zurück zu setzen. Außerdem können wir dann direkt mit dem nächsten Element im Loop fortfahren. Dafür ist das continue.

Wenn das aktuelle Element weder dem vorigen noch dem nächsten entspricht, können wir es direkt an unser Endergebnis-Array hängen:
    result.push(curr);
  }

Das war's mit dem Loop.

Nach dem Loop nur noch das Endergebnis zurückgeben:
return result;
Voilá! 💪

Fragen?

Komplettlösung
function sumConsecutives(nums) {
  const result = [];
  let sum = 0;

  for (let i = 0; i < nums.length; i++) {
    const prev = nums[i - 1];
    const curr = nums[i];
    const next = nums[i + 1];

    if (curr === next || curr === prev) {
      sum += curr;

      if (curr !== next) {
        result.push(sum);
        sum = 0;
      }

      continue;
    }

    result.push(curr);
  }

  return result;
}

Feedback

Schreib mir!