Inhalt
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á! 💪
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;
}
}