RosettaCodeData/Task/Wordiff/Crystal/wordiff.cr
2026-04-30 12:34:36 -04:00

40 lines
1.2 KiB
Crystal

require "levenshtein"
words = File.read_lines("unixdict.txt").to_set
print "Enter player names separated by spaces: "
players = gets.not_nil!.split
current = words.select { |w| 3 <= w.size <= 4 }.sample
used = Set.new [current]
puts "Starting word is '#{current}'!"
players.cycle.skip(players.size-1).each_cons_pair do |previous, player|
print "#{player}, give me a wordiff from '#{current}': "
guess = gets.not_nil!
if guess.in?(words) && !guess.in?(used) && (dist = Levenshtein.distance(current, guess)) == 1
puts "Good!"
used << guess
current = guess
else
possible = words.select {|w|
!w.in?(used) && (w.size - guess.size).abs <= 1 && Levenshtein.distance(current, w) == 1
}
if !guess.in? words
puts "That word isn't in the dictionary."
elsif guess.in? used
puts "That word was already used."
else
puts "That word isn't a wordiff from '#{guess}'."
end
puts "You LOSE, #{player}!"
if possible.size > 0
puts "You could have entered: #{possible.sort.join(", ")}"
else
puts "(But you didn't have any word left to enter. Brilliant move by #{previous}!)"
end
puts "#{previous} WINS!"
break
end
end