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