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