167 lines
2.5 KiB
Go
167 lines
2.5 KiB
Go
package day2
|
|
|
|
import (
|
|
"bufio"
|
|
"fmt"
|
|
"os"
|
|
|
|
"golang.org/x/exp/utf8string"
|
|
)
|
|
|
|
type Move = int
|
|
|
|
const (
|
|
Rock Move = 1
|
|
Paper = 2
|
|
Scissors = 3
|
|
)
|
|
|
|
type Result = int
|
|
|
|
const (
|
|
Loss Result = 0
|
|
Tie = 3
|
|
Win = 6
|
|
)
|
|
|
|
func score(opponent Move, us Move) int {
|
|
switch opponent {
|
|
case Rock:
|
|
switch us {
|
|
case Rock:
|
|
return Rock + Tie
|
|
case Paper:
|
|
return Paper + Win
|
|
case Scissors:
|
|
return Scissors + Loss
|
|
}
|
|
|
|
case Paper:
|
|
switch us {
|
|
case Rock:
|
|
return Rock + Loss
|
|
case Paper:
|
|
return Paper + Tie
|
|
case Scissors:
|
|
return Scissors + Win
|
|
}
|
|
|
|
case Scissors:
|
|
switch us {
|
|
case Rock:
|
|
return Rock + Win
|
|
case Paper:
|
|
return Paper + Loss
|
|
case Scissors:
|
|
return Scissors + Tie
|
|
}
|
|
}
|
|
|
|
fmt.Println("PANIC: Unknown combo: them", opponent, "us", us)
|
|
return 0
|
|
}
|
|
|
|
func compute_move(opponent Move, goal Result) Move {
|
|
switch opponent {
|
|
case Rock:
|
|
switch goal {
|
|
case Loss:
|
|
return Scissors
|
|
case Tie:
|
|
return Rock
|
|
case Win:
|
|
return Paper
|
|
}
|
|
|
|
case Paper:
|
|
switch goal {
|
|
case Loss:
|
|
return Rock
|
|
case Tie:
|
|
return Paper
|
|
case Win:
|
|
return Scissors
|
|
}
|
|
|
|
case Scissors:
|
|
switch goal {
|
|
case Loss:
|
|
return Paper
|
|
case Tie:
|
|
return Scissors
|
|
case Win:
|
|
return Rock
|
|
}
|
|
}
|
|
|
|
fmt.Println("PANIC: Unknown combo: them", opponent, "goal", goal)
|
|
return 0
|
|
|
|
}
|
|
|
|
func move(r rune) Move {
|
|
switch r {
|
|
case 'A':
|
|
return Rock
|
|
case 'B':
|
|
return Paper
|
|
case 'C':
|
|
return Scissors
|
|
case 'X':
|
|
return Rock
|
|
case 'Y':
|
|
return Paper
|
|
case 'Z':
|
|
return Scissors
|
|
}
|
|
fmt.Println("PANIC: Unknown character", r)
|
|
return 0
|
|
}
|
|
|
|
func result(r rune) Result {
|
|
switch r {
|
|
case 'X':
|
|
return Loss
|
|
case 'Y':
|
|
return Tie
|
|
case 'Z':
|
|
return Win
|
|
}
|
|
fmt.Println("PANIC: Unknown character for result", r)
|
|
return 99
|
|
}
|
|
|
|
func Run(filename string) {
|
|
file, err := os.Open(filename)
|
|
|
|
if err != nil {
|
|
fmt.Println("Error opening file:", err)
|
|
return
|
|
}
|
|
|
|
scanner := bufio.NewScanner(file)
|
|
scanner.Split(bufio.ScanLines)
|
|
|
|
var total_score_base int = 0
|
|
var total_score_extended int = 0
|
|
|
|
for scanner.Scan() {
|
|
line := scanner.Text()
|
|
utf8 := utf8string.NewString(line)
|
|
|
|
opponent := move(utf8.At(0))
|
|
us := move(utf8.At(2))
|
|
|
|
total_score_base += score(opponent, us)
|
|
|
|
target := result(utf8.At(2))
|
|
computed_move := compute_move(opponent, target)
|
|
total_score_extended += score(opponent, computed_move)
|
|
}
|
|
|
|
file.Close()
|
|
|
|
fmt.Println("Total initial score is", total_score_base)
|
|
fmt.Println("Total score with back compute is", total_score_extended)
|
|
}
|