Codewars Lösung | Domino Reaction


coden
Codewars. Achieve mastery through challenge.
Daniel Kaser|17. Oktober 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:Domino Reaction
Level:6 kyu
Sprache:TypeScript

Beschreibung:

You're given a string of dominos. For each slot, there are 3 options:

  • "|" represents a standing domino

  • "/" represents a knocked over domino

  • " " represents a space where there is no domino

For example:

"||| ||||//| |/"

Tipping a domino will cause the next domino to its right to fall over as well, but if a domino is already tipped over, or there is a domino missing, the reaction will stop.
What you must do is find the resulting string if the first domino is pushed over. So in out example above, the result would be:

"/// ||||//| |/"

since the reaction would stop as soon as it gets to a space.

Quelle: codewars.com

Lösung

Pseudo-Code

Wie immer gibt's reichlich Varianten, hier ist eine meiner.

Erst die Lösungsschritte in Pseudo-Code. Los geht's:

Lösungsschritte
Schritt 1

Als Erstes brauchen wir eine Variable für unser Ergebnis.

Schritt 2

Dann einen Loop! Wir loopen durch die Dominosteine.

Schritt 3

Wenn der aktuelle Dominostein steht, hängen wir einen gekippten an unser Ergebnis und fahren mit dem Loop fort.

Schritt 4

Ansonsten war's das für die Kettenreaktion. Wir können die restlichen Dominos wie sie sind an unser Ergebnis hängen und den Loop abbrechen.

Schritt 5

Am Schluss nur noch das Ergebnis zurückgeben.

Code

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

Lösungsschritte
Meine erste Zeile (ich habe sequence in dominos umbenannt):
export function dominoReaction(dominos: string): string {
Als Erstes die Variable für's Ergebnis:
const result: string[] = [];

Ich entscheide mich hier für ein Array. Es ginge natürlich auch mit einem String 😉

Dann direkt der Loop durch die Dominosteine:
  for (let i = 0; i < dominos.length; i++) {
    const curr = dominos[i];

Da wir den Index brauchen werden, entscheide ich mich hier für den klassischen for...of-Loop. Du kannst auch gerne den dominos-String in ein Array umwandeln und dann mit forEach() loopen.

Das jeweils aktuelle Element speichere ich mir unter curr ab.

Jetzt checken wir, ob der aktuelle Dominostein steht:
    if (curr === "|") {
Wenn ja, hängen wir einen gekippten an unser Ergebnis-Array:
result.push("/");
Außerdem können wir dann mit dem Loop fortfahren:
      continue;
    }

Ich verwende hier gerne continue statt else. Ist meiner Meinung nach lesbarer.

Ansonsten hängen wir den Rest der Dominos an unser Ergebnis-Array:
result.push(...dominos.slice(i));

Hier kommt der Index zum Einsatz!

Außerdem können wir dann den Loop (vorzeitig) beenden:
    break;
  }

Infos zu break findest du hier.

Nach dem Loop nur noch das Ergebnis als String zurückgeben:
  return result.join("");
}
Voilá! 💪

Fragen?

Komplettlösung
export function dominoReaction(dominos: string): string {
  const result: string[] = [];

  for (let i = 0; i < dominos.length; i++) {
    const curr = dominos[i];

    if (curr === "|") {
      result.push("/");
      continue;
    }

    result.push(...dominos.slice(i));
    break;
  }

  return result.join("");
}

Feedback

Schreib mir!