Codewars Lösung | Tap Code Translation


coden
Codewars. Achieve mastery through challenge.
Daniel Kaser|11. 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: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.

Voilá! 💪

Schöner Quickie.

Fragen?

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

Feedback

Schreib mir!