Codewars Lösung | The Deaf Rats of Hamelin


coden
Codewars. Achieve mastery through challenge.
Daniel Kaser|29. Juli 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:The Deaf Rats of Hamelin
Level:6 kyu
Sprache:JavaScript

Beschreibung:


Story

The Pied Piper has been enlisted to play his magical tune and coax all the rats out of town.

But some of the rats are deaf and are going the wrong way!

Kata Task

How many deaf rats are there?

Legend

  • P = The Pied Piper
  • O~ = Rat going left
  • ~O = Rat going right

Example

  • ex1 ~O~O~O~O P has 0 deaf rats

  • ex2 P O~ O~ ~O O~ has 1 deaf rat

  • ex3 ~O~O~O~OP~O~OO~ has 2 deaf rats


Series

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

Um die Ratten auseinanderhalten zu können, können wir zwischen jede Ratte ein Leerzeichen schieben, dafür erstelle ich mir eine Helfer-Funktion

Schritt 2

Hier loope ich einmal durch alle Ratten, hänge sie an ein Array, wandele das Array in einen String um und platziere ein Leerzeichen zwischen jeder Ratte

Schritt 3

Als Erstes erstellen wir uns eine Variable um die tauben Ratten zu zählen

Schritt 4

Dann bereinigen wir uns die town-Variable und speichern die Ratten links und rechts vom Pfeifer jeweils in einer eigenen Variablen ab

Schritt 5

Jetzt schieben wir mit unserer Helfer-Funktion die Leerzeichen zwischen die Ratten

Schritt 6

Dann können wir die tauben Ratten zählen und in unserer Taube-Ratten-Zähl-Variablen speichern

Schritt 7

Zum Schluss nur noch die Anzahl der tauben Ratten zurückgeben

Code

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

Lösungsschritte
Zuerst die erste Zeile meiner Helfer-Funktion, die Leerzeichen zwischen die Ratten schiebt:
function spacifyRats(rats) {
Wir brauchen ein Array für unser Ergebnis:
const spacedRats = [];
Dann der Loop durch die Ratten:
  for (let i = 0; i < rats.length; i += 2) {

Da jede Ratte aus 2 Zeichen besteht, gehen wir hier immer 2 Schritte (i += 2).

Wie schnappen uns jede Ratte (Kopf und Schwanz) und fügen sie zu unserem Ergebnis-Array hinzu:
    spacedRats.push(rats[i] + rats[i + 1]);
  }

Eine weitere Möglichkeit sich jede Ratte zu schnappen wäre z.B. rats.slice(i, 2). Geschmackssache.

Zum Schluss die Leerzeichen nicht vergessen, dafür machen wa ja dit janze Theater:
  return spacedRats.join(" ");
}

Jetzt haben wir einen String mit Leerzeichen-getrennten Ratten. Weiter geht’s mit der Hauptfunktion:

Die erste Zeile meiner Hauptfunktion:
function countDeafRats(town) {
Zuerst erstellen wir uns einen Zähler für die tauben Ratten:
let numDeafRats = 0;
Jetzt extrahieren wir die linken und die rechten Ratten in eigene Variablen:
const [leftRats, rightRats] = town.replace(/[\s]/g, "").split("P");

Mit .replace(/[\s]/g, "") entfernen wir jegliche Leerzeichen und .split(“P”) gibt uns ein Array mit 2 Elementen zurück, die wir sofort deconstructen.

Wenn der Pfeifer ganz links oder ganz rechts steht, erhalten wir auf einer Seite einen leeren String.

Dann schieben wir die Leerzeichen zwischen die Ratten:
const leftSpacedRats = spacifyRats(leftRats);
const rightSpacedRats = spacifyRats(rightRats);

Dabei hilft uns unsere Helfer-Funktion von oben.

Jetzt können wir die tauben Ratten zählen und in unserer Taube-Ratten-Zähl-Variable speichern:
numDeafRats += (leftSpacedRats.match(/O~/g) || []).length;
numDeafRats += (rightSpacedRats.match(/~O/g) || []).length;

Wenn wir auf einer Seite keine taube Ratte finden, messen wir die Länge eines leeren Arrays, also 0.

Geil, jetzt nur noch unsere gezählten tauben Ratten zurückgeben:
  return numDeafRats;
}
Voilá! 💪

Fragen?

Komplettlösung
function countDeafRats(town) {
  let numDeafRats = 0;

  const [leftRats, rightRats] = town.replace(/[\s]/g, "").split("P");
  const leftSpacedRats = spacifyRats(leftRats);
  const rightSpacedRats = spacifyRats(rightRats);

  numDeafRats += (leftSpacedRats.match(/O~/g) || []).length;
  numDeafRats += (rightSpacedRats.match(/~O/g) || []).length;

  return numDeafRats;
}

function spacifyRats(rats) {
  const spacedRats = [];

  for (let i = 0; i < rats.length; i += 2) {
    spacedRats.push(rats[i] + rats[i + 1]);
  }

  return spacedRats.join(" ");
}

Feedback

Schreib mir!