RosettaCodeData/Task/Wordiff/Wren/wordiff.wren
2024-03-06 22:25:12 -08:00

85 lines
2.6 KiB
Text

import "random" for Random
import "./ioutil" for File, Input
import "./str" for Str
import "./sort" for Find
var rand = Random.new()
var words = File.read("unixdict.txt").trim().split("\n")
var player1 = Input.text("Player 1, please enter your name : ", 1)
var player2 = Input.text("Player 2, please enter your name : ", 1)
if (player2 == player1) player2 = player2 + "2"
var words3or4 = words.where { |w| w.count == 3 || w.count == 4 }.toList
var n = words3or4.count
var firstWord = words3or4[rand.int(n)]
var prevLen = firstWord.count
var prevWord = firstWord
var used = []
var player = player1
System.print("\nThe first word is %(firstWord)\n")
while (true) {
var word = Str.lower(Input.text("%(player), enter your word : ", 1))
var len = word.count
var ok = false
if (len < 3) {
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)) {
System.print("Word has been used before.")
} else if (word == prevWord) {
System.print("You must change the previous word.")
} else if (len == prevLen) {
var changes = 0
for (i in 0...len) {
if (word[i] != prevWord[i]) {
changes = changes + 1
}
}
if (changes > 1) {
System.print("Only one letter can be changed.")
} else ok = true
} else if (len == prevLen + 1) {
var addition = false
var temp = word
for (i in 0...prevLen) {
if (word[i] != prevWord[i]) {
addition = true
temp = Str.delete(temp, i)
if (temp == prevWord) {
ok = true
}
break
}
}
if (!addition) ok = true
if (!ok) System.print("Invalid addition.")
} else if (len == prevLen - 1) {
var deletion = false
var temp = prevWord
for (i in 0...len) {
if (word[i] != prevWord[i]) {
deletion = true
temp = Str.delete(temp, i)
if (temp == word) {
ok = true
}
break
}
}
if (!deletion) ok = true
if (!ok) System.print("Invalid deletion.")
} else {
System.print("Invalid change.")
}
if (ok) {
prevLen = word.count
prevWord = word
used.add(word)
player = (player == player1) ? player2 : player1
} else {
System.print("So, sorry %(player), you've lost!")
return
}
}