Codewars Lösung | Gematria for all


coden
Codewars. Achieve mastery through challenge.
Daniel Kaser|21. 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:Gematria for all
Level:7 kyu
Sprache:TypeScript

Beschreibung:

Gematria is an Assyro-Babylonian-Greek system of code and numerology later adopted into Jewish culture. The system assigns numerical value to a word or a phrase in the belief that words or phrases with identical numerical values bear some relation to each other or bear some relation to the number itself. While more commonly used on Hebrew words, there is also an English version.

Each letter has a value and the gematrian value of a word or a phrase is the sum of those values. The code takes a word or an expression and returns the gematrian value of it.

The calculation is case insensitive and counts no spaces.

Example: The gematrian value of "love" is 20+50+700+5 = 775

‎These are the values of the different letters:

a=1, b=2, c=3, d=4, e=5, f=6, g=7, h=8, i=9, k=10, l=20, m=30, n=40, o=50, p=60, q=70, r=80, s=90, t=100, u=200, x=300, y=400, z=500, j=600, v=700, w=900

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 brauchen wir einen "Schlüssel", in dem festgelegt ist, welcher Buchstabe welchen Wert hat.

Schritt 2

Dann sollten wir die Leerzeichen aus dem Input String entfernen.

Schritt 3

Und dann können wir durch String loopen,

Schritt 4

checken welche Zahl sich hinter dem jeweils aktuellen Buchstaben verbirgt und

Schritt 5

diese Zahl zu einer Summe aufaddieren.

Code

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

Lösungsschritte
Meine erste Zeile:
export function gematria(str: string): number {
Jetzt der Schlüssel:
const map: { [key: string]: number } = {
  a: 1,
  b: 2,
  c: 3,
  d: 4,
  e: 5,
  f: 6,
  g: 7,
  h: 8,
  i: 9,
  k: 10,
  l: 20,
  m: 30,
  n: 40,
  o: 50,
  p: 60,
  q: 70,
  r: 80,
  s: 90,
  t: 100,
  u: 200,
  x: 300,
  y: 400,
  z: 500,
  j: 600,
  v: 700,
  w: 900,
};

Ich nenne meinen Schlüssel map und speichere ihn als Objekt.

Jetzt können wir die Leerzeichen (Whitespace) entfernen:
str.replace(/\s/g, "");

Das mache ich hier mit .replace(). /\s/g ist hier eine Regular Expression. \s steht für Whitespace und das g heißt, dass es auf ALLE angewendet werden soll. Hier ersetzen wir also alle Leerzeichen mit einem leeren String, also mit nüscht.

Dann können wir durch den String loopen, die jeweilige Zahl raussuchen und zu einer Summe aufaddieren:
    .split("")
    .reduce((sum, letter) => sum + map[letter.toLowerCase()], 0);

Hier nutze ich Method-Chaining.

Erst wandle ich unseren String mit .split("") in ein Array. Dann kann ich die Array-Method .reduce() anwenden. Den jeweiligen Buchstaben im Loop wandle ich in einen Kleinbuchstaben um und addiere dessen Wert in meinem map-Objekt zu einer Summe.

Den Anfangswert hab ich hier auf 0 gesetzt.

Und nu noch das Ganze zurückgeben. Zusammen mit dem return sieht unsere Logik dann so aus:
  return str
    .replace(/\s/g, "")
    .split("")
    .reduce((sum, letter) => sum + map[letter.toLowerCase()], 0);
}
Voilá! 💪

Fragen?

Komplettlösung
export function gematria(str: string): number {
  const map: { [key: string]: number } = {
    a: 1,
    b: 2,
    c: 3,
    d: 4,
    e: 5,
    f: 6,
    g: 7,
    h: 8,
    i: 9,
    k: 10,
    l: 20,
    m: 30,
    n: 40,
    o: 50,
    p: 60,
    q: 70,
    r: 80,
    s: 90,
    t: 100,
    u: 200,
    x: 300,
    y: 400,
    z: 500,
    j: 600,
    v: 700,
    w: 900,
  };

  return str
    .replace(/\s/g, "")
    .split("")
    .reduce((sum, letter) => sum + map[letter.toLowerCase()], 0);
}

Feedback

Schreib mir!