Codewars Lösung | Integer depth


coden
Codewars. Achieve mastery through challenge.
Daniel Kaser|17. März 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:Integer depth
Level:6 kyu
Sprache:TypeScript

Beschreibung:

The depth of an integer n is defined to be how many multiples of n it is necessary to compute before all 10 digits have appeared at least once in some multiple.

example:

let see n=42

Multiple         value         digits     comment
42*1              42            2,4 
42*2              84             8         4 existed
42*3              126           1,6        2 existed
42*4              168            -         all existed
42*5              210            0         2,1 existed
42*6              252            5         2 existed
42*7              294            9         2,4 existed
42*8              336            3         6 existed 
42*9              378            7         3,8 existed

Looking at the above table under digits column you can find all the digits from 0 to 9, Hence it required 9 multiples of 42 to get all the digits. So the depth of 42 is 9. Write a function named computeDepth which computes the depth of its integer argument.Only positive numbers greater than zero will be passed as an input.

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

Ich werde das Feld von hinten aufrollen, darum erstelle ich mir zuerst ein Array mit allen Ziffern drin.

Schritt 2

Dann erstelle ich einen unendlichen Loop.

Schritt 3

In jeder Iteration wird der Faktor um 1 erhöht.

Schritt 4

Ich berechne das Produkt von Faktor und Input-Zahl und wandele es in ein Array mit Ziffern um.

Schritt 5

Dann loope ich durch diese Ziffern.

Schritt 6

Wenn die aktuelle Ziffer noch in meinem oben erstellten Array mit Ziffern ist, wird sie aus dem Array entfernt.

Schritt 7

Wenn mein oben erstelltes Array leer ist, gebe ich den Faktor zurück.

Code

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

Lösungsschritte
Meine erste Zeile (ich habe n zu num umbenannt):
export function computeDepth(num: number): number {
Als erstes erstelle ich mir mein Array mit allen Ziffern:
let digits = [..."0123456789"];

Da ich faul bin und keine Lust habe die ganzen Gänsefüßchen und Kommas zu tippen, spreade ich einen String mit den Ziffern.

Dann der äußere Loop:
  for (let i = 1; ; i++) {

Die Bedingung in der Mitte lasse ich weg, damit der Loop unendlich ist. Ist also quasi ein while-Loop mit i.

Jetzt kann man den aktuellen Wert berechnen und das Array aus den Ziffern des Wertes erstellen:
const value = num * i;
const valueDigits = [...value.toString()];
Dann der innere Loop durch die Ziffern des aktuellen Wertes:
    valueDigits.forEach((valueDigit) => {
Wenn die Ziffer (noch) im oben erstellen Array vorhanden ist, wird sie entfernt:
      digits = digits.filter((digit) => digit !== valueDigit);
    });

Hier wird ein neues Array zurückgegeben, das nur Werte enthält, die nicht der aktuellen Wert-Ziffer entsprechen.

Jetzt noch der Ausstieg, wenn das Array leer ist:
    if (!digits.length) return i;
  }
}
Voilá! 💪

Fragen?

Komplettlösung
export function computeDepth(num: number): number {
  let digits = [..."0123456789"];

  for (let i = 1; ; i++) {
    const value = num * i;
    const valueDigits = [...value.toString()];

    valueDigits.forEach((valueDigit) => {
      digits = digits.filter((digit) => digit !== valueDigit);
    });

    if (!digits.length) return i;
  }
}

Feedback

Schreib mir!