mirror of
https://github.com/SrIzan10/adventofcode.git
synced 2026-06-06 00:46:56 +00:00
feat: day 3
This commit is contained in:
91
2024/3/3.go
Normal file
91
2024/3/3.go
Normal file
@@ -0,0 +1,91 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user