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) }