Inhalt
Die Fakten:
Plattform: | codewars.com |
Name: | Square Pi's |
Level: | 7 kyu |
Sprache: | TypeScript |
Beschreibung:
Everybody loves pi, but what if pi were a square? Given a number of digits digits
, find the smallest integer whose square is greater or equal to the sum of the squares of the first digits
digits of pi, including the 3
before the decimal point.
Note: Test cases will not extend beyond 100 digits; the first 100 digits of pi are pasted here for your convenience:
31415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Examples
digits = 1 # [3]
expected = 3 # sqrt(3^2) = 3
digits = 3 # [3, 1, 4]
expected = 6 # sqrt(3^2 + 1^2 + 4^2) = 5.099 --> 6
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
Schnappe dir die ersten n
Ziffern von Pi
.
Schritt 2
Für jede Ziffer,
Schritt 3
multiplizier sie mit sich selbst und addiere das zu einer Summe.
Schritt 4
Nach dem Loop,
Schritt 5
errechne die Wurzel der Summe
Schritt 6
und gebe das Ergebnis abgerundet zurück.
Code
Geil. Übersetzen wir unseren Pseudo-Code in TypeScript:
Lösungsschritte
Meine erste Zeile (ich habe digits
in n
umbenannt):
export function squarePi(n: number): number {
Freundlicher Weise werden uns die Ziffern von Pi
zur Verfügung gestellt. Die speichern wir in einer Variablen. Außerdem brauchen wir noch die Variable für die Summe:
const piDigits =
"31415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679";
let sum = 0;
Und nu der Loop:
for (let i = 0; i < n; i++) {
Aktuelle Ziffer hoch 2
nehmen und zur Summe addieren:
sum += Number(piDigits[i]) ** 2;
}
Denk dran die aktuelle Ziffer jeweils vom String in eine Zahl (Number()
) umzuwandeln.
Jetzt nur noch Wurzel ziehen, aufrunden und zurückgeben - fert’sch:
return Math.ceil(Math.sqrt(sum));
}
Voilá! 💪
Komplettlösung
export function squarePi(n: number): number {
const piDigits =
"31415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679";
let sum = 0;
for (let i = 0; i < n; i++) {
sum += Number(piDigits[i]) ** 2;
}
return Math.ceil(Math.sqrt(sum));
}