RosettaCodeData/Task/Wordiff/11l/wordiff.11l
2023-07-01 13:44:08 -04:00

89 lines
2.9 KiB
Text
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

V dict_fname = unixdict.txt
F load_dictionary(String fname = dict_fname)
Return appropriate words from a dictionary file
R Set(File(fname).read().split("\n").filter(word -> re:[a-z]{3,}.match(word)))
F get_players()
V names = input(Space separated list of contestants: )
R names.trim( ).split( , group_delimiters' 1B).map(n -> n.capitalize())
F is_wordiff_removal(word, String prev; comment = 1B)
Is word derived from prev by removing one letter?
V ans = word C Set((0 .< prev.len).map(i -> @prev[0 .< i]@prev[i + 1 ..]))
I !ans
I comment
print(Word is not derived from previous by removal of one letter.)
R ans
F counter(s)
DefaultDict[Char, Int] d
L(c) s
d[c]++
R d
F is_wordiff_insertion(String word, prev; comment = 1B) -> Bool
Is word derived from prev by adding one letter?
V diff = counter(word)
L(c) prev
I --diff[c] <= 0
diff.pop(c)
V diffcount = sum(diff.values())
I diffcount != 1
I comment
print(More than one character insertion difference.)
R 0B
V insert = Array(diff.keys())[0]
V ans = word C Set((0 .. prev.len).map(i -> @prev[0 .< i]@insert@prev[i ..]))
I !ans
I comment
print(Word is not derived from previous by insertion of one letter.)
R ans
F is_wordiff_change(String word, String prev; comment = 1B) -> Bool
Is word derived from prev by changing exactly one letter?
V diffcount = sum(zip(word, prev).map((w, p) -> Int(w != p)))
I diffcount != 1
I comment
print(More or less than exactly one character changed.)
R 0B
R 1B
F is_wordiff(wordiffs, word, dic, comment = 1B)
Is word a valid wordiff from wordiffs[-1] ?
I word !C dic
I comment
print(That word is not in my dictionary)
R 0B
I word C wordiffs
I comment
print(That word was already used.)
R 0B
I word.len < wordiffs.last.len
R is_wordiff_removal(word, wordiffs.last, comment)
E I word.len > wordiffs.last.len
R is_wordiff_insertion(word, wordiffs.last, comment)
R is_wordiff_change(word, wordiffs.last, comment)
F could_have_got(wordiffs, dic)
R (dic - Set(wordiffs)).filter(word -> is_wordiff(@wordiffs, word, @dic, comment' 0B))
V dic = load_dictionary()
V dic_3_4 = dic.filter(word -> word.len C (3, 4))
V start = random:choice(dic_3_4)
V wordiffs = [start]
V players = get_players()
V cur_player = 0
L
V name = players[cur_player]
cur_player = (cur_player + 1) % players.len
V word = input(name: Input a wordiff from 'wordiffs.last': ).trim( )
I is_wordiff(wordiffs, word, dic)
wordiffs.append(word)
E
print(YOU HAVE LOST name!)
print(Could have used: (could_have_got(wordiffs, dic)[0.<10]).join(, ) ...)
L.break