|
@@ -8,7 +8,8 @@ import (
|
|
|
)
|
|
|
|
|
|
type Game struct {
|
|
|
- Words map[string]*Word
|
|
|
+ Words map[string]*Word
|
|
|
+ Length int
|
|
|
}
|
|
|
|
|
|
type Word struct {
|
|
@@ -38,9 +39,28 @@ func main() {
|
|
|
os.Exit(1)
|
|
|
}
|
|
|
|
|
|
- // get guess and Score from stdin
|
|
|
+ for i := 0; i < 3; i++ {
|
|
|
+ // get guess and Score from stdin
|
|
|
+ guess, score := getGuessAndScoreFromStdin()
|
|
|
+ fmt.Printf("Guess: %s, Score: %d\n", guess, score)
|
|
|
|
|
|
- // remove Words that don't match guess and Score
|
|
|
+ game.FilterWords(guess, score)
|
|
|
+
|
|
|
+ err = game.printSortedScores()
|
|
|
+ if err != nil {
|
|
|
+ fmt.Printf("Error printing sorted scores: %s\n", err)
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
+
|
|
|
+ if len(game.Words) == 1 {
|
|
|
+ for word, _ := range game.Words {
|
|
|
+ fmt.Printf("The word is: %s\n", word)
|
|
|
+ os.Exit(0)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // iterate through multiple turns
|
|
|
|
|
|
}
|
|
|
|
|
@@ -50,6 +70,44 @@ func NewGame() *Game {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+func (g Game) FilterWords(guess string, score int) {
|
|
|
+ for _, word := range g.Words {
|
|
|
+ if !word.MatchesGuess(guess, score) {
|
|
|
+ delete(g.Words, word.Word)
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func (w Word) MatchesGuess(guess string, numMatchingChars int) bool {
|
|
|
+
|
|
|
+ score := 0
|
|
|
+
|
|
|
+ for idx, letter := range w.Word {
|
|
|
+ if string(letter) == string(guess[idx]) {
|
|
|
+ score++
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return score == numMatchingChars
|
|
|
+}
|
|
|
+
|
|
|
+func getGuessAndScoreFromStdin() (string, int) {
|
|
|
+ reader := bufio.NewReader(os.Stdin)
|
|
|
+ fmt.Print("Enter Guess: ")
|
|
|
+ guess, _ := reader.ReadString('\n')
|
|
|
+ guess = guess[:len(guess)-1]
|
|
|
+
|
|
|
+ fmt.Print("Enter Score: ")
|
|
|
+ var score int
|
|
|
+ _, err := fmt.Scanf("%d", &score)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Printf("Error reading score: %s\n", err)
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
+
|
|
|
+ return guess, score
|
|
|
+}
|
|
|
+
|
|
|
func (g Game) printSortedScores() error {
|
|
|
|
|
|
var sortedWordScores []string
|
|
@@ -63,7 +121,8 @@ func (g Game) printSortedScores() error {
|
|
|
return g.Words[sortedWordScores[i]].Score > g.Words[sortedWordScores[j]].Score
|
|
|
})
|
|
|
|
|
|
- fmt.Print("\nWords sorted by Score:\n")
|
|
|
+ fmt.Println("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
|
|
|
+ fmt.Print("Words sorted by Score:\n")
|
|
|
for _, word := range sortedWordScores {
|
|
|
fmt.Printf("%s: %d\n", word, g.Words[word].Score)
|
|
|
}
|
|
@@ -104,8 +163,6 @@ func (g Game) getWordsFromStdin() error {
|
|
|
|
|
|
fmt.Println("Enter Words, one per line. Enter a period to end input.")
|
|
|
|
|
|
- wordLen := 0
|
|
|
-
|
|
|
for {
|
|
|
reader := bufio.NewReader(os.Stdin)
|
|
|
word, _ := reader.ReadString('\n')
|
|
@@ -115,11 +172,11 @@ func (g Game) getWordsFromStdin() error {
|
|
|
break
|
|
|
}
|
|
|
|
|
|
- if wordLen == 0 {
|
|
|
- wordLen = len(word)
|
|
|
+ if g.Length == 0 {
|
|
|
+ g.Length = len(word)
|
|
|
} else {
|
|
|
- if len(word) != wordLen {
|
|
|
- fmt.Printf("Error: All words must be the same length (%d), skipping: %s\n", wordLen, word)
|
|
|
+ if len(word) != g.Length {
|
|
|
+ fmt.Printf("Error: All words must be the same length (%d), skipping: %s\n", g.Length, word)
|
|
|
continue
|
|
|
}
|
|
|
}
|