This commit is contained in:
2022-12-23 19:45:56 -08:00
commit 8792e5275a
77 changed files with 31154 additions and 0 deletions

166
solutions/day2/day2.go Normal file
View File

@@ -0,0 +1,166 @@
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)
}