open System
type AP = | Alpha of string | Punkt of string
with static member cons (isPunct, s) = if not isPunct then Alpha s else Punkt s
[<EntryPoint>]
let main argv =
let s = "The quick brown fox hmm fox, jumps over the lazy dog dog."
printfn "Source : %A" (s)
let chartest x = Char.IsPunctuation x || Char.IsSeparator x || Char.IsWhiteSpace x
let dict = set [] |> ref
let xs = seq { let isChar = ref <| chartest s.[0]
let a = ref 0
for i in 0 .. s.Length - 1 do
if chartest s.[i] = !isChar then ()
else yield AP.cons(!isChar, s.[!a .. i - 1])
a := i
isChar := chartest s.[i]
yield AP.cons(!isChar, s.[!a .. s.Length - 1]) } |> Seq.toList
let rec loop xs acc =
match xs with
| [] -> List.rev acc
| Punkt s :: Alpha a :: t when Set.contains a !dict -> loop t acc
| Punkt s :: t -> loop t (s :: acc)
| Alpha a :: t when Set.contains a !dict -> loop t acc
| Alpha a :: t -> dict := Set.add a !dict; loop t (a :: acc)
let xs = String.Join("", loop xs [] |> List.toArray)
printfn "Result : %A" (xs)
0
b3BlbiBTeXN0ZW0KCnR5cGUgQVAgPSB8IEFscGhhIG9mIHN0cmluZyB8IFB1bmt0IG9mIHN0cmluZwogICAgd2l0aCBzdGF0aWMgbWVtYmVyIGNvbnMgKGlzUHVuY3QsIHMpID0gaWYgbm90IGlzUHVuY3QgdGhlbiBBbHBoYSBzIGVsc2UgUHVua3QgcwoKWzxFbnRyeVBvaW50Pl0KbGV0IG1haW4gYXJndiA9IAogICAgbGV0IHMgPSAiVGhlIHF1aWNrIGJyb3duICAgZm94IGhtbSBmb3gsIGp1bXBzIG92ZXIgdGhlIGxhenkgZG9nIGRvZy4iCiAgICBwcmludGZuICJTb3VyY2UgOiAlQSIgKHMpCiAgICBsZXQgY2hhcnRlc3QgeCA9IENoYXIuSXNQdW5jdHVhdGlvbiB4IHx8IENoYXIuSXNTZXBhcmF0b3IgeCB8fCBDaGFyLklzV2hpdGVTcGFjZSB4CiAgICBsZXQgZGljdCA9IHNldCBbXSB8PiByZWYKICAgIGxldCB4cyA9IHNlcSB7ICBsZXQgaXNDaGFyID0gcmVmIDx8IGNoYXJ0ZXN0IHMuWzBdCiAgICAgICAgICAgICAgICAgICAgbGV0IGEgPSByZWYgMAogICAgICAgICAgICAgICAgICAgIGZvciBpIGluIDAgLi4gcy5MZW5ndGggLSAxIGRvIAogICAgICAgICAgICAgICAgICAgICAgICBpZiBjaGFydGVzdCBzLltpXSA9ICFpc0NoYXIgdGhlbiAoKQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHlpZWxkIEFQLmNvbnMoIWlzQ2hhciwgcy5bIWEgLi4gaSAtIDFdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgOj0gaQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ2hhciA6PSBjaGFydGVzdCBzLltpXQogICAgICAgICAgICAgICAgICAgIHlpZWxkIEFQLmNvbnMoIWlzQ2hhciwgcy5bIWEgLi4gcy5MZW5ndGggLSAxXSkgfSB8PiBTZXEudG9MaXN0CiAgICBsZXQgcmVjIGxvb3AgeHMgYWNjID0gCiAgICAgICAgbWF0Y2ggeHMgd2l0aAogICAgICAgIHwgW10gLT4gTGlzdC5yZXYgYWNjCiAgICAgICAgfCBQdW5rdCBzIDo6IEFscGhhIGEgOjogdCB3aGVuIFNldC5jb250YWlucyBhICFkaWN0IC0+IGxvb3AgdCBhY2MKICAgICAgICB8IFB1bmt0IHMgOjogdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gbG9vcCB0IChzIDo6IGFjYykKICAgICAgICB8IEFscGhhIGEgOjogdCB3aGVuIFNldC5jb250YWlucyBhICFkaWN0ICAgIC0+IGxvb3AgdCBhY2MKICAgICAgICB8IEFscGhhIGEgOjogdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IGRpY3QgOj0gU2V0LmFkZCBhICFkaWN0OyBsb29wIHQgKGEgOjogYWNjKQogICAgbGV0IHhzID0gU3RyaW5nLkpvaW4oIiIsIGxvb3AgeHMgW10gfD4gTGlzdC50b0FycmF5KQoKICAgIHByaW50Zm4gIlJlc3VsdCA6ICVBIiAoeHMpCiAgICAwCg==