Same, I initially also thought a|b and a|c implies a|c. However when I drew the graph of the example on paper, I suspected that all relations will be given, and coded it with that assumption, that turned out to be correct
Same, I initially also thought a|b and a|c implies a|c. However when I drew the graph of the example on paper, I suspected that all relations will be given, and coded it with that assumption, that turned out to be correct
I thought of Ernest & Celestine
Agree, I filled like half notebook with this game
Just a bunch of ifs and bounds checking. Part 2 was actually simpler.
func part1(W [][]rune) {
m := len(W)
n := len(W[0])
xmasCount := 0
for i := 0; i < m; i++ {
for j := 0; j < n; j++ {
if W[i][j] != 'X' {
continue
}
if j < n-3 && W[i][j+1] == 'M' && W[i][j+2] == 'A' && W[i][j+3] == 'S' {
// Horizontal left to right
xmasCount++
}
if j >= 3 && W[i][j-1] == 'M' && W[i][j-2] == 'A' && W[i][j-3] == 'S' {
// Horizontal right to left
xmasCount++
}
if i < m-3 && W[i+1][j] == 'M' && W[i+2][j] == 'A' && W[i+3][j] == 'S' {
// Vertical up to down
xmasCount++
}
if i >= 3 && W[i-1][j] == 'M' && W[i-2][j] == 'A' && W[i-3][j] == 'S' {
// Vertical down to up
xmasCount++
}
if j < n-3 && i < m-3 && W[i+1][j+1] == 'M' && W[i+2][j+2] == 'A' && W[i+3][j+3] == 'S' {
// Diagonal left to right and up to down
xmasCount++
}
if j >= 3 && i < m-3 && W[i+1][j-1] == 'M' && W[i+2][j-2] == 'A' && W[i+3][j-3] == 'S' {
// Diagonal right to left and up to down
xmasCount++
}
if j < n-3 && i >= 3 && W[i-1][j+1] == 'M' && W[i-2][j+2] == 'A' && W[i-3][j+3] == 'S' {
// Diagonal left to right and down to up
xmasCount++
}
if j >= 3 && i >= 3 && W[i-1][j-1] == 'M' && W[i-2][j-2] == 'A' && W[i-3][j-3] == 'S' {
// Diagonal right to left and down to up
xmasCount++
}
}
}
fmt.Println(xmasCount)
}
func part2(W [][]rune) {
m := len(W)
n := len(W[0])
xmasCount := 0
for i := 0; i <= m-3; i++ {
for j := 0; j <= n-3; j++ {
if W[i+1][j+1] != 'A' {
continue
}
if W[i][j] == 'M' && W[i][j+2] == 'M' && W[i+2][j] == 'S' && W[i+2][j+2] == 'S' {
xmasCount++
} else if W[i][j] == 'M' && W[i][j+2] == 'S' && W[i+2][j] == 'M' && W[i+2][j+2] == 'S' {
xmasCount++
} else if W[i][j] == 'S' && W[i][j+2] == 'S' && W[i+2][j] == 'M' && W[i+2][j+2] == 'M' {
xmasCount++
} else if W[i][j] == 'S' && W[i][j+2] == 'M' && W[i+2][j] == 'S' && W[i+2][j+2] == 'M' {
xmasCount++
}
}
}
fmt.Println(xmasCount)
}
func main() {
file, _ := os.Open("input.txt")
defer file.Close()
scanner := bufio.NewScanner(file)
var W [][]rune
for scanner.Scan() {
line := scanner.Text()
W = append(W, []rune(line))
}
part1(W)
part2(W)
}
Honestly this is soo much better, I’m not proud of my code at all haha. Thanks for sharing, definitely adding that | to my bag of tricks
Part 1, just find the regex groups, parse to int, and done.
func part1() {
file, _ := os.Open("input.txt")
defer file.Close()
scanner := bufio.NewScanner(file)
re := regexp.MustCompile(`mul\(([0-9]{1,3}),([0-9]{1,3})\)`)
product := 0
for scanner.Scan() {
line := scanner.Text()
submatches := re.FindAllStringSubmatch(line, -1)
for _, s := range submatches {
a, _ := strconv.Atoi(s[1])
b, _ := strconv.Atoi(s[2])
product += (a * b)
}
}
fmt.Println(product)
}
Part 2, not so simple. Ended up doing some weird hack with a map to check if the multiplication was enabled or not. Also instead of finding regex groups I had to find the indices, and then interpret what those mean… Not very readable code I’m afraid
func part2() {
file, _ := os.Open("input.txt")
defer file.Close()
scanner := bufio.NewScanner(file)
mulRE := regexp.MustCompile(`mul\(([0-9]{1,3}),([0-9]{1,3})\)`)
doRE := regexp.MustCompile(`do\(\)`)
dontRE := regexp.MustCompile(`don't\(\)`)
product := 0
enabled := true
for scanner.Scan() {
line := scanner.Text()
doIndices := doRE.FindAllStringIndex(line, -1)
dontIndices := dontRE.FindAllStringIndex(line, -1)
mulSubIndices := mulRE.FindAllStringSubmatchIndex(line, -1)
mapIndices := make(map[int]string)
for _, do := range doIndices {
mapIndices[do[0]] = "do"
}
for _, dont := range dontIndices {
mapIndices[dont[0]] = "dont"
}
for _, mul := range mulSubIndices {
mapIndices[mul[0]] = "mul"
}
nextMatch := 0
for i := 0; i < len(line); i++ {
val, ok := mapIndices[i]
if ok && val == "do" {
enabled = true
} else if ok && val == "dont" {
enabled = false
} else if ok && val == "mul" {
if enabled {
match := mulSubIndices[nextMatch]
a, _ := strconv.Atoi(string(line[match[2]:match[3]]))
b, _ := strconv.Atoi(string(line[match[4]:match[5]]))
product += (a * b)
}
nextMatch++
}
}
}
fmt.Println(product)
}
Really cool trick. I did a bunch of regex matching that I’m sure I won’t remember how it works few weeks from now, this is so much readable
Go. I actually I haven’t written a single line of Go since last year’s AoC so it’s a good excuse to go again (pun intended).
I liked Digital Minimalism by Cal Newport. I found myself reaching for my phone more often than I would few years back, and doomscrolling at nights, and I got some good tips from this book.
I wouldn’t say it solved all of my issues and I will be taking a look at the other books recommended here. But it did help me reduce screen time and focus more on tasks without feeling that I have to look at my phone every 5 minutes.
Dragon Ball characters, named Bibidi, Babidi and Boo, respectively.
(Ok the last one is called Majin Boo but he’s referred as Boo too)
Tbh these don’t even look that bad. Even many times you peel one of these and they are totally fine on the inside
Cosmo and Wanda don’t fool anyone nowadays
I feel you. And I work in tech (maybe you do too, idk). Point is, I’d need a bicycle AND a career change…
Oh whaat, hell yeah! Definitely gonna be having a look at this, thanks for sharing.
Still want that remake tho haha
I want a remake of the original Harry Potter 1 and 2 games from the PS1. Not asking much, anything that looks nicer than this would do
Taringa, it was the go-to place for everything, especially content in spanish
I was struggling to find a job and my friend looked at my resume and was like, dude you need to put more bullshit there, add a bunch of stuff, even if it’s fake, no one cares, everyone does it. After so much rejection I was willing to try anything, fortunately a company hired me just around those days. But next time I’ll probably have to take his advice…
Been a thing for ages in Finland, never thought it would actually expand haha
Go
Using a map to store u|v relations. Part 2 sorting with a custom compare function worked very nicely
spoiler
func main() { file, _ := os.Open("input.txt") defer file.Close() scanner := bufio.NewScanner(file) mapPages := make(map[string][]string) rulesSection := true middleSumOk := 0 middleSumNotOk := 0 for scanner.Scan() { line := scanner.Text() if line == "" { rulesSection = false continue } if rulesSection { parts := strings.Split(line, "|") u, v := parts[0], parts[1] mapPages[u] = append(mapPages[u], v) } else { update := strings.Split(line, ",") isOk := true for i := 1; i < len(update); i++ { u, v := update[i-1], update[i] if !slices.Contains(mapPages[u], v) { isOk = false break } } middlePos := len(update) / 2 if isOk { middlePage, _ := strconv.Atoi(update[middlePos]) middleSumOk += middlePage } else { slices.SortFunc(update, func(u, v string) int { if slices.Contains(mapPages[u], v) { return -1 } else if slices.Contains(mapPages[v], u) { return 1 } return 0 }) middlePage, _ := strconv.Atoi(update[middlePos]) middleSumNotOk += middlePage } } } fmt.Println("Part 1:", middleSumOk) fmt.Println("Part 2:", middleSumNotOk) }