• 19 Posts
  • 87 Comments
Joined 1 year ago
cake
Cake day: September 17th, 2023

help-circle
  • 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)
    }
    




  • Go

    Just a bunch of ifs and bounds checking. Part 2 was actually simpler.

    Code
    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)
    }
    


  • Go

    Part 1, just find the regex groups, parse to int, and done.

    Part 1
    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

    Part2
    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)
    }
    



  • 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.













  • 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…