89 lines
2.9 KiB
Text
89 lines
2.9 KiB
Text
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
|