github.com/frodejac/aoc-2022@v0.0.0-20221213081734-037c741b1c89/internal/aoc/day01/day01.go (about) 1 package day01 2 3 import ( 4 "strconv" 5 "strings" 6 ) 7 8 type Day01 struct { 9 rounds []rpsRound 10 } 11 12 func Solver(input []byte) *Day01 { 13 return &Day01{rounds: parseInput(string(input))} 14 } 15 16 type rpsRound struct { 17 elf int 18 player int 19 } 20 21 var rpsMoves = map[string]int{ 22 "X": 1, 23 "Y": 2, 24 "Z": 3, 25 "A": 1, 26 "B": 2, 27 "C": 3, 28 } 29 30 var roundScore = map[int]int{ 31 0: 3, 32 1: 0, 33 2: 6, 34 } 35 36 var roundMod = map[int]int{ 37 1: 1, 38 2: -1, 39 3: 0, 40 } 41 42 func parseInput(input string) []rpsRound { 43 input = strings.TrimSpace(input) 44 lines := strings.Split(input, "\n") 45 rounds := make([]rpsRound, len(lines)) 46 for i := 0; i < len(lines); i++ { 47 plays := strings.Split(lines[i], " ") 48 rounds[i] = rpsRound{elf: rpsMoves[plays[0]], player: rpsMoves[plays[1]]} 49 } 50 return rounds 51 } 52 53 func (d *Day01) SolvePart1() string { 54 total := 0 55 for _, r := range d.rounds { 56 total += roundScore[(r.elf-r.player+3)%3] + r.player 57 } 58 return strconv.Itoa(total) 59 } 60 61 func (d *Day01) SolvePart2() string { 62 total := 0 63 for _, r := range d.rounds { 64 total += (r.elf+roundMod[r.player])%3 + 1 + (r.player-1)*3 65 } 66 return strconv.Itoa(total) 67 }