Inhalt
Die Fakten:
Plattform: | codewars.com |
Name: | Especially Joyful Numbers |
Level: | 7 kyu |
Sprache: | TypeScript |
Beschreibung:
Positive integers that are divisible exactly by the sum of their digits are called Harshad numbers. The first few Harshad numbers are: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 18, ...
We are interested in Harshad numbers where the product of its digit sum s
and s
with the digits reversed, gives the original number n
. For example consider number 1729:
- its digit sum,
s
= 1 + 7 + 2 + 9 = 19 - reversing
s
= 91 - and 19 * 91 = 1729 --> the number that we started with.
Complete the function which tests if a positive integer n
is Harshad number, and returns True
if the product of its digit sum and its digit sum reversed equals n
; otherwise return False
.
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 sollten wir die Summe der Ziffern berechnen.
Schritt 2
Dann brauchen wir diese Summe mit ihren Ziffern in umgekehrter Reihenfolge.
Schritt 3
Und dann nur noch vergleichen, ob das Produkt dieser beiden Zahlen dem Input n
entspricht.
Code
Geil. Übersetzen wir unseren Pseudo-Code in TypeScript:
Lösungsschritte
Meine erste Zeile (ich habe n
in num
umbenannt):
export const numberJoy = (num: number): boolean => {
Berechnen wir die Summe der Ziffern von num
(Stichwort: Method-Chaining):
const digitSum = num
.toString()
.split("")
.reduce((sum, digit) => sum + Number(digit), 0);
Erst müssen wir die Zahl in einen String umwandeln. Dann können wir mit .split("")
aus diesem String ein Array machen. Und zum Schluss jede Ziffer mit .reduce()
zu einer Summe aufaddieren (als Startwert wählen wir 0). In TypeScript müssen wir die jeweils aktuelle Ziffer immer noch in eine Zahl umwandeln, z.B. mit Number()
.
Jetzt können wir die Ziffern der Quersumme umdrehen (Stichwort: Method-Chaining):
const digitSumReversed = Number(
digitSum.toString().split("").reverse().join(""),
);
Wir wandeln unsere Zahl wieder in einen String um und machen ein Array draus. Auf dieses können wir jetzt .reverse()
anwenden, um das Array umzudrehen. Jetzt noch mit join("")
wieder zu einem String zusammenfügen und zum Schluss wandeln wir mit Number()
das ganze Ding noch wieder in eine Zahl zurück.
Jetzt noch checken ob das Produkt von digitSum
und digitSumReversed
gleich der Input-Zahl ist:
return digitSum * digitSumReversed === num;
};
Das Ergebnis des Checks können wir direkt mit return
zurückgeben.
Traum! 💪
Komplettlösung
export const numberJoy = (num: number): boolean => {
const digitSum = num
.toString()
.split("")
.reduce((sum, digit) => sum + Number(digit), 0);
const digitSumReversed = Number(
digitSum.toString().split("").reverse().join(""),
);
return digitSum * digitSumReversed === num;
};