Inhalt
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 PiperO~
= 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á! 💪
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(" ");
}