Codewars Lösung | Arrh, grabscrab!


coden
Codewars. Achieve mastery through challenge.
Daniel Kaser|13. März 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:Arrh, grabscrab!
Level:6 kyu
Sprache:TypeScript

Beschreibung:

Pirates have notorious difficulty with enunciating. They tend to blur all the letters together and scream at people.

At long last, we need a way to unscramble what these pirates are saying.

Write a function that will accept a jumble of letters as well as a dictionary, and output a list of words that the pirate might have meant.

For example:

grabscrab( "ortsp", ["sport", "parrot", "ports", "matey"] )

Should return ["sport", "ports"].

Return matches in the same order as in the dictionary. Return an empty array if there are no matches.

Good luck!

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 können wir die Buchstaben im gegebenen Wort sortieren.

Schritt 2

Dann loopen wir durch das Dictionary.

Schritt 3

Wir sortieren die Buchstaben des aktuellen Wortes im Dictionary und vergleichen das Resultat mit unserem gegebenen Wort.

Schritt 4

Wenn beide sortierte Wörter gleich sind, fügen wir das aktuelle Wort zu einem Array hinzu.

Code

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

Lösungsschritte
Meine erste Zeile:
export function grabscrab(anagram: string, dictionary: string[]): string[] {
Als Erstes das Input-Anagram sortieren:
const sortedAnagram = [...anagram].sort().join("");
Dann der Loop:
  return dictionary.reduce((possibleMeanings: string[], word) => {

Ich habe mich hier für .reduce() entschieden. Die .reduce()-Method gibt hier am Ende ein “reduziertes” Array zurück, das nur noch die passenden Wörter enthält.

Das return füge ich hier gleich mit dazu.

Das aktuelle Wort sortieren:
const sortedWord = [...word].sort().join("");
Jetzt die beiden sortierten Wörter vergleichen:
if (sortedAnagram === sortedWord) return [...possibleMeanings, word];

Wenn beide Wörter gleich sind, fügen wir das aktuelle Wort zum neuen Array hinzu.

Ansonsten geben wir das Array (den Akkumulator) unverändert zurück:
    return possibleMeanings;
  }, []);
}

Das ist ähnlich wie beim reducen von Zahlen:

numbers.reduce((sum, curr) => (curr > 5 ? sum + curr : sum), 0);

Returnen brauchen wir nicht mehr, haben wir oben schon vor unserem .reduce()-Loop.

Voilá! 💪

Fragen?

Komplettlösung
export function grabscrab(anagram: string, dictionary: string[]): string[] {
  const sortedAnagram = [...anagram].sort().join("");

  return dictionary.reduce((possibleMeanings: string[], word) => {
    const sortedWord = [...word].sort().join("");

    if (sortedAnagram === sortedWord) return [...possibleMeanings, word];
    return possibleMeanings;
  }, []);
}

Feedback

Schreib mir!