Antwoord: 17 regels.
Maar hoe doen we dat dan? We kunnen een tabel maken met alle woorden van het woordenboek, maar met dit data formaat is het erg moeilijk om met suggesties te komen wanneer een woord niet in het woordenboek voorkomt. Dus we hebben iets nodig dat ook "gedeeltelijke matches" aankan.
Daarom kiezen we de volgende boomstructuur. Ieder woord wordt opgeknipt in stukjes, wanneer een stukje voorkomt in een ander woord. De woorden "gebouw" en "gebruik" beginnen beiden met "ge", dus dit is een stukje dat we apart kunnen zetten. Eigenlijk delen beide woorden "geb", maar voor de menselijke lezers beperken we ons tot leesbare lettergrepen.
Dus, ieder woordstukje moet zijn vervolg bijhouden, en bijhouden of het telt als een volledig woord. We kunnen in F# het volgende record definiëren:
woordDeel : string;
volgDelen : SpellingChecker list;
maaktCompleetWoord : bool;
}
let rec checkParse (ds:string) (mk:SpellingChecker list) =
let deelMatch = mk |> List.filter(fun e -> ds.StartsWith e.woordDeel)
if deelMatch.Length = 0 then false
else
let deelMatchData = deelMatch.Head
let nieuweDeelString = ds.Substring deelMatchData.woordDeel.Length
if nieuweDeelString = "" && deelMatchData.maaktCompleetWoord then true
else checkParse nieuweDeelString deelMatchData.volgDelen
checkParse w d
Leuk, maar hoe gaan we deze nu testen? Laten we eerst wat woorden in een woordenboek boom zetten:
let create w f c =
{ woordDeel = w; volgDelen = f; maaktCompleetWoord = c }
/// Woorden:
///
/// ver, verbruik, verbouw, verbouwen
/// gebouw, gebouwd, gebeuren
let en = create "en" [] true
let bouw = create "bouw" [en] true
let bruik = create "bruik" [] true
let ver = create "ver" [bruik; bouw] true
let d = create "d" [] true
let bouw2 = create "bouw" [d] true
let beuren = create "beuren" [] true
let ge = create "ge" [bouw2; beuren] false
let woordenboek = [ver ; ge]
spellCheck "ver" woordenboek
spellCheck "ge" woordenboek
spellCheck "gebouw" woordenboek
spellCheck "afwezig" woordenboek
Voor een volgende keer: hoe maken we een functie die een woord toevoegt aan het woordenboek...