|
@@ -0,0 +1,130 @@
|
|
|
|
+package main
|
|
|
|
+
|
|
|
|
+import (
|
|
|
|
+ "bufio"
|
|
|
|
+ "fmt"
|
|
|
|
+ "os"
|
|
|
|
+ "sort"
|
|
|
|
+)
|
|
|
|
+
|
|
|
|
+type Game struct {
|
|
|
|
+ Words map[string]*Word
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+type Word struct {
|
|
|
|
+ Word string
|
|
|
|
+ Score int
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func main() {
|
|
|
|
+
|
|
|
|
+ game := NewGame()
|
|
|
|
+
|
|
|
|
+ err := game.getWordsFromStdin()
|
|
|
|
+ if err != nil {
|
|
|
|
+ fmt.Printf("Error getting Words from stdin: %s\n", err)
|
|
|
|
+ os.Exit(1)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ err = game.scoreWordsByCommonLetterLocations()
|
|
|
|
+ if err != nil {
|
|
|
|
+ fmt.Printf("Error scoring Words: %s\n", err)
|
|
|
|
+ os.Exit(1)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ err = game.printSortedScores()
|
|
|
|
+ if err != nil {
|
|
|
|
+ fmt.Printf("Error printing sorted scores: %s\n", err)
|
|
|
|
+ os.Exit(1)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // get guess and Score from stdin
|
|
|
|
+
|
|
|
|
+ // remove Words that don't match guess and Score
|
|
|
|
+
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func NewGame() *Game {
|
|
|
|
+ return &Game{
|
|
|
|
+ Words: make(map[string]*Word),
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func (g Game) printSortedScores() error {
|
|
|
|
+
|
|
|
|
+ var sortedWordScores []string
|
|
|
|
+
|
|
|
|
+ for _, word := range g.Words {
|
|
|
|
+ sortedWordScores = append(sortedWordScores, word.Word)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // sort words by score
|
|
|
|
+ sort.Slice(sortedWordScores, func(i, j int) bool {
|
|
|
|
+ return g.Words[sortedWordScores[i]].Score > g.Words[sortedWordScores[j]].Score
|
|
|
|
+ })
|
|
|
|
+
|
|
|
|
+ fmt.Print("\nWords sorted by Score:\n")
|
|
|
|
+ for _, word := range sortedWordScores {
|
|
|
|
+ fmt.Printf("%s: %d\n", word, g.Words[word].Score)
|
|
|
|
+ }
|
|
|
|
+ fmt.Println("")
|
|
|
|
+
|
|
|
|
+ return nil
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func (g Game) scoreWordsByCommonLetterLocations() error {
|
|
|
|
+ letterIdxScores := make(map[int]map[string]int)
|
|
|
|
+
|
|
|
|
+ var lastWord string
|
|
|
|
+ for _, word := range g.Words {
|
|
|
|
+ word.Score = 0
|
|
|
|
+ lastWord = word.Word
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for idx, _ := range lastWord {
|
|
|
|
+ letterIdxScores[idx] = make(map[string]int)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for _, word := range g.Words {
|
|
|
|
+ for idx, letter := range word.Word {
|
|
|
|
+ letterIdxScores[idx][string(letter)]++
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for _, word := range g.Words {
|
|
|
|
+ for idx, letter := range word.Word {
|
|
|
|
+ word.Score += letterIdxScores[idx][string(letter)]
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return nil
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+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')
|
|
|
|
+ word = word[:len(word)-1]
|
|
|
|
+ if word == "." {
|
|
|
|
+ fmt.Println("got Words!")
|
|
|
|
+ break
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if wordLen == 0 {
|
|
|
|
+ wordLen = len(word)
|
|
|
|
+ } else {
|
|
|
|
+ if len(word) != wordLen {
|
|
|
|
+ fmt.Printf("Error: All words must be the same length (%d), skipping: %s\n", wordLen, word)
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ g.Words[word] = &Word{Word: word}
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return nil
|
|
|
|
+}
|