mirror of
https://github.com/SrIzan10/adventofcode.git
synced 2026-06-06 00:46:56 +00:00
91 lines
2.1 KiB
Go
91 lines
2.1 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"regexp"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
func p1(data string) int {
|
|
mult, _ := matchMul(data)
|
|
sum := 0
|
|
for _, value := range mult {
|
|
sum += value
|
|
}
|
|
return sum
|
|
}
|
|
|
|
func p2(data string) int {
|
|
sum := 0
|
|
mulMult, mulIndexes := matchMul(data)
|
|
|
|
matchDos, _ := regexp.Compile(`do+\(\)`)
|
|
matchDonts, _ := regexp.Compile(`don't+\(\)`)
|
|
doIndex := matchDos.FindAllStringIndex(data, -1)
|
|
dontIndex := matchDonts.FindAllStringIndex(data, -1)
|
|
resolvedDos := sliceLast2dValue(doIndex)
|
|
resolvedDonts := sliceLast2dValue(dontIndex)
|
|
resolvedMul := sliceLast2dValue(mulIndexes)
|
|
|
|
for i, mulIndex := range resolvedMul {
|
|
lastControl := -1
|
|
lastWasDo := true
|
|
|
|
// find most recent control statement
|
|
for _, doIdx := range resolvedDos {
|
|
if doIdx < mulIndex && doIdx > lastControl {
|
|
lastControl = doIdx
|
|
lastWasDo = true
|
|
}
|
|
}
|
|
for _, dontIdx := range resolvedDonts {
|
|
if dontIdx < mulIndex && dontIdx > lastControl {
|
|
lastControl = dontIdx
|
|
lastWasDo = false
|
|
}
|
|
}
|
|
|
|
if lastWasDo {
|
|
sum += mulMult[i]
|
|
}
|
|
}
|
|
|
|
return sum
|
|
}
|
|
|
|
func main() {
|
|
data, err := os.ReadFile("input.txt")
|
|
if err != nil {
|
|
fmt.Println("File reading error", err)
|
|
return
|
|
}
|
|
|
|
fmt.Println("Part 1:", p1(string(data)))
|
|
fmt.Println("Part 2:", p2(string(data)))
|
|
}
|
|
|
|
func matchMul(data string) (mults []int, index [][]int) {
|
|
var multiplications []int
|
|
match, _ := regexp.Compile(`mul\(\d{1,3},\d{1,3}\)`)
|
|
resolved := match.FindAllString(data, -1)
|
|
resolvedIndex := match.FindAllStringIndex(data, -1)
|
|
|
|
numRegex, _ := regexp.Compile(`\d+,\d+`)
|
|
for _, resolves := range resolved {
|
|
num := strings.Split(numRegex.FindAllString(resolves, -1)[0], ",")
|
|
n0, _ := strconv.Atoi(num[0])
|
|
n1, _ := strconv.Atoi(num[1])
|
|
multiplications = append(multiplications, n0 * n1)
|
|
}
|
|
return multiplications, resolvedIndex
|
|
}
|
|
|
|
func sliceLast2dValue(array [][]int) []int {
|
|
var finalList []int
|
|
for _, value1 := range array {
|
|
finalList = append(finalList, value1[1])
|
|
}
|
|
return finalList
|
|
} |