Wordiff: Difference between revisions

Content added Content deleted
m (→‎{{header|REXX}}: shown a different game.)
(julia example)
Line 31: Line 31:
:* That last player must have entered a wordiff or loses.
:* That last player must have entered a wordiff or loses.
:* If the game is timed-out, the loser is the person who took the longest `average` time to answer in their rounds.
:* If the game is timed-out, the loser is the person who took the longest `average` time to answer in their rounds.



=={{header|Julia}}==
<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)
ans = ""
while isempty(ans)
print(prompt)
ans = strip(readline())
println()
end
return ans
end

function wordiff(dictfile = "unixdict.txt")
wordlist = [w for w in split(read(dictfile, String), r"\s+") if !occursin(r"\W", w)]
starters = [w for w in wordlist if 3 <= length(w) <= 4]

timelimit = something(tryparse(Float64, askprompt("Time limit (min) or 0 for none: ")), 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 = [word]
totalsecs, timestart = timelimit * 60, time()
while length(players) > 1
player = popfirst!(players)
playertimestart = time()
newword = askprompt("$player, your move. The current word is $word. Your worddiff? ")
if timestart + totalsecs > time()
if onefrom(newword, word) && !(newword in used) && lowercase(newword) in wordlist
println("Correct.")
push!(players, player)
word = newword
push!(used, newword)
push!(times[player], time() - playertimestart)
else
println("Wordiff choice incorrent. Player $player exits game.")
end
else # out of time
println("Sorry, time was up. Timing ranks for remaining players:")
avtimes = Dict(p => isempty(times[p]) ? NaN : sum(times[p]) / length(times[p])
for p in players)
sort!(players, lt = (x, y) -> avtimes[x] < avtimes[y])
foreach(p -> println(" $p:", lpad(avtimes[p], 10), " seconds average"), players)
break
end
sleep(rand() * 10)
end
length(players) < 2 && println("Player $(first(players)) is the only one left, and wins the game.")
end

wordiff()
</lang>{{out}}
<pre>
Time limit (min) or 0 for none: 0.4

Enter players' names. Separate by commas: sam,mary,ann,ron

sam, your move. The current word is shod. Your worddiff? shot

Correct.
mary, your move. The current word is shot. Your worddiff? hot

Correct.
ann, your move. The current word is hot. Your worddiff? hog

Correct.
ron, your move. The current word is hog. Your worddiff? log

Sorry, time was up. Timing ranks for remaining players:
ann: 3.1 seconds average
mary: 4.573 seconds average
sam: 6.447 seconds average
</pre>



=={{header|Nim}}==
=={{header|Nim}}==