Wordiff: Difference between revisions

106,842 bytes added ,  2 months ago
Added FreeBASIC
m (spacing)
(Added FreeBASIC)
 
(29 intermediate revisions by 14 users not shown)
Line 1:
{{draft task|Games}}
 
Wordiff is an original game in which contestants take turns spelling new dictionary words that only differ from
Wordiff is an original game in which contestants take turns spelling new dictionary words of three or more characters that only differ from
the last by a change in one letter.
 
 
The change can be either:
Line 7 ⟶ 9:
# addition of one letter;
# or change in one letter.
 
 
Note:
Line 13 ⟶ 16:
* The first word must be three or four letters long.
 
;Task:
 
;Task:
Create a program to aid in the playing of the game by:
* Asking for contestants names.
Line 24 ⟶ 27:
:* and differs from the last appropriately.
 
 
;Optional stretch goal:
;Optional stretch goals:
Add timing.
* Add timing.
* Allow players to set a maximum playing time for the game.
* An internal timer accumulates how long each user takes to respond in their turns.
Line 33 ⟶ 37:
 
 
{{Template:Strings}}
<br><br>
 
=={{header|11l}}==
{{trans|Python}}
 
<syntaxhighlight lang="11l">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</syntaxhighlight>
 
{{out}}
<pre>
Space separated list of contestants: Paddy Maggie
Paddy: Input a wordiff from 'ease': case
Maggie: Input a wordiff from 'case': casey
Paddy: Input a wordiff from 'casey': carey
Maggie: Input a wordiff from 'carey': care
Paddy: Input a wordiff from 'care': make
More or less than exactly one character changed.
YOU HAVE LOST Paddy!
Could have used: are, bare, cadre, cafe, cage, cake, came, cane, cape, car ...
</pre>
 
=={{header|Arturo}}==
 
<syntaxhighlight lang="rebol">wordset: map read.lines relative "unixdict.txt" => strip
 
validAnswer?: function [answer][
if not? contains? wordset answer [
prints "\tNot a valid dictionary word."
return false
]
if contains? pastWords answer [
prints "\tWord already used."
return false
]
if 1 <> levenshtein answer last pastWords [
prints "\tNot a correct wordiff."
return false
]
return true
]
 
playerA: input "player A: what is your name? "
playerB: input "player B: what is your name? "
 
pastWords: new @[sample select wordset 'word [ contains? [3 4] size word ]]
 
print ["\nThe initial word is:" last pastWords "\n"]
 
current: playerA
while ø [
neww: strip input ~"|current|, what is the next word? "
while [not? validAnswer? neww][
neww: strip input " Try again: "
]
'pastWords ++ neww
current: (current=playerA)? -> playerB -> playerA
print ""
]</syntaxhighlight>
 
{{out}}
 
<pre>player A: what is your name? John
player B: what is your name? Bill
 
The initial word is: rare
John, what is the next word? bare
 
Bill, what is the next word? care
 
John, what is the next word? mares
Not a valid dictionary word. Try again: mare
 
Bill, what is the next word? bare
Word already used. Try again: dare
 
John, what is the next word? dares
Not a valid dictionary word. Try again: dire
 
Bill, what is the next word? dime
 
John, what is the next word? mime
Not a valid dictionary word. Try again: dame
 
Bill, what is the next word? famous
Not a correct wordiff. Try again: fame</pre>
 
=={{header|C++}}==
<syntaxhighlight lang="c++">
#include <algorithm>
#include <cstdint>
#include <fstream>
#include <iostream>
#include <random>
#include <string>
#include <vector>
 
std::vector<std::string> request_player_names() {
std::vector<std::string> player_names;
std::string player_name;
for ( uint32_t i = 0; i < 2; ++i ) {
std::cout << "Please enter the player's name: ";
std::getline(std::cin, player_name);
player_names.emplace_back(player_name);
}
return player_names;
}
 
bool is_letter_removed(const std::string& previous_word, const std::string& current_word) {
for ( uint64_t i = 0; i < previous_word.length(); ++i ) {
if ( current_word == previous_word.substr(0, i) + previous_word.substr(i + 1) ) {
return true;
}
}
return false;
}
 
bool is_letter_added(const std::string& previous_word, const std::string& current_word) {
return is_letter_removed(current_word, previous_word);
}
 
bool is_letter_changed(const std::string& previous_word, const std::string& current_word) {
if ( previous_word.length() != current_word.length() ) {
return false;
}
 
uint32_t difference_count = 0;
for ( uint64_t i = 0; i < current_word.length(); ++i ) {
difference_count += ( current_word[i] == previous_word[i] ) ? 0 : 1;
}
return difference_count == 1;
}
 
bool is_wordiff(const std::string& current_word,
const std::vector<std::string>& words_used,
const std::vector<std::string>& dictionary) {
if ( std::find(dictionary.begin(), dictionary.end(), current_word) == dictionary.end()
|| std::find(words_used.begin(), words_used.end(), current_word) != words_used.end() ) {
return false;
}
 
std::string previous_word = words_used.back();
return is_letter_changed(previous_word, current_word)
|| is_letter_removed(previous_word, current_word) || is_letter_added(previous_word, current_word);
}
 
std::vector<std::string> could_have_entered(const std::vector<std::string>& words_used,
const std::vector<std::string>& dictionary) {
std::vector<std::string> result;
for ( const std::string& word : dictionary ) {
if ( std::find(words_used.begin(), words_used.end(), word) == words_used.end()
&& is_wordiff(word, words_used, dictionary) ) {
result.emplace_back(word);
}
}
return result;
}
 
int main() {
std::vector<std::string> dictionary;
std::vector<std::string> starters;
std::fstream file_stream;
file_stream.open("../unixdict.txt");
std::string word;
while ( file_stream >> word ) {
dictionary.emplace_back(word);
if ( word.length() == 3 || word.length() == 4 ) {
starters.emplace_back(word);
}
}
 
std::random_device rand;
std::mt19937 mersenne_twister(rand());
std::shuffle(starters.begin(), starters.end(), mersenne_twister);
std::vector<std::string> words_used;
words_used.emplace_back(starters[0]);
 
std::vector<std::string> player_names = request_player_names();
bool playing = true;
uint32_t playerIndex = 0;
std::string current_word;
std::cout << "The first word is: " << words_used.back() << std::endl;
 
while ( playing ) {
std::cout << player_names[playerIndex] << " enter your word: ";
std::getline(std::cin, current_word);
if ( is_wordiff(current_word, words_used, dictionary) ) {
words_used.emplace_back(current_word);
playerIndex = ( playerIndex == 0 ) ? 1 : 0;
} else {
std::cout << "You have lost the game, " << player_names[playerIndex] << std::endl;
std::vector<std::string> missed_words = could_have_entered(words_used, dictionary);
std::cout << "You could have entered: [";
for ( uint64_t i = 0; i < missed_words.size() - 1; ++i ) {
std::cout << missed_words[i] << ", ";
}
std::cout << missed_words.back() << "]" << std::endl;
playing = false;
}
}
}
</syntaxhighlight>
{{ out }}
<pre>
Please enter the player's name: Alice
Please enter the player's name: Bob
The first word is: her
Alice enter your word: hem
Bob enter your word: hemp
Alice enter your word: temp
You have lost the game, Alice
You could have entered: [heap, help, hump, kemp]
</pre>
 
=={{header|FreeBASIC}}==
<syntaxhighlight lang="vbnet">REM Wordiff ' 10 march 2024 '
 
'--- Declaración de variables globales ---
Dim Shared As String words()
Dim Shared As String used()
Dim Shared As String player1
Dim Shared As String player2
Dim Shared As String player
Dim Shared As String prevWord
Dim Shared As Integer prevLen
 
'--- SUBrutinas y FUNCiones ---
Sub loadWords
Dim As Integer i, j, numLines
Dim As String linea
Open "unixdict.txt" For Input As #1
While Not Eof(1)
Line Input #1, linea
If Len(linea) = 3 Or Len(linea) = 4 Then
Redim Preserve words(numLines)
words(numLines) = linea
numLines += 1
End If
Wend
Close #1
End Sub
 
Sub Intro
Cls
Color 10, 0 '10, black
Locate 10, 30 : Print "---WORDIFF---"
Locate 12, 5 : Print "Por turnos, teclear nuevas palabras del "
Locate 13, 5 : Print "diccionario de tres o mas caracteres que "
Locate 14, 5 : Print "se diferencien de la anterior en una letra."
Color 14
Locate 16, 5 : Input "Player 1, please enter your name: ", player1
Locate 17, 5 : Input "Player 2, please enter your name: ", player2
If player2 = player1 Then player2 &= "2"
Color 7
End Sub
 
 
Function wordExists(word As String) As Boolean
For i As Integer = 0 To Ubound(words)
If words(i) = word Then Return True
Next i
Return False
End Function
 
Function wordUsed(word As String) As Boolean
For i As Integer = 0 To Ubound(used)
If used(i) = word Then Return True
Next i
Return False
End Function
 
Sub addUsedWord(word As String)
Redim Preserve used(Ubound(used) + 1)
used(Ubound(used)) = word
End Sub
 
Sub MenuPrincipal
Dim As String word
Dim As Integer i, changes, longi
Dim As Boolean ok
Cls
prevWord = words(Int(Rnd * Ubound(words)))
prevLen = Len(prevWord)
player = player1
Print "The first word is ";
Color 15 : Print prevWord : Color 7
Do
Color 7 : Print player; ", plays:";
Color 15 : Input " ", word
word = Lcase(word)
longi = Len(word)
ok = False
Color 12
If longi < 3 Then
Print "Words must be at least 3 letters long."
Elseif wordExists(word) = 0 Then
Print "Not in dictionary."
Elseif wordUsed(word) <> 0 Then
Print "Word has been used before."
Elseif word = prevWord Then
Print "You must change the previous word."
Elseif longi = prevLen Then
changes = 0
For i = 1 To longi
If Mid(word, i, 1) <> Mid(prevWord, i, 1) Then changes += 1
Next i
If changes > 1 Then
Print "Only one letter can be changed."
Else
ok = True
End If
Else
Print "Invalid change."
End If
If ok Then
prevLen = longi
prevWord = word
addUsedWord(word)
player = Iif(player = player1, player2, player1)
Else
Print "So, sorry "; player; ", you've lost!"
Dim As String KBD
Do: KBD = Inkey: Loop While KBD = ""
Exit Do
End If
Loop
End Sub
 
'--- Programa Principal ---
Randomize Timer
Intro
loadWords
MenuPrincipal
End
'--------------------------</syntaxhighlight>
 
=={{header|FutureBasic}}==
<syntaxhighlight lang="futurebasic">
output file "Wordiff" ' 27 november 2022 '
 
#plist NSAppTransportSecurity @{NSAllowsArbitraryLoads:YES}
 
begin enum 1
_playerLabel : _playerInput : _wordLabel : _wordInPlay : _playsLabel
_scrlView : _textView
_resignBtn : _againBtn : _quitBtn
end enum
 
begin globals
CFMutableArrayRef gWords, gNames, gUsed
gWords = fn MutableArrayWithCapacity( 0 )
gNames = fn MutableArrayWithCapacity( 0 )
gUsed = fn MutableArrayWithCapacity( 0 )
CFMutableStringRef gTxt
gTxt = fn MutableStringWithCapacity( 0 )
end globals
 
void local fn BuildInterface
window 1, @"Wordiff", ( 0, 0, 400, 450 ), NSWindowStyleMaskTitled + NSWindowStyleMaskClosable
// Fields for labels and input
textlabel _playerLabel, @"The players:", ( 0, 370, 148, 24 )
textlabel _wordLabel, @"Word in play:", ( 68, 409, 100, 24 )
textlabel _playsLabel, , ( 113, 370, 150, 24 )
textfield _playerInput, Yes, , ( 160, 372, 150, 24 )
textfield _wordInPlay, No, @". . .", ( 160, 412, 148, 24 )
ControlSetAlignment( _playerLabel, NSTextAlignmentRight )
ControlSetAlignment( _playerInput, NSTextAlignmentCenter )
ControlSetAlignment( _wordInPlay, NSTextAlignmentCenter )
ControlSetFormat( _playerInput, @"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", YES, 8, _formatCapitalize )
TextFieldSetTextColor( _wordLabel, fn ColorLightGray )
TextFieldSetTextColor( _wordInPlay, fn ColorLightGray )
TextFieldSetSelectable( _wordInPlay, No )
// Fields for computer feedback
scrollview _scrlView, ( 20, 60, 356, 300 ), NSBezelBorder
textview _textView, , _scrlView, , 1
ScrollViewSetHasVerticalScroller( _scrlView, YES )
TextViewSetTextContainerInset( _textView, fn CGSizeMake( 3, 3 ) )
TextSetFontWithName( _textView, @"Menlo", 12 )
TextSetColor( _textView, fn colorLightGray )
TextSetString( _textView, @"First, enter the name of each player and press Return to confirm. ¬
When done, press Return to start the game." )
// Buttons and menus
button _resignBtn, No, , @"Resign", ( 251, 15, 130, 32 )
button _againBtn, No, , @"New game", ( 114, 15, 130, 32 )
button _quitBtn, Yes, , @"Quit", ( 15, 15, 92, 32 )
filemenu 1 : menu 1, , No ' Nothing to file
editmenu 2 : menu 2, , No ' Nothing to edit
WindowMakeFirstResponder( 1, _playerInput ) ' Activate player input field
end fn
 
void local fn LoadWords
CFURLRef url
CFStringRef words, string
CFArrayRef tmp
CFRange range
// Fill the gWords list with just the lowercase words in unixdict
url = fn URLWithString( @"http://wiki.puzzlers.org/pub/wordlists/unixdict.txt" )
words = fn StringWithContentsOfURL( url, NSUTF8StringEncoding, NULL )
tmp = fn StringComponentsSeparatedByCharactersInSet( ( words ), fn CharacterSetNewlineSet )
for string in tmp
range = fn StringRangeOfStringWithOptions( string, @"^[a-z]+$", NSRegularExpressionSearch )
if range.location != NSNotFound then MutableArrayAddObject( gWords, string )
next
end fn
 
void local fn Say(str1 as CFStringRef, str2 as CFStringRef )
// Add strings to the computer feedback
fn MutableStringAppendString( gTxt, str1 )
fn MutableStringAppendString( gTxt, str2 )
TextSetString( _textView, gTxt )
TextScrollRangeToVisible( _textView, fn CFRangeMake( len( fn TextString( _textView ) ), 0) )
end fn
 
local fn CompareEqual( wrd1 as CFStringRef, wrd2 as CFStringRef ) as short
NSInteger i, k
CFStringRef a, b
//Find the number of differences in two strings
k = 0
for i = 0 to len( wrd1 ) - 1
a = mid( wrd1, i, 1 ) : b = mid( wrd2, i, 1 )
if fn StringIsEqual( a, b ) == No then k++
next
end fn = k
 
 
local fn ChopAndStitch( sShort as CFStringRef, sLong as CFStringRef ) as CFStringRef
NSInteger i, k
CFStringRef a, b
// Find the extra letter in the long string and remove it
k = 0
for i = 0 to len( sLong ) - 1
a = mid( sShort, i, 1 ) : b = mid( sLong, i, 1 )
if fn StringIsEqual( a, b ) == No then k = i : break ' Found it
next
a = left( sLong, k ) : b = mid( sLong, k + 1 ) 'Removed it
end fn = fn StringByAppendingString( a, b )
 
 
local fn WordiffWords( wrd1 as CFStringRef, wrd2 as CFStringRef ) as short
Short err = 0
// If a letter was added or removed, the strings should be identical after
// we remove the extra letter from the longest string.
// If they are the same length, the strings may differ at just one place.
select case
case len( wrd2 ) > len( wrd1 )
wrd2 = fn ChopAndStitch( wrd1, wrd2 )
if fn CompareEqual( wrd1, wrd2 ) != 0 then err = 1 ' Words identical?
case len( wrd1 ) > len( wrd2 )
wrd1 = fn ChopAndStitch( wrd2, wrd1 )
if fn CompareEqual( wrd1, wrd2 ) != 0 then err = 2
case len( wrd2 ) = len( wrd1 )
if fn CompareEqual( wrd1, wrd2 ) != 1 then err = 3 ' Only one change?
end select
end fn = err
 
local fn CheckWord( wrd1 as CFStringRef, wrd2 as CFStringRef ) as short
Short err = 0
// Preliminary tests to generate error codes
select case
case fn StringIsEqual( wrd1, wrd2 ) : err = 1
case len( wrd2 ) < 3 : err = 2
case len( wrd2 ) - len( wrd1 ) > 1 : err = 3
case len( wrd1 ) - len( wrd2 ) > 1 : err = 4
case fn ArrayContainsObject( gUsed, wrd2 ) == Yes : err = 5
case fn ArrayContainsObject( gWords, wrd2 ) == No : err = 6
end select
// Report error. If no error, check against Wordiff rules
select err
case 1 : fn Say( @"Don't be silly.", @"\n" )
case 2 : fn Say( @"New word must be three or more letters.", @"\n" )
case 3 : fn Say( @"Add just one letter, please.", @"\n" )
case 4 : fn Say( @"Delete just one letter, please.", @"\n" )
case 5 : fn Say( fn StringCapitalizedString( wrd2 ), @" was already used.\n" )
case 6 : fn Say( fn StringCapitalizedString( wrd2 ), @" is not in the dictionary.\n")
case 0
err = fn WordiffWords ( wrd1, wrd2 )
select err
case 1 : fn Say( @"Either change or add a letter.", @"\n" )
case 2 : fn Say( @"Either change or delete a letter.", @"\n" )
case 3 : fn Say( @"Don't change more than one letter.", @"\n")
end select
end select
end fn = err
 
void local fn ShowAllPossible
CFMutableArrayRef poss
CFStringRef wrd1, wrd2
NSUInteger i
// Check all words in dictionary, ignore error messages
poss = fn MutableArrayWithCapacity( 0 )
wrd1 = fn ControlStringValue( _wordInPlay )
for i = 0 to fn ArrayCount( gWords ) - 1
wrd2 = fn ArrayObjectAtIndex( gWords, i )
if fn fabs( len( wrd1 ) - len( wrd2 ) ) < 2 ' Not too long or short?
if len( wrd2 ) > 2 ' Has more than 2 chars?
if fn ArrayContainsObject( gUsed, wrd2 ) == No ' Not used before?
if ( fn WordiffWords( wrd1, wrd2 ) == 0 ) ' According to rules?
MutableArrayAddObject( poss, wrd2 ) ' Legal, so add to the pot
end if
end if
end if
end if
next
// Display legal words
fn Say( @"\n", fn ControlStringValue( _playerLabel ) )
if fn ArrayCount( poss ) > 0 ' Any words left?
fn Say( @" resigns, but could have chosen:", @"\n" )
fn MutableStringAppendString( gTxt, fn ArrayComponentsJoinedByString( poss, @", or " ) )
TextSetString( _textView, gTxt )
else
fn Say(@" resigns, there were no words left to play. ", @"New game?\n" )
end if
textfield _playerInput, No ' Just to be safe
end fn
 
void local fn Play
CFStringRef old, new, name
NSUInteger n
// Gather the info
name = fn ControlStringValue( _playerLabel )
new = fn ControlStringValue( _playerInput )
old = fn ArrayLastObject( gUsed )
if len( new ) == 0 then exit fn ' Just to be safe
fn Say(new, @"\n" )
if fn CheckWord( old, new ) == 0
// Input OK, so get ready next player
n = ( ( fn ArrayIndexOfObject( gNames, name ) + 1 ) mod fn ArrayCount( gNames ) )
name = fn ArrayObjectAtIndex( gNames, n )
textlabel _playerLabel, name
textfield _wordInPlay, , new
MutableArrayAddObject( gUsed, new )
end if
fn Say( name, @" plays: " )
textfield _playerInput, , @""
end fn
 
void local fn StartNewGame
CFStringRef name, wrd
NSUInteger n
// Pick a first player
n = rnd( fn ArrayCount( gNames ) )
name = fn ArrayObjectAtIndex( gNames, n - 1 )
// Pick a first word
MutableArrayRemoveAllObjects( gUsed )
do
n = rnd( fn ArrayCount( gWords ) ) - 1
wrd = fn ArrayObjectAtIndex( gWords, n )
until ( len( wrd ) = 3 ) or ( len( wrd ) = 4 )
MutableArrayAddObject( gUsed, wrd )
// Update window
ControlSetFormat( _playerInput, @"abcdefghijklmnopqrstuvwxyz", YES, 0, _formatLowercase )
fn Say( @"\n", @"Word in play: " ) : fn Say( wrd, @"\n" )
fn Say( name, @" plays: " )
textfield _wordInPlay, Yes, wrd
textlabel _playerLabel, name, (0, 370, 110, 24 )
textlabel _playsLabel, @"plays:"
textfield _playerInput, Yes
button _againBtn, Yes
button _resignBtn, Yes
WindowMakeFirstResponder( 1, _playerInput )
end fn
 
void local fn AskNames
CFStringRef name
name = fn ControlStringValue( _playerInput )
if len( name ) > 0 ' Another player?
MutableArrayAddObject( gNames, name )
fn Say( @"Welcome, ", name )
fn Say( @"!", @"\n" )
textfield _playerInput, YES, @""
else
if fn ArrayFirstObject( gNames ) != Null ' Just to be safe
fn StartNewGame
end if
end if
end fn
 
void local fn DoDialog( evt as Long, tag as Long )
select evt
case _btnClick
select tag
case _againBtn
fn MutableStringSetString( gTxt, @"" )
fn StartNewGame
case _resignBtn
button _resignBtn, No
fn ShowAllPossible
case _quitBtn : end
end select
case _textFieldDidEndEditing
if fn ArrayCount( gUsed ) == 0
fn AskNames
else
fn Play
end if
case _windowShouldClose : end
end select
end fn
 
on dialog fn DoDialog
 
fn BuildInterface
fn LoadWords
 
handleevents
</syntaxhighlight>
{{output}}
[[File:Wordiff FutureBasic.png]]
 
=={{header|J}}==
<syntaxhighlight lang="j">require'general/misc/prompt'
wordiff=: {{
words=: cutLF tolower fread'unixdict.txt'
c1=: prompt 'Name of contestant 1: '
c2=: prompt 'Name of contestant 2: '
hist=. ,word=. ({~ ?@#) (#~ 3 4 e.~ #@>) words
echo 'First word is ',toupper;word
echo 'each contestant must pick a new word'
echo 'the new word must either change 1 letter or remove or add 1 letter'
echo 'the new word cannot be an old word'
while. do.
next=. <tolower prompt 'Pick a new word ',c1,': '
if. next e. hist do.
echo next,&;' has already been picked'
break.
end.
if. -. next e. words do.
echo next,&;' is not in the dictionary'
break.
end.
if. next =&#&> word do.
if. 1~:+/d=.next~:&;word do.
echo next,&;' differs from ',word,&;' by ',(":d),' characters'
break.
end.
else.
if. -. */1=(-&#&>/,[:+/=/&>/)(\:#@>) next,word do.
echo next,&;' differs too much from ',;word
break.
end.
end.
hist=. hist,word=. next
'c2 c1'=. c1;c2
end.
echo c2,' wins'
}}</syntaxhighlight>
 
Example game:<syntaxhighlight lang="j"> wordiff''
Name of contestant 1: Jack
Name of contestant 2: Jill
First word is FLAX
each contestant must pick a new word
the new word must either change 1 letter or remove or add 1 letter
the new word cannot be an old word
Pick a new word Jack: flak
Pick a new word Jill: flap
Pick a new word Jack: clap
Pick a new word Jill: slap
Pick a new word Jack: slam
Pick a new word Jill: slap
slap has already been picked
Jack wins</syntaxhighlight>
 
=={{header|Java}}==
<syntaxhighlight lang="java">
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;
 
public final class Wordiff {
 
public static void main(String[] args) throws IOException {
List<String> dictionary = Files.lines(Path.of("unixdict.txt")).toList();
List<String> starters = dictionary.stream()
.filter( word -> word.length() == 3 || word.length() == 4 ).collect(Collectors.toList());
Collections.shuffle(starters);
List<String> wordsUsed = new ArrayList<String>();
wordsUsed.add(starters.get(0));
Scanner scanner = new Scanner(System.in);
List<String> playerNames = requestPlayerNames(scanner);
boolean playing = true;
int playerIndex = 0;
System.out.println("The first word is: " + wordsUsed.get(wordsUsed.size() - 1));
while ( playing ) {
System.out.println(playerNames.get(playerIndex) + " enter your word: ");
String currentWord = scanner.nextLine();
if ( isWordiff(currentWord, wordsUsed, dictionary) ) {
wordsUsed.add(currentWord);
playerIndex = ( playerIndex == 0 ) ? 1 : 0;
} else {
System.out.println("You have lost the game, " + playerNames.get(playerIndex));
System.out.println("You could have entered: " + couldHaveEntered(wordsUsed, dictionary));
playing = false;
}
}
scanner.close();
}
private static boolean isWordiff(String currentWord, List<String> wordsUsed, List<String> dictionary) {
if ( ! dictionary.contains(currentWord) || wordsUsed.contains(currentWord) ) {
return false;
}
String previousWord = wordsUsed.get(wordsUsed.size() - 1);
return isLetterChanged(previousWord, currentWord)
|| isLetterRemoved(previousWord, currentWord) || isLetterAdded(previousWord, currentWord);
}
private static boolean isLetterRemoved(String previousWord, String currentWord) {
for ( int i = 0; i < previousWord.length(); i++ ) {
if ( currentWord.equals(previousWord.substring(0, i) + previousWord.substring(i + 1)) ) {
return true;
}
}
return false;
}
private static boolean isLetterAdded(String previousWord, String currentWord) {
return isLetterRemoved(currentWord, previousWord);
}
 
private static boolean isLetterChanged(String previousWord, String currentWord) {
if ( previousWord.length() != currentWord.length() ) {
return false;
}
int differenceCount = 0;
for ( int i = 0; i < currentWord.length(); i++ ) {
differenceCount += ( currentWord.charAt(i) == previousWord.charAt(i) ) ? 0 : 1;
}
return differenceCount == 1;
}
private static List<String> couldHaveEntered(List<String> wordsUsed, List<String> dictionary) {
List<String> result = new ArrayList<String>();
for ( String word : dictionary ) {
if ( ! wordsUsed.contains(word) && isWordiff(word, wordsUsed, dictionary) ) {
result.add(word);
}
}
return result;
}
private static List<String> requestPlayerNames(Scanner scanner) {
List<String> playerNames = new ArrayList<String>();
for ( int i = 0; i < 2; i++ ) {
System.out.print("Please enter the player's name: ");
String playerName = scanner.nextLine().trim();
playerNames.add(playerName);
}
return playerNames;
}
 
}
</syntaxhighlight>
{{ out }}
<pre>
Please enter the player's name: Alice
Please enter the player's name: Bob
The first word is: tnt
Alice enter your word:
tent
Bob enter your word:
teat
Alice enter your word:
team
Bob enter your word:
steam
Alice enter your word:
steamy
Bob enter your word:
steams
You have lost the game, Bob
You could have entered: [seamy, steady]
</pre>
 
=={{header|Julia}}==
<langsyntaxhighlight lang="julia">isoneless(nw, ow) = any(i -> nw == ow[begin:i-1] * ow[i+1:end], eachindex(ow))
isonemore(nw, ow) = isoneless(ow, nw)
isonechanged(x, y) = length(x) == length(y) && count(i -> x[i] != y[i], eachindex(y)) == 1
onefrom(nw, ow) = isoneless(nw, ow) || isonemore(nw, ow ) || isonechanged(nw, ow)
 
function askprompt(prompt)
Line 45 ⟶ 922:
print(prompt)
ans = strip(readline())
println()
end
return ans
Line 51 ⟶ 927:
 
function wordiff(dictfile = "unixdict.txt")
wordlist = [w for w in split(read(dictfile, String), r"\s+") if !occursin(r"\W", w) && length(w) > 2]
starters = [w for w in wordlist if 3 <= length(w) <= 4]
 
timelimit = something(tryparse(Float64, askprompt("Time limit (min) or 0 for none: ")), 0.0)
 
players = split(askprompt("Enter players' names. Separate by commas: "), r"\s*,\s*")
times, word = Dict(player => Float32[] for player in players), rand(starters)
used, totalsecs, timestart = [word], timelimit * 60, time()
totalsecs, timestart = timelimit * 60, time()
while length(players) > 1
player = popfirst!(players)
Line 72 ⟶ 947:
push!(times[player], time() - playertimestart)
else
println("Wordiff choice incorrentincorrect. Player $player exits game.")
end
else # out of time
Line 82 ⟶ 957:
break
end
sleep(rand() * 103)
end
length(players) < 2 && println("Player $(first(players)) is the only one left, and wins the game.")
Line 88 ⟶ 963:
 
wordiff()
</langsyntaxhighlight>{{out}}
<pre>
Time limit (min) or 0 for none: 0.47
Enter players' names. Separate by commas: Ann, Betty, Sam, Ron, Kim
 
Ann, your move. The current word is city. Your worddiff? cite
Enter players' names. Separate by commas: sam,mary,ann,ron
 
sam, your move. The current word is shod. Your worddiff? shot
 
Correct.
maryBetty, your move. The current word is shotcite. Your worddiff? hotkite
 
Correct.
annSam, your move. The current word is hotkite. Your worddiff? hogkit
 
Correct.
ronRon, your move. The current word is hogkit. Your worddiff? logsit
Correct.
 
Kim, your move. The current word is sit. Your worddiff? it
Wordiff choice incorrect. Player Kim exits game.
Ann, your move. The current word is sit. Your worddiff? site
Correct.
Betty, your move. The current word is site. Your worddiff? mite
Sorry, time was up. Timing ranks for remaining players:
annRon: 34.1134 seconds average
maryAnn: 46.573265 seconds average
samSam: 6.4479189997 seconds average
</pre>
 
=={{header|Nim}}==
{{trans|Python}}
<langsyntaxhighlight Nimlang="nim">import httpclient, sequtils, sets, strutils, sugar
from unicode import capitalize
 
Line 231 ⟶ 1,106:
echo "You could have used: ", possibleWords[0..min(possibleWords.high, 20)].join(" ")
break
iplayer = (iplayer + 1) mod players.len</langsyntaxhighlight>
 
{{out}}
Line 244 ⟶ 1,119:
You could have used: then steen tern keen teem teet been seen ten</pre>
 
 
=={{header|Phix}}==
{{libheader|Phix/pGUI}}
Doubtless this could be improved in umpteen ways. Not quite yet working under pwa/p2js, but not too far off.
<!--<syntaxhighlight lang="phix">(phixonline)-->
<span style="color: #000080;font-style:italic;">-- demo\rosetta\Wordiff.exw</span>
<span style="color: #008080;">include</span> <span style="color: #000000;">pGUI</span><span style="color: #0000FF;">.</span><span style="color: #000000;">e</span>
<span style="color: #004080;">Ihandle</span> <span style="color: #000000;">dlg</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">playerset</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">playtime</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">current</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">remain</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">turn</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">input</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">help</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">quit</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">hframe</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">history</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">timer</span>
<span style="color: #004080;">atom</span> <span style="color: #000000;">t0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">t1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">t</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span>
<span style="color: #008080;">constant</span> <span style="color: #000000;">title</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"Wordiff game"</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">help_text</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"""
Allows single or multi-player modes.
Enter eg "Pete" to play every round yourself,
"Computer" for the computer to play itself,
"Pete,Computer" (or vice versa) to play against the computer,
"Pete,Sue" for a standard two-payer game, or
"Pete,Computer,Sue,Computer" for auto-plays between each human.
Words must be 3 letters or more, and present in the dictionary,
and not already used. You must key return (not tab) to finish
entering your move. The winner is the fastest average time, if
the timer is running (/non-zero), otherwise play continues
until player elimination leaves one (or less) remaining.
NB: Pressing tab or clicking on help will restart or otherwise
mess up the gameplay.
"""</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">help_cb</span><span style="color: #0000FF;">(</span><span style="color: #004080;">Ihandln</span> <span style="color: #000080;font-style:italic;">/*ih*/</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">IupMessage</span><span style="color: #0000FF;">(</span><span style="color: #000000;">title</span><span style="color: #0000FF;">,</span><span style="color: #000000;">help_text</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">IupSetFocus</span><span style="color: #0000FF;">(</span><span style="color: #000000;">dlg</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">return</span> <span style="color: #004600;">IUP_DEFAULT</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">over2</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">word</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">return</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">word</span><span style="color: #0000FF;">)></span><span style="color: #000000;">2</span> <span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">less5</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">word</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">return</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">word</span><span style="color: #0000FF;">)<</span><span style="color: #000000;">5</span> <span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">words</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">filter</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">unix_dict</span><span style="color: #0000FF;">(),</span><span style="color: #000000;">over2</span><span style="color: #0000FF;">),</span>
<span style="color: #000000;">valid</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{},</span>
<span style="color: #000000;">used</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{}</span>
<span style="color: #004080;">string</span> <span style="color: #000000;">word</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">lw</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">players</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">eliminated</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">times</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">averages</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">player</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">levenshtein1</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">w</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">bool</span> <span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">false</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">l</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">w</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #000000;">w</span><span style="color: #0000FF;">,</span><span style="color: #000000;">used</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">and</span> <span style="color: #7060A8;">abs</span><span style="color: #0000FF;">(</span><span style="color: #000000;">l</span><span style="color: #0000FF;">-</span><span style="color: #000000;">lw</span><span style="color: #0000FF;">)<=</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">costs</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">tagset</span><span style="color: #0000FF;">(</span><span style="color: #000000;">l</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">lw</span> <span style="color: #008080;">do</span>
<span style="color: #000000;">costs</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">i</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">newcost</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">pj</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">i</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">j</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">l</span> <span style="color: #008080;">do</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">cj</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">costs</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">],</span>
<span style="color: #000000;">ne</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">word</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]!=</span><span style="color: #000000;">w</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">],</span>
<span style="color: #000000;">nc</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">newcost</span><span style="color: #0000FF;">+</span><span style="color: #000000;">ne</span>
<span style="color: #000000;">pj</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">min</span><span style="color: #0000FF;">({</span><span style="color: #000000;">pj</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">cj</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">nc</span><span style="color: #0000FF;">})</span>
<span style="color: #000000;">costs</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">pj</span>
<span style="color: #000000;">newcost</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">cj</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">costs</span><span style="color: #0000FF;">[$-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]==</span><span style="color: #000000;">1</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">return</span> <span style="color: #000000;">res</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">procedure</span> <span style="color: #000000;">game_over</span><span style="color: #0000FF;">()</span>
<span style="color: #7060A8;">IupSetAttribute</span><span style="color: #0000FF;">(</span><span style="color: #000000;">history</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"APPENDITEM"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"GAME OVER:"</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">valid</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
<span style="color: #004080;">string</span> <span style="color: #000000;">valids</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"You could have had "</span><span style="color: #0000FF;">&</span><span style="color: #7060A8;">join</span><span style="color: #0000FF;">(</span><span style="color: #000000;">valid</span><span style="color: #0000FF;">,</span><span style="color: #008000;">", "</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">IupSetAttribute</span><span style="color: #0000FF;">(</span><span style="color: #000000;">history</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"APPENDITEM"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">valids</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #004080;">string</span> <span style="color: #000000;">winner</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"nobody"</span>
<span style="color: #004080;">atom</span> <span style="color: #000000;">best</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">1</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">players</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
<span style="color: #004080;">string</span> <span style="color: #000000;">player</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">players</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">],</span> <span style="color: #000000;">msg</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">eliminated</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">msg</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">": eliminated"</span>
<span style="color: #008080;">else</span>
<span style="color: #004080;">atom</span> <span style="color: #000000;">average</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">averages</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">average</span><span style="color: #0000FF;">=-</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">msg</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">": no times"</span>
<span style="color: #008080;">else</span>
<span style="color: #000000;">msg</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">": %.3f"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">average</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">best</span><span style="color: #0000FF;">=-</span><span style="color: #000000;">1</span> <span style="color: #008080;">or</span> <span style="color: #000000;">average</span><span style="color: #0000FF;"><</span><span style="color: #000000;">best</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">winner</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">player</span>
<span style="color: #000000;">best</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">average</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #7060A8;">IupSetAttribute</span><span style="color: #0000FF;">(</span><span style="color: #000000;">history</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"APPENDITEM"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">player</span><span style="color: #0000FF;">&</span><span style="color: #000000;">msg</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #7060A8;">IupSetAttribute</span><span style="color: #0000FF;">(</span><span style="color: #000000;">history</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"APPENDITEM"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"And the winner is: "</span><span style="color: #0000FF;">&</span><span style="color: #000000;">winner</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">IupSetInt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">history</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"TOPITEM"</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">IupGetInt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">history</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"COUNT"</span><span style="color: #0000FF;">))</span>
<span style="color: #7060A8;">IupSetInt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">timer</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"RUN"</span><span style="color: #0000FF;">,</span><span style="color: #004600;">false</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
<span style="color: #008080;">procedure</span> <span style="color: #000000;">score</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">move</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">times</span><span style="color: #0000FF;">[</span><span style="color: #000000;">player</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #000000;">times</span><span style="color: #0000FF;">[</span><span style="color: #000000;">player</span><span style="color: #0000FF;">],</span><span style="color: #7060A8;">time</span><span style="color: #0000FF;">()-</span><span style="color: #000000;">t1</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">averages</span><span style="color: #0000FF;">[</span><span style="color: #000000;">player</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sum</span><span style="color: #0000FF;">(</span><span style="color: #000000;">times</span><span style="color: #0000FF;">[</span><span style="color: #000000;">player</span><span style="color: #0000FF;">])/</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">times</span><span style="color: #0000FF;">[</span><span style="color: #000000;">player</span><span style="color: #0000FF;">])</span>
<span style="color: #000000;">used</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #000000;">used</span><span style="color: #0000FF;">,</span><span style="color: #000000;">move</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">word</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">move</span>
<span style="color: #000000;">lw</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">word</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">valid</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">filter</span><span style="color: #0000FF;">(</span><span style="color: #000000;">words</span><span style="color: #0000FF;">,</span><span style="color: #000000;">levenshtein1</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">IupSetStrAttribute</span><span style="color: #0000FF;">(</span><span style="color: #000000;">current</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"TITLE"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Current word: "</span><span style="color: #0000FF;">&</span><span style="color: #000000;">word</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
<span style="color: #008080;">procedure</span> <span style="color: #000000;">advance_player</span><span style="color: #0000FF;">()</span>
<span style="color: #008080;">while</span> <span style="color: #004600;">true</span> <span style="color: #008080;">do</span>
<span style="color: #000000;">player</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">mod</span><span style="color: #0000FF;">(</span><span style="color: #000000;">player</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">players</span><span style="color: #0000FF;">))+</span><span style="color: #000000;">1</span>
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #000000;">eliminated</span><span style="color: #0000FF;">[</span><span style="color: #000000;">player</span><span style="color: #0000FF;">]</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
<span style="color: #7060A8;">IupSetStrAttribute</span><span style="color: #0000FF;">(</span><span style="color: #000000;">turn</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"TITLE"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">players</span><span style="color: #0000FF;">[</span><span style="color: #000000;">player</span><span style="color: #0000FF;">]&</span><span style="color: #008000;">"'s turn:"</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">IupRefreshChildren</span><span style="color: #0000FF;">(</span><span style="color: #000000;">turn</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">IupSetStrAttribute</span><span style="color: #0000FF;">(</span><span style="color: #000000;">input</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"VALUE"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">word</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">t1</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">time</span><span style="color: #0000FF;">()</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
<span style="color: #008080;">procedure</span> <span style="color: #000000;">autoplay</span><span style="color: #0000FF;">()</span>
<span style="color: #008080;">while</span> <span style="color: #004600;">true</span> <span style="color: #008080;">do</span>
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">valid</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
<span style="color: #7060A8;">IupSetAttribute</span><span style="color: #0000FF;">(</span><span style="color: #000000;">history</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"APPENDITEM"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"no more moves possible"</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">game_over</span><span style="color: #0000FF;">()</span>
<span style="color: #008080;">exit</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">if</span> <span style="color: #7060A8;">proper</span><span style="color: #0000FF;">(</span><span style="color: #000000;">players</span><span style="color: #0000FF;">[</span><span style="color: #000000;">player</span><span style="color: #0000FF;">])!=</span><span style="color: #008000;">"Computer"</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #004080;">string</span> <span style="color: #000000;">move</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">valid</span><span style="color: #0000FF;">[</span><span style="color: #7060A8;">rand</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">valid</span><span style="color: #0000FF;">))]</span>
<span style="color: #7060A8;">IupSetStrAttribute</span><span style="color: #0000FF;">(</span><span style="color: #000000;">history</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"APPENDITEM"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%s's move: %s\n"</span><span style="color: #0000FF;">,</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">players</span><span style="color: #0000FF;">[</span><span style="color: #000000;">player</span><span style="color: #0000FF;">],</span><span style="color: #000000;">move</span><span style="color: #0000FF;">})</span>
<span style="color: #7060A8;">IupSetInt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">history</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"TOPITEM"</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">IupGetInt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">history</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"COUNT"</span><span style="color: #0000FF;">))</span>
<span style="color: #000000;">score</span><span style="color: #0000FF;">(</span><span style="color: #000000;">move</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">advance_player</span><span style="color: #0000FF;">()</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
<span style="color: #008080;">procedure</span> <span style="color: #000000;">new_game</span><span style="color: #0000FF;">(</span><span style="color: #004080;">bool</span> <span style="color: #000000;">bStart</span><span style="color: #0000FF;">=</span><span style="color: #004600;">true</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">bool</span> <span style="color: #000000;">bActive</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">players</span><span style="color: #0000FF;">)!=</span><span style="color: #000000;">0</span>
<span style="color: #7060A8;">IupSetInt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">turn</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"ACTIVE"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">bActive</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">IupSetInt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">input</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"ACTIVE"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">bActive</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">bActive</span> <span style="color: #008080;">and</span> <span style="color: #000000;">bStart</span> <span style="color: #008080;">then</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">w34</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">filter</span><span style="color: #0000FF;">(</span><span style="color: #000000;">words</span><span style="color: #0000FF;">,</span><span style="color: #000000;">less5</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">while</span> <span style="color: #004600;">true</span> <span style="color: #008080;">do</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">r</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">rand</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">w34</span><span style="color: #0000FF;">))</span>
<span style="color: #000000;">word</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">w34</span><span style="color: #0000FF;">[</span><span style="color: #000000;">r</span><span style="color: #0000FF;">]</span>
<span style="color: #000000;">lw</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">word</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">used</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">word</span><span style="color: #0000FF;">}</span>
<span style="color: #000000;">valid</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">filter</span><span style="color: #0000FF;">(</span><span style="color: #000000;">words</span><span style="color: #0000FF;">,</span><span style="color: #000000;">levenshtein1</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">valid</span><span style="color: #0000FF;">)!=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #000000;">w34</span><span style="color: #0000FF;">[</span><span style="color: #000000;">r</span><span style="color: #0000FF;">..</span><span style="color: #000000;">r</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{}</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
<span style="color: #7060A8;">IupSetStrAttribute</span><span style="color: #0000FF;">(</span><span style="color: #000000;">current</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"TITLE"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Current word: "</span><span style="color: #0000FF;">&</span><span style="color: #000000;">word</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">IupSetStrAttribute</span><span style="color: #0000FF;">(</span><span style="color: #000000;">turn</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"TITLE"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">players</span><span style="color: #0000FF;">[</span><span style="color: #000000;">player</span><span style="color: #0000FF;">]&</span><span style="color: #008000;">"'s turn:"</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">IupRefreshChildren</span><span style="color: #0000FF;">(</span><span style="color: #000000;">turn</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">IupSetStrAttribute</span><span style="color: #0000FF;">(</span><span style="color: #000000;">input</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"VALUE"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">word</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">IupSetAttribute</span><span style="color: #0000FF;">(</span><span style="color: #000000;">history</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"REMOVEITEM"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"ALL"</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">IupSetAttribute</span><span style="color: #0000FF;">(</span><span style="color: #000000;">history</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"APPENDITEM"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Initial word: "</span><span style="color: #0000FF;">&</span><span style="color: #000000;">word</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">IupSetInt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">history</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"TOPITEM"</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">IupGetInt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">history</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"COUNT"</span><span style="color: #0000FF;">))</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">l</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">players</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">eliminated</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #004600;">false</span><span style="color: #0000FF;">,</span><span style="color: #000000;">l</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">times</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">({},</span><span style="color: #000000;">l</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">averages</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">l</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">t0</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">time</span><span style="color: #0000FF;">()</span>
<span style="color: #000000;">t1</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">time</span><span style="color: #0000FF;">()</span>
<span style="color: #7060A8;">IupSetInt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">timer</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"RUN"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">t</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">autoplay</span><span style="color: #0000FF;">()</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">players_cb</span><span style="color: #0000FF;">(</span><span style="color: #004080;">Ihandln</span> <span style="color: #000080;font-style:italic;">/*playerset*/</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">players</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">split</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">IupGetAttribute</span><span style="color: #0000FF;">(</span><span style="color: #000000;">playerset</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"VALUE"</span><span style="color: #0000FF;">),</span><span style="color: #008000;">","</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">player</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span>
<span style="color: #000000;">new_game</span><span style="color: #0000FF;">(</span><span style="color: #004600;">false</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">return</span> <span style="color: #004600;">IUP_DEFAULT</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">playtime_cb</span><span style="color: #0000FF;">(</span><span style="color: #004080;">Ihandle</span> <span style="color: #000080;font-style:italic;">/*playtime*/</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">t</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupGetInt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">playtime</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"VALUE"</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">t</span> <span style="color: #008080;">then</span>
<span style="color: #7060A8;">IupSetInt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">remain</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"VISIBLE"</span><span style="color: #0000FF;">,</span><span style="color: #004600;">true</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">IupSetStrAttribute</span><span style="color: #0000FF;">(</span><span style="color: #000000;">remain</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"TITLE"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Remaining: %.1fs"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">t</span><span style="color: #0000FF;">})</span>
<span style="color: #008080;">else</span>
<span style="color: #7060A8;">IupSetInt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">remain</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"VISIBLE"</span><span style="color: #0000FF;">,</span><span style="color: #004600;">false</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #7060A8;">IupRefreshChildren</span><span style="color: #0000FF;">(</span><span style="color: #000000;">remain</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">return</span> <span style="color: #004600;">IUP_DEFAULT</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">focus_cb</span><span style="color: #0000FF;">(</span><span style="color: #004080;">Ihandle</span> <span style="color: #000080;font-style:italic;">/*input*/</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">new_game</span><span style="color: #0000FF;">(</span><span style="color: #004600;">true</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">return</span> <span style="color: #004600;">IUP_DEFAULT</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">procedure</span> <span style="color: #000000;">verify_move</span><span style="color: #0000FF;">()</span>
<span style="color: #004080;">string</span> <span style="color: #000000;">move</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupGetAttribute</span><span style="color: #0000FF;">(</span><span style="color: #000000;">input</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"VALUE"</span><span style="color: #0000FF;">),</span>
<span style="color: #000000;">okstr</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"ok"</span>
<span style="color: #004080;">bool</span> <span style="color: #000000;">ok</span> <span style="color: #0000FF;">=</span> <span style="color: #008080;">not</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #000000;">move</span><span style="color: #0000FF;">,</span><span style="color: #000000;">used</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #000000;">ok</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">okstr</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"already used"</span>
<span style="color: #008080;">else</span>
<span style="color: #000000;">ok</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #000000;">move</span><span style="color: #0000FF;">,</span><span style="color: #000000;">words</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #000000;">ok</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">okstr</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"not in dictionary"</span>
<span style="color: #008080;">else</span>
<span style="color: #000000;">ok</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #000000;">move</span><span style="color: #0000FF;">,</span><span style="color: #000000;">valid</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #000000;">ok</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">okstr</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"more than one change"</span>
<span style="color: #008080;">else</span>
<span style="color: #000000;">used</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #000000;">used</span><span style="color: #0000FF;">,</span><span style="color: #000000;">move</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #000000;">ok</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">okstr</span> <span style="color: #0000FF;">&=</span> <span style="color: #008000;">", player eliminated"</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #7060A8;">IupSetStrAttribute</span><span style="color: #0000FF;">(</span><span style="color: #000000;">history</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"APPENDITEM"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%s's move: %s %s\n"</span><span style="color: #0000FF;">,</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">players</span><span style="color: #0000FF;">[</span><span style="color: #000000;">player</span><span style="color: #0000FF;">],</span><span style="color: #000000;">move</span><span style="color: #0000FF;">,</span><span style="color: #000000;">okstr</span><span style="color: #0000FF;">})</span>
<span style="color: #7060A8;">IupSetInt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">history</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"TOPITEM"</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">IupGetInt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">history</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"COUNT"</span><span style="color: #0000FF;">))</span>
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #000000;">ok</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">eliminated</span><span style="color: #0000FF;">[</span><span style="color: #000000;">player</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">true</span>
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">players</span><span style="color: #0000FF;">)-</span><span style="color: #7060A8;">sum</span><span style="color: #0000FF;">(</span><span style="color: #000000;">eliminated</span><span style="color: #0000FF;">)<=</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">game_over</span><span style="color: #0000FF;">()</span>
<span style="color: #008080;">return</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">else</span>
<span style="color: #000000;">score</span><span style="color: #0000FF;">(</span><span style="color: #000000;">move</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #000000;">advance_player</span><span style="color: #0000FF;">()</span>
<span style="color: #000000;">autoplay</span><span style="color: #0000FF;">()</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">timer_cb</span><span style="color: #0000FF;">(</span><span style="color: #004080;">Ihandle</span> <span style="color: #000080;font-style:italic;">/*timer*/</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">atom</span> <span style="color: #000000;">e</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">time</span><span style="color: #0000FF;">()-</span><span style="color: #000000;">t0</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">e</span><span style="color: #0000FF;">>=</span><span style="color: #000000;">t</span> <span style="color: #008080;">then</span>
<span style="color: #7060A8;">IupSetStrAttribute</span><span style="color: #0000FF;">(</span><span style="color: #000000;">remain</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"TITLE"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Remaining: 0s"</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">IupSetInt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">turn</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"ACTIVE"</span><span style="color: #0000FF;">,</span><span style="color: #004600;">false</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">IupSetInt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">input</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"ACTIVE"</span><span style="color: #0000FF;">,</span><span style="color: #004600;">false</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">game_over</span><span style="color: #0000FF;">()</span>
<span style="color: #008080;">else</span>
<span style="color: #7060A8;">IupSetStrAttribute</span><span style="color: #0000FF;">(</span><span style="color: #000000;">remain</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"TITLE"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Remaining: %.1fs"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">t</span><span style="color: #0000FF;">-</span><span style="color: #000000;">e</span><span style="color: #0000FF;">})</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">return</span> <span style="color: #004600;">IUP_DEFAULT</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">quit_cb</span><span style="color: #0000FF;">(</span><span style="color: #004080;">Ihandle</span> <span style="color: #000080;font-style:italic;">/*ih*/</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">return</span> <span style="color: #004600;">IUP_CLOSE</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">key_cb</span><span style="color: #0000FF;">(</span><span style="color: #004080;">Ihandle</span> <span style="color: #000080;font-style:italic;">/*dlg*/</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">atom</span> <span style="color: #000000;">c</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">c</span><span style="color: #0000FF;">=</span><span style="color: #004600;">K_ESC</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #004600;">IUP_CLOSE</span>
<span style="color: #008080;">elsif</span> <span style="color: #000000;">c</span><span style="color: #0000FF;">=</span><span style="color: #004600;">K_CR</span> <span style="color: #008080;">then</span>
<span style="color: #004080;">Ihandln</span> <span style="color: #000000;">focus</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupGetFocus</span><span style="color: #0000FF;">()</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">focus</span><span style="color: #0000FF;">=</span><span style="color: #000000;">playerset</span> <span style="color: #008080;">then</span>
<span style="color: #7060A8;">IupSetFocus</span><span style="color: #0000FF;">(</span><span style="color: #000000;">playtime</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">elsif</span> <span style="color: #000000;">focus</span><span style="color: #0000FF;">=</span><span style="color: #000000;">playtime</span> <span style="color: #008080;">then</span>
<span style="color: #7060A8;">IupSetFocus</span><span style="color: #0000FF;">(</span><span style="color: #000000;">input</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">new_game</span><span style="color: #0000FF;">()</span>
<span style="color: #008080;">elsif</span> <span style="color: #000000;">focus</span><span style="color: #0000FF;">=</span><span style="color: #000000;">input</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">verify_move</span><span style="color: #0000FF;">()</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">elsif</span> <span style="color: #000000;">c</span><span style="color: #0000FF;">=</span><span style="color: #004600;">K_F1</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #000000;">help_cb</span><span style="color: #0000FF;">(</span><span style="color: #004600;">NULL</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">elsif</span> <span style="color: #000000;">c</span><span style="color: #0000FF;">=</span><span style="color: #004600;">K_cC</span> <span style="color: #008080;">then</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">n</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupGetInt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">history</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"COUNT"</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">hist</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">n</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">n</span> <span style="color: #008080;">do</span>
<span style="color: #000000;">hist</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupGetAttributeId</span><span style="color: #0000FF;">(</span><span style="color: #000000;">history</span><span style="color: #0000FF;">,</span><span style="color: #008000;">""</span><span style="color: #0000FF;">,</span><span style="color: #000000;">i</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #000000;">hist</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">join</span><span style="color: #0000FF;">(</span><span style="color: #000000;">hist</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"\n"</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">Ihandln</span> <span style="color: #000000;">clip</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupClipboard</span><span style="color: #0000FF;">()</span>
<span style="color: #7060A8;">IupSetAttribute</span><span style="color: #0000FF;">(</span><span style="color: #000000;">clip</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"TEXT"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">hist</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">clip</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupDestroy</span><span style="color: #0000FF;">(</span><span style="color: #000000;">clip</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">return</span> <span style="color: #004600;">IUP_CONTINUE</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #7060A8;">IupOpen</span><span style="color: #0000FF;">()</span>
<span style="color: #000000;">playerset</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupText</span><span style="color: #0000FF;">(</span><span style="color: #008000;">`EXPAND=HORIZONTAL`</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">playtime</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupText</span><span style="color: #0000FF;">(</span><span style="color: #008000;">`SPIN=Yes, SPINMIN=0, RASTERSIZE=48x`</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">IupSetCallback</span><span style="color: #0000FF;">({</span><span style="color: #000000;">playerset</span><span style="color: #0000FF;">,</span><span style="color: #000000;">playtime</span><span style="color: #0000FF;">},</span><span style="color: #008000;">"KILLFOCUS_CB"</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">Icallback</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"players_cb"</span><span style="color: #0000FF;">))</span>
<span style="color: #7060A8;">IupSetCallback</span><span style="color: #0000FF;">(</span><span style="color: #000000;">playtime</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"VALUECHANGED_CB"</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">Icallback</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"playtime_cb"</span><span style="color: #0000FF;">))</span>
<span style="color: #000000;">turn</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupLabel</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"turn"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"ACTIVE=NO"</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">input</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupText</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"EXPAND=HORIZONTAL, ACTIVE=NO"</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">IupSetCallback</span><span style="color: #0000FF;">(</span><span style="color: #000000;">input</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"GETFOCUS_CB"</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">Icallback</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"focus_cb"</span><span style="color: #0000FF;">))</span>
<span style="color: #000000;">current</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupLabel</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"Current word:"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"EXPAND=HORIZONTAL"</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">remain</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupLabel</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"Remaining time:0s"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"VISIBLE=NO"</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">history</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupList</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"VISIBLELINES=10, EXPAND=YES, CANFOCUS=NO"</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">hframe</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupFrame</span><span style="color: #0000FF;">(</span><span style="color: #000000;">history</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"TITLE=History, PADDING=5x4"</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">help</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupButton</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"Help (F1)"</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">Icallback</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"help_cb"</span><span style="color: #0000FF;">),</span><span style="color: #008000;">"PADDING=5x4"</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">quit</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupButton</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"Close"</span><span style="color: #0000FF;">,</span> <span style="color: #7060A8;">Icallback</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"quit_cb"</span><span style="color: #0000FF;">))</span>
<span style="color: #000000;">timer</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupTimer</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">Icallback</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"timer_cb"</span><span style="color: #0000FF;">),</span><span style="color: #000000;">100</span><span style="color: #0000FF;">,</span><span style="color: #004600;">false</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">buttons</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #7060A8;">IupFill</span><span style="color: #0000FF;">(),</span><span style="color: #000000;">help</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">IupFill</span><span style="color: #0000FF;">(),</span><span style="color: #000000;">quit</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">IupFill</span><span style="color: #0000FF;">()}</span>
<span style="color: #008080;">constant</span> <span style="color: #000000;">acp</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"ALIGNMENT=ACENTER, PADDING=5"</span>
<span style="color: #004080;">Ihandle</span> <span style="color: #000000;">settings</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupHbox</span><span style="color: #0000FF;">({</span><span style="color: #7060A8;">IupLabel</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"Contestant name(s)"</span><span style="color: #0000FF;">),</span>
<span style="color: #000000;">playerset</span><span style="color: #0000FF;">,</span>
<span style="color: #7060A8;">IupLabel</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"Timer (seconds)"</span><span style="color: #0000FF;">),</span>
<span style="color: #000000;">playtime</span><span style="color: #0000FF;">},</span><span style="color: #000000;">acp</span><span style="color: #0000FF;">),</span>
<span style="color: #000000;">currbox</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupHbox</span><span style="color: #0000FF;">({</span><span style="color: #000000;">current</span><span style="color: #0000FF;">,</span><span style="color: #000000;">remain</span><span style="color: #0000FF;">},</span><span style="color: #000000;">acp</span><span style="color: #0000FF;">),</span>
<span style="color: #000000;">numbox</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupHbox</span><span style="color: #0000FF;">({</span><span style="color: #000000;">turn</span><span style="color: #0000FF;">,</span><span style="color: #000000;">input</span><span style="color: #0000FF;">},</span><span style="color: #000000;">acp</span><span style="color: #0000FF;">),</span>
<span style="color: #000000;">btnbox</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupHbox</span><span style="color: #0000FF;">(</span><span style="color: #000000;">buttons</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"PADDING=40, NORMALIZESIZE=BOTH"</span><span style="color: #0000FF;">),</span>
<span style="color: #000000;">vbox</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupVbox</span><span style="color: #0000FF;">({</span><span style="color: #000000;">settings</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">currbox</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">numbox</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">hframe</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">btnbox</span><span style="color: #0000FF;">},</span> <span style="color: #008000;">"GAP=5,MARGIN=5x5"</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">dlg</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupDialog</span><span style="color: #0000FF;">(</span><span style="color: #000000;">vbox</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">`TITLE="%s", SIZE=500x220`</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">title</span><span style="color: #0000FF;">})</span>
<span style="color: #7060A8;">IupSetCallback</span><span style="color: #0000FF;">(</span><span style="color: #000000;">dlg</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"K_ANY"</span><span style="color: #0000FF;">,</span> <span style="color: #7060A8;">Icallback</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"key_cb"</span><span style="color: #0000FF;">))</span>
<span style="color: #7060A8;">IupShow</span><span style="color: #0000FF;">(</span><span style="color: #000000;">dlg</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #7060A8;">platform</span><span style="color: #0000FF;">()!=</span><span style="color: #004600;">JS</span> <span style="color: #008080;">then</span>
<span style="color: #7060A8;">IupMainLoop</span><span style="color: #0000FF;">()</span>
<span style="color: #7060A8;">IupClose</span><span style="color: #0000FF;">()</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<!--</syntaxhighlight>-->
{{out}}
A quick timed-out game:
<pre>
Initial word: farm
Pete's move: harm ok
Sue's move: warm ok
Pete's move: war ok
Sue's move: ward ok
Pete's move: hard ok
Sue's move: lard ok
Pete's move: card ok
GAME OVER:
You could have had bard, car, care, carl, carp, carr, cart, chard, cord, curd, yard
Pete: 2.519
Sue: 3.078
And the winner is: Pete
</pre>
Computer playing against itself:
<pre>
Initial word: sage
Computer's move: sake
Computer's move: take
Computer's move: wake
Computer's move: wave
Computer's move: ware
Computer's move: aware
Computer's move: awake
Computer's move: awaken
Computer's move: waken
Computer's move: taken
Computer's move: oaken
no more moves possible
GAME OVER:
Computer: 0.000
And the winner is: Computer
</pre>
 
=={{header|Perl}}==
Borrowed code from [[Levenshtein_distance]].
<syntaxhighlight lang="perl">use strict;
use warnings;
use feature 'say';
use List::Util 'min';
 
my %cache;
sub leven {
my ($s, $t) = @_;
return length($t) if $s eq '';
return length($s) if $t eq '';
$cache{$s}{$t} //=
do {
my ($s1, $t1) = (substr($s, 1), substr($t, 1));
(substr($s, 0, 1) eq substr($t, 0, 1))
? leven($s1, $t1)
: 1 + min(
leven($s1, $t1),
leven($s, $t1),
leven($s1, $t ),
);
};
}
 
print "What is your name?"; my $name = <STDIN>;
$name = 'Number 6';
say "What is your quest? Never mind that, I will call you '$name'";
say 'Hey! I am not a number, I am a free man!';
 
my @starters = grep { length() < 6 } my @words = grep { /.{2,}/ } split "\n", `cat unixdict.txt`;
 
my(%used,@possibles,$guess);
my $rounds = 0;
my $word = say $starters[ rand $#starters ];
 
while () {
say "Word in play: $word";
$used{$word} = 1;
@possibles = ();
for my $w (@words) {
next if abs(length($word) - length($w)) > 1;
push @possibles, $w if leven($word, $w) == 1 and ! defined $used{$w};
}
print "Your word? "; $guess = <STDIN>; chomp $guess;
last unless grep { $guess eq $_ } @possibles;
$rounds++;
$word = $guess;
}
 
my $already = defined $used{$guess} ? " '$guess' was already played but" : '';
 
if (@possibles) { say "\nSorry $name,${already} one of <@possibles> would have continued the game." }
else { say "\nGood job $name,${already} there were no possible words to play." }
say "You made it through $rounds rounds.";</syntaxhighlight>
{{out}}
<pre>What is your name? Sir Lancelot of Camelot
What is your quest? Never mind that, I'm going to call you 'Number 6'
Hey! I am not a number, I am a free man!
Word in play: ago
Your word? age
Word in play: age
Your word? rage
Word in play: rage
Your word? range
Word in play: range
Your word? orange
Word in play: orange
Your word?
 
Good job Number 6, there were no possible words to play.
You made it through 4 rounds.</pre>
 
=={{header|Python}}==
This is without timing, but ends by showing some wordiffs from the dictionary that could have worked on failure.
<langsyntaxhighlight lang="python"># -*- coding: utf-8 -*-
 
from typing import List, Tuple, Dict, Set
Line 353 ⟶ 1,648:
print("Could have used:",
', '.join(islice(could_have_got(wordiffs, dic), 10)), '...')
break</langsyntaxhighlight>
 
{{out}}
Line 382 ⟶ 1,677:
YOU HAVE LOST Paddy!
Could have used: titfer, witter, tittery, totter, titler, kitter, twitter, tilter, gitter, jitter ...</pre>
 
=={{header|Raku}}==
<syntaxhighlight lang="raku" line>my @words = 'unixdict.txt'.IO.slurp.lc.words.grep(*.chars > 2);
 
my @small = @words.grep(*.chars < 6);
 
use Text::Levenshtein;
 
my ($rounds, $word, $guess, @used, @possibles) = 0;
 
loop {
my $lev;
$word = @small.pick;
hyper for @words -> $this {
next if ($word.chars - $this.chars).abs > 1;
last if ($lev = distance($word, $this)[0]) == 1;
}
last if $lev;
}
 
my $name = ',';
 
#[[### Entirely unnecessary and unuseful "chatty repartee" but is required by the task
 
run 'clear';
$name = prompt "Hello player one, what is your name? ";
say "Cool. I'm going to call you Gomer.";
$name = ' Gomer,';
sleep 1;
say "\nPlayer two, what is your name?\nOh wait, this isn't a \"specified number of players\" game...";
sleep 1;
say "Nevermind.\n";
 
################################################################################]]
 
loop {
say "Word in play: $word";
push @used, $word;
@possibles = @words.hyper.map: -> $this {
next if ($word.chars - $this.chars).abs > 1;
$this if distance($word, $this)[0] == 1 and $this ∉ @used;
}
$guess = prompt "your word? ";
last unless $guess ∈ @possibles;
++$rounds;
say qww<Ok! Woot! 'Way to go!' Nice! 👍 😀>.pick ~ "\n";
$word = $guess;
}
 
my $already = ($guess ∈ @used) ?? " $guess was already played but" !! '';
 
if @possibles {
say "\nOops. Sorry{$name}{$already} one of [{@possibles}] would have continued the game."
} else {
say "\nGood job{$name}{$already} there were no possible words to play."
}
say "You made it through $rounds rounds.";</syntaxhighlight>
{{out|Sample output}}
<pre>Hello player one, what is your name? Burtram Redneck
Cool. I'm going to call you Gomer.
 
Player two, what is your name?
Oh wait, this isn't a "specified number of players" game...
Nevermind.
 
Word in play: howe
your word? how
Woot!
 
Word in play: how
your word? show
👍
 
Word in play: show
your word? shot
Nice!
 
Word in play: shot
your word? hot
😀
 
Word in play: hot
your word? hit
Way to go!
 
Word in play: hit
your word? mit
Nice!
 
Word in play: mit
your word? kit
😀
 
Word in play: kit
your word? nit
Woot!
 
Word in play: nit
your word? nip
😀
 
Word in play: nip
your word? snip
Ok!
 
Word in play: snip
your word? slip
Ok!
 
Word in play: slip
your word? slap
Way to go!
 
Word in play: slap
your word? lap
Woot!
 
Word in play: lap
your word? nap
Woot!
 
Word in play: nap
your word? nan
Nice!
 
Word in play: nan
your word? man
Nice!
 
Word in play: man
your word? men
Woot!
 
Word in play: men
your word? ben
Nice!
 
Word in play: ben
your word? ban
👍
 
Word in play: ban
your word? man
 
Oops. Sorry Gomer, man was already played but one of [bad bag bah bam band bane bang bank bar barn bat bay bean bin bon bran bun can dan fan han ian jan pan ran san tan van wan zan] would have continued the game.
You made it through 19 rounds.</pre>
 
=={{header|REXX}}==
<langsyntaxhighlight lang="rexx">/*REXX program acts as a host and allows two or more people to play the WORDIFF game.*/
signal on halt /*allow the user(s) to halt the game. */
parse arg iFID seed . /*obtain optional arguments from the CL*/
Line 430 ⟶ 1,871:
xu= x; upper xu /*obtain an uppercase version of word. */
if \@.xu then call over " doesn't exist in the dictionary: " iFID
if length(x) <3 then call over " must be at least three letters long."
if w <L then if \verL() then call over " isn't a legal letter deletion."
if w==L then if \verE() then call over " isn't a legal letter substitution."
Line 469 ⟶ 1,911:
@.= 0; starters= 0
do r=1 while lines(iFID)\==0 /*read each word in the file (word=X).*/
x= strip(linein(iFID)); y=x; upper x /*pick off a word from the input line. */
if \isMix(x) then iterate /*Not a suitable word for WORDIFF? Skip*/
y= x; upper x /*pick off a word from the input line. */
@.x= 1; L= length(x) /*set a semaphore for uppercased word. */
if L<3 | L>4 then iterate /*only use short words for the start. */
Line 476 ⟶ 1,920:
end /*#*/
if r>100 & starters> 10 then return /*is the dictionary satisfactory ? */
call ser 'Dictionary file ' _ iFID _ "wasn't found or isn't satisfactory."; exit 13</langsyntaxhighlight>
{{out|output|text=&nbsp; when using the default inputs:}}
<pre>
Line 537 ⟶ 1,981:
 
──────── game over, Teddy
</pre>
 
=={{header|V (Vlang)}}==
<syntaxhighlight lang="text">import os
import rand
import time
import arrays
 
fn is_wordiff(guesses []string, word string, dict []string) bool {
if word !in dict {
println('That word is not in the dictionary')
return false
}
if word in guesses {
println('That word has already been used')
return false
}
if word.len < guesses[guesses.len-1].len {
return is_wordiff_removal(word, guesses[guesses.len-1])
} else if word.len > guesses[guesses.len-1].len {
return is_wordiff_insertion(word, guesses[guesses.len-1])
}
return is_wordiff_change(word,guesses[guesses.len-1])
}
fn is_wordiff_removal(new_word string, last_word string) bool {
for i in 0..last_word.len {
if new_word == last_word[..i] + last_word[i+1..] {
return true
}
}
println('Word is not derived from previous by removal of one letter')
return false
}
fn is_wordiff_insertion(new_word string, last_word string) bool {
if new_word.len > last_word.len+1 {
println('More than one character insertion difference')
return false
}
mut a := new_word.split('')
b := last_word.split('')
for c in b {
idx := a.index(c)
if idx >=0 {
a.delete(idx)
}
}
if a.len >1 {
println('Word is not derived from previous by insertion of one letter')
return false
}
return true
}
fn is_wordiff_change(new_word string, last_word string) bool {
mut diff:=0
for i,c in new_word {
if c != last_word[i] {
diff++
}
}
if diff != 1 {
println('More or less than exactly one character changed')
return false
}
return true
}
 
fn main() {
words := os.read_lines('unixdict.txt')?
time_limit := os.input('Time limit (sec) or 0 for none: ').int()
players := os.input('Please enter player names, separated by commas: ').split(',')
 
dic_3_4 := words.filter(it.len in [3,4])
mut wordiffs := rand.choose<string>(dic_3_4,1)?
mut timing := [][]f64{len: players.len}
start := time.now()
mut turn_count := 0
for {
turn_start := time.now()
word := os.input('${players[turn_count%players.len]}: Input a wordiff from ${wordiffs[wordiffs.len-1]}: ')
if time_limit != 0.0 && time.since(start).seconds()>time_limit{
println('TIMES UP ${players[turn_count%players.len]}')
break
} else {
if is_wordiff(wordiffs, word, words) {
wordiffs<<word
}else{
timing[turn_count%players.len] << time.since(turn_start).seconds()
println('YOU HAVE LOST ${players[turn_count%players.len]}')
break
}
}
timing[turn_count%players.len] << time.since(turn_start).seconds()
turn_count++
}
println('Timing ranks:')
for i,p in timing {
sum := arrays.sum<f64>(p) or {0}
println(' ${players[i]}: ${sum/p.len:10.3 f} seconds average')
}
}
</syntaxhighlight>
{{out}}
<pre>Time limit (sec) or 0 for none: 40
Please enter player names, separated by commas: Steven,Amy,Jo
Steven: Input a wordiff from weld: weed
Amy: Input a wordiff from weed: seed
Jo: Input a wordiff from seed: steed
Steven: Input a wordiff from steed: stead
Amy: Input a wordiff from stead: seedy
More or less than exactly one character changed
YOU HAVE LOST Amy
Timing ranks:
Steven: 6.320 seconds average
Amy: 8.956 seconds average
Jo: 2.784 seconds average
</pre>
 
Line 544 ⟶ 2,103:
{{libheader|Wren-sort}}
Due to a bug in the System.clock method (basically it gets suspended whilst waiting for user input), it is not currently possible to add timings.
<langsyntaxhighlight ecmascriptlang="wren">import "random" for Random
import "./ioutil" for File, Input
import "./str" for Str
import "./sort" for Find
 
var rand = Random.new()
Line 568 ⟶ 2,127:
var len = word.count
var ok = false
if (Find.first(words,len word)< == -13) {
System.print("Words must be at least 3 letters long.")
} else if (Find.first(words, word) == -1) {
System.print("Not in dictionary.")
} else if (used.contains(word)) {
Line 626 ⟶ 2,187:
return
}
}</langsyntaxhighlight>
 
{{out}}
2,122

edits