Codewars Lösung | Square Pi's


coden
Codewars. Achieve mastery through challenge.
Daniel Kaser|20. Januar 2024
2 min.

Inhalt

  1. Die Fakten
  2. Beschreibung
  3. Lösung
    1. Pseudo-Code
    2. Code
  4. Feedback

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á! 💪

Fragen?

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

Feedback

Schreib mir!