Inhalt
Die Fakten:
Plattform: | codewars.com |
Name: | Tap Code Translation |
Level: | 7 kyu |
Sprache: | TypeScript |
Beschreibung:
Tap Code Translation
Tap code is a way to communicate using a series of taps and pauses for each letter. In this kata, we will use dots .
for the taps and whitespaces for the pauses.
The number of taps needed for each letter matches its coordinates in the following polybius square (note the c/k
position). Then you "tap" the row, a pause, then the column. Each letter is separated from others with a pause too.
1 2 3 4 5
1 A B C\K D E
2 F G H I J
3 L M N O P
4 Q R S T U
5 V W X Y Z
Input:
A lowercase string of a single word (no whitespaces or punctuation, only letters).
Output:
The encoded string as taps and pauses.
Examples
text = "dot"
"D" = (1, 4) = ". ...."
"O" = (3, 4) = "... ...."
"T" = (4, 4) = ".... ...."
output: ". .... ... .... .... ...."
"example" -> ". ..... ..... ... . . ... .. ... ..... ... . . ....."
"more" -> "... .. ... .... .... .. . ....."
Happy coding!
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
Man könnte jetzt hier ohne Ende loopen, if-Statements und haste-nich-jesehn...
Schritt 2
Da es nur 26 Buchstaben sind, schlage ich vor, wir erstellen hier einfach einen Schlüssel.
Schritt 3
Dann können wir die Buchstaben und deren Tap-Codes einfach im Schlüssel nachschlagen.
Code
Geil. Übersetzen wir unseren Pseudo-Code in TypeScript:
Lösungsschritte
Meine erste Zeile (ich habe text
in word
umbenannt):
export function tapCodeTranslation(word: string): string {
Jetzt erstellen wir unseren Schlüssel:
const letterTapCodes: { [key: string]: string } = {
A: ". .",
B: ". ..",
C: ". ...",
D: ". ....",
E: ". .....",
F: ".. .",
G: ".. ..",
H: ".. ...",
I: ".. ....",
J: ".. .....",
K: ". ...",
L: "... .",
M: "... ..",
N: "... ...",
O: "... ....",
P: "... .....",
Q: ".... .",
R: ".... ..",
S: ".... ...",
T: ".... ....",
U: ".... .....",
V: "..... .",
W: "..... ..",
X: "..... ...",
Y: "..... ....",
Z: "..... .....",
};
Wir stopfen alle Buchstaben mit ihren Codes in ein Objekt. TypeScript sagen wir, dass die Keys und Values Strings sind.
Jetzt können wir die Buchstaben des Input-Strings im Schlüssel easy "nachschlagen":
return word
.split("")
.map((letter) => letterTapCodes[letter.toUpperCase()])
.join(" ");
}
Erst wird der Input-String in ein Array umgewandelt. Dann können wir mit .map()
durch dieses Array loopen. Für jedes Element letter
geben wir den Value im letterTapCodes
-Objekt mit dem Key letter
zum Array zurück.
Komplettlösung
export function tapCodeTranslation(word: string): string {
const letterTapCodes: { [key: string]: string } = {
A: ". .",
B: ". ..",
C: ". ...",
D: ". ....",
E: ". .....",
F: ".. .",
G: ".. ..",
H: ".. ...",
I: ".. ....",
J: ".. .....",
K: ". ...",
L: "... .",
M: "... ..",
N: "... ...",
O: "... ....",
P: "... .....",
Q: ".... .",
R: ".... ..",
S: ".... ...",
T: ".... ....",
U: ".... .....",
V: "..... .",
W: "..... ..",
X: "..... ...",
Y: "..... ....",
Z: "..... .....",
};
return word
.split("")
.map((letter) => letterTapCodes[letter.toUpperCase()])
.join(" ");
}