🌅
This commit is contained in:
166
solutions/day2/day2.go
Normal file
166
solutions/day2/day2.go
Normal 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)
|
||||
}
|
||||
Reference in New Issue
Block a user