aoc2023/day02/lottacubes.go

176 lines
4.5 KiB
Go

package main
import (
"fmt"
"strings"
"bufio"
"os"
"strconv"
)
func check(e error) {
if e != nil {
panic(e)
}
}
var requiredCubes = map[string]int {
"red": 12,
"green": 13,
"blue": 14,
}
type possibleGame struct {
redIsPossible bool
greenIsPossible bool
blueIsPossible bool
}
type minimumSet struct {
red int
green int
blue int
}
func splitSets (s string) ([]string, int) {
// Every set is divided by ;
sets := strings.SplitN(s, ";", -1)
// Number of sets can vary, we need to have that info
numSets := len(sets)
return sets, numSets
}
func newGameSet(s string) map[string]int {
m := make(map[string]int)
tempNumColor := strings.SplitN(s, ",", -1)
for i := 0; i < len(tempNumColor); i++ {
TrimmedNumColor := strings.Trim(tempNumColor[i], " ")
NumColor := strings.SplitN(TrimmedNumColor, " ", -1)
m[NumColor[1]], _ = strconv.Atoi(NumColor[0])
}
return m
}
func CheckGame(mySet map[string]int, p *possibleGame) {
if (mySet["red"] > requiredCubes["red"]) {
p.redIsPossible = false
}
if (mySet["green"] > requiredCubes["green"]) {
p.greenIsPossible = false
}
if (mySet["blue"] > requiredCubes["blue"]) {
p.blueIsPossible = false
}
}
func findMinimumSet(mySet map[string]int, m *minimumSet) {
if (mySet["red"] > m.red) {
m.red = mySet["red"]
}
if (mySet["green"] > m.green) {
m.green = mySet["green"]
}
if (mySet["blue"] > m.blue) {
m.blue = mySet["blue"]
}
}
func PossibleGamesSum(s string, gn int, gt *int) {
// Initialize everything to true. If everything was set to false,
// we would have to check in both directions for every pass
isPossible := possibleGame{redIsPossible: true,
greenIsPossible: true,
blueIsPossible: true}
// We will pass a pointer so we can go one map at a time and
// still maintain the results
var isPossiblePoint *possibleGame
isPossiblePoint = &isPossible
// We receive a string with the sets, not split
// We proceed to split
sets, numSets := splitSets(s)
// We received a []string with sets and the number of sets
// Now it's time to create a map
var mySet map[string]int
// For every set we have in the current game
for i := 0; i < numSets; i++ {
// We create a map
mySet = newGameSet(sets[i])
// We check if the game is possible
CheckGame(mySet, isPossiblePoint)
}
if (isPossible.redIsPossible == true) &&
(isPossible.greenIsPossible == true) &&
(isPossible.blueIsPossible == true) {
*gt += gn
}
}
func PowerSetsSum(s string, pt *int) {
// In this case, we need an array of integers
minSet := minimumSet{red: 0, green: 0, blue: 0}
var minSetPoint *minimumSet
minSetPoint = &minSet
// We receive a string with the sets, not split
// We proceed to split
sets, numSets := splitSets(s)
// We received a []string with sets and the number of sets
// Now it's time to create a map
var mySet map[string]int
// For every set we have in the current game
for i := 0; i < numSets; i++ {
// We create a map
mySet = newGameSet(sets[i])
// We find the minimum set
findMinimumSet(mySet, minSetPoint)
}
*pt += (minSet.red * minSet.green * minSet.blue)
}
func PrintAndWait[T any](x T) {
fmt.Print(x)
fmt.Scanln()
}
func main() {
file, err := os.Open("../inputs/day02_input")
check(err)
defer file.Close()
// This variable will hold the game number
var gameNum int = 0
// This variable will hold the pointer of the sum of possible games
var gameSumPoint *int
gameSum := 0
gameSumPoint = &gameSum
// Variable for the sum of the power of the sets
var power int = 0
// Pointer to power, nice variable name
var powerPoint *int = &power
_ = gameNum
scanner := bufio.NewScanner(file)
for scanner.Scan() {
line := scanner.Text()
// Split the string in "Game N" and "cubes color"
gameAndCubes := strings.Split(line, ":")
// At this point, gameAndCubes[0] has "Game N"
// We convert the number that remains after replacing "Game " with ""
gameNum, _ = strconv.Atoi(strings.Replace(gameAndCubes[0], "Game ", "", 1))
// Now, for every game, split the sets
PossibleGamesSum(gameAndCubes[1], gameNum, gameSumPoint)
PowerSetsSum(gameAndCubes[1], powerPoint)
}
fmt.Printf("The sum of possible games is: %d\n", gameSum)
fmt.Printf("The sum of the power of sets is: %d\n", power)
}