Inhalt
Die Fakten:
Plattform: | codewars.com |
Name: | Triple trouble |
Level: | 6 kyu |
Sprache: | JavaScript |
Beschreibung:
Write a function
TripleDouble(long num1, long num2)
TripleDouble(long num1, long num2)
tripledouble(num1,num2)
triple_double(num1, num2)
triple_double(num1, num2)
tripleDouble(num1: Long, num2: Long): Int
which takes numbers num1
and num2
and returns 1
if there is a straight triple of a number at any place in num1
and also a straight double of the same number in num2
.
If this isn't the case, return 0
Examples
tripledouble(451999277, 41177722899) == 1 // num1 has straight triple 999s and
// num2 has straight double 99s
tripledouble(1222345, 12345) == 0 // num1 has straight triple 2s but num2 has only a single 2
tripledouble(12345, 12345) == 0
tripledouble(666789, 12345667) == 1
TripleDouble(451999277, 41177722899) == 1 // num1 has straight triple 999s and
// num2 has straight double 99s
TripleDouble(1222345, 12345) == 0 // num1 has straight triple 2s but num2 has only a single 2
TripleDouble(12345, 12345) == 0
TripleDouble(666789, 12345667) == 1
TripleDouble(451999277, 41177722899) == 1 // num1 has straight triple 999s and
// num2 has straight double 99s
TripleDouble(1222345, 12345) == 0 // num1 has straight triple 2s but num2 has only a single 2
TripleDouble(12345, 12345) == 0
TripleDouble(666789, 12345667) == 1
triple_double(451999277, 41177722899) == 1
# num1 has straight triple 999s and num2 has straight double 99s
triple_double(1222345, 12345) == 0
# num1 has straight triple 2s but num2 has only a single 2
triple_double(12345, 12345) == 0
triple_double(666789, 12345667) == 1
triple_double(451999277, 41177722899) == 1
# num1 has straight triple 999s and num2 has straight double 99s
triple_double(1222345, 12345) == 0
# num1 has straight triple 2s but num2 has only a single 2
triple_double(12345, 12345) == 0
triple_double(666789, 12345667) == 1
// num1 has straight triple 999s and num2 has straight double 99s
tripleDouble(451999277, 41177722899) == 1
// num1 has straight triple 2s but num2 has only a single 2:
tripleDouble(1222345, 12345) == 0
tripleDouble(12345, 12345) == 0
tripleDouble(666789, 12345667) == 1
Quelle: codewars.com
Lösung
Pseudo-Code
Es gibt wie immer viele Varianten, hier ist eine meiner.
Wenn man sich ordentlich mit RegEx
auskennt, kann man dieses Kata locker mit weniger Zeilen lösen. Wir lösen es hier ohne RegEx
.
Erst die Lösungsschritte in Pseudo-Code. Los geht’s:
Lösungsschritte
Schritt 1
Wir erstellen uns 2 Funktionen. Eine Helfer-Funktion um die Triples im ersten Array zu ermitteln und die Hauptfunktion um zu prüfen, ob es das entsprechende Double im zweiten Array gibt
Schritt 2
Für die Helfer-Funktion brauchen wir erst mal eine Variable um die gefundenen Triples zu speichern
Schritt 3
Dann noch eine um zu zählen, wie oft die aktuelle Ziffer jetzt schon hintereinander kam
Schritt 4
Nachdem wir die Zahl in ein Array umgewandelt haben, können wir durch die Ziffern loopen
Schritt 5
Wenn die nächste Ziffer der aktuellen entspricht, erhöhen wir unseren Zähler um 1
Schritt 6
Wenn der Zähler 3
erreicht, können wir die aktuelle Zahl an unser Ergebnis-Array hängen
Schritt 7
Dann sollten wir den Zähler wieder zurücksetzen, wenn die aktuelle Zahl nicht mit der vorigen übereinstimmt
Schritt 8
Zum Schluss das Ergebnis-Array zurückgeben
Weiter geht’s mit der Hauptfunktion!
Schritt 9
In unserer Hauptfunktion holen wir uns die gefunden Triples und speichern sie in einer Variablen
Schritt 10
Damit wir die zweite Zahl durchsuchen können, wandeln wir sie in einen String um
Schritt 11
Dann loopen wir durch die gefundenen Triples
Schritt 12
Wenn eines in der zweiten Zahl zweimal hintereinander vorkommt, können wir 1
zurückgeben
Schritt 13
Sollten wir kein Double in der zweiten Zahl finden, geben wir nach dem Loop 0
zurück
Code
Geil. Übersetzen wir unseren Pseudo-Code in JavaScript:
Lösungsschritte
Die erste Zeile meiner Helferfunktion zum Finden der Triples:
function getTripleDigits(num) {
Jetzt unsere beiden Variablen. Eine für unsere gefundenen Triples und eine zum Zählen wie oft die aktuelle Ziffer bereits vorkam:
const tripleDigits = [];
let count = 1;
Da die jeweils aktuelle Zahl ja bereits 1x vorgekommen ist, initialisiere ich den Zähler mit 1
.
Dann wandeln wir die Input-Zahl in ein Array mit Ziffern um:
num
.toString()
.split("")
Hier können wir die Methods schön chainen.
Dann der Loop durch die Ziffern:
.forEach((currDigit, i, arr) => {
const prevDigit = arr[i - 1];
Die jeweils vorherige Ziffer speichere ich mir der Lesbarkeit halber in einer Variablen ab.
Jetzt prüfen wir, ob die aktuelle Ziffer der vorigen entspricht:
if (currDigit === prevDigit) {
Wenn ja, erhöhen wir unseren Counter um 1
:
count++;
Wenn der Counter 3
ist, können wir die aktuelle Zahl an unser Ergebnis-Array hängen:
if (count === 3) tripleDigits.push(currDigit);
}
Wenn die aktuelle Zahl und die vorige nicht übereinstimmen setzen wir unseren Counter zurück:
else count = 1;
});
Nach dem Loop geben wir unser Ergebnis-Array zurück:
return tripleDigits;
}
So, das war die Helfer-Funktion. Weiter geht’s mit der Hauptfunktion.
Hier die erste Zeile meiner Hauptfunktion:
function tripledouble(num1, num2) {
Zuerst holen wir uns mit unserer Helfer-Funktion die Triples der ersten Zahl und speichern sie in einer Variablen:
const tripleDigits = getTripleDigits(num1);
Die zweite Zahl wandeln wir in einen String um, damit wir sie durchsuchen können:
const num2Str = num2.toString();
Dann der Loop durch die gefundenen Triples:
for (let digit of tripleDigits) {
Wenn ein Triple zweimal hintereinander in der zweiten Zahl vorkommt, geben wir 1
zurück:
if (num2Str.includes(digit + digit)) return 1;
}
Sollten wir kein Double in der zweiten Zahl finden, geben wir nach dem Loop 0
zurück:
return 0;
}
Voilá! 💪
Komplettlösung
function tripledouble(num1, num2) {
const tripleDigits = getTripleDigits(num1);
const num2Str = num2.toString();
for (let digit of tripleDigits) {
if (num2Str.includes(digit + digit)) return 1;
}
return 0;
}
function getTripleDigits(num) {
const tripleDigits = [];
let count = 1;
num
.toString()
.split("")
.forEach((currDigit, i, arr) => {
const prevDigit = arr[i - 1];
if (currDigit === prevDigit) {
count++;
if (count === 3) tripleDigits.push(currDigit);
} else count = 1;
});
return tripleDigits;
}