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  }