Codewars Lösung | Especially Joyful Numbers


coden
Codewars. Achieve mastery through challenge.
Daniel Kaser|22. Januar 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: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! 💪

Fragen?

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;
};

Feedback

Schreib mir!