• 6 Posts
  • 22 Comments
Joined 2 years ago
cake
Cake day: September 17th, 2023

help-circle
  • Go

    Now I’m behind by 1 day, will try to catch up.

    For part 2 I spent a good while thinking about it, then when I convinced myself my plan could work, struggled a bit with the implementation. But it worked in the end. Basically grid[i][j] is how many different ways you can reach a cell. Start at 1 on the S cell, then propagate the values down and keep adding up the nums when you reach cells through different paths. The answer is the sum of the nums in the last row.

    spoiler
    func part2() {
    	// file, _ := os.Open("sample.txt")
    	file, _ := os.Open("input.txt")
    	defer file.Close()
    	scanner := bufio.NewScanner(file)
    
    	input := [][]rune{}
    
    	for scanner.Scan() {
    		line := []rune(scanner.Text())
    		input = append(input, line)
    	}
    
    	m := len(input)
    	n := len(input[0])
    	grid := make([][]int, m)
    	for i := range m {
    		grid[i] = make([]int, n)
    	}
    
    	for i := range m {
    		for j := range n {
    			c := input[i][j]
    			if i == 0 {
    				if c == 'S' {
    					grid[i][j] = 1
    				}
    				continue
    			}
    			if c == '^' {
    				grid[i][j-1] += grid[i-1][j]
    				grid[i][j+1] += grid[i-1][j]
    			} else {
    				grid[i][j] = grid[i][j] + grid[i-1][j]
    			}
    		}
    	}
    
    	paths := 0
    	for j := range n {
    		paths += grid[m-1][j]
    	}
    
    	fmt.Println(paths)
    }
    

  • Go

    Part 2: Read the whole input in a rune matrix. Scan it column by column, store the numbers as you go, ignoring all spaces, and store the operand when you find it. When you hit an empty column or the end, do the operation and add it to the total.

    spoiler
    func part2() {
    	// file, _ := os.Open("sample.txt")
    	file, _ := os.Open("input.txt")
    	defer file.Close()
    	scanner := bufio.NewScanner(file)
    
    	chars := [][]rune{}
    	for scanner.Scan() {
    		chars = append(chars, []rune(scanner.Text()))
    	}
    
    	m := len(chars)
    	n := len(chars[0])
    	var op rune
    	nums := []int{}
    	total := 0
    
    	for j := range n {
    		current := []rune{}
    		for i := range m {
    			if chars[i][j] == '+' || chars[i][j] == '*' {
    				op = chars[i][j]
    			} else if chars[i][j] != ' ' {
    				current = append(current, chars[i][j])
    			}
    		}
    		if len(current) > 0 {
    			x, _ := strconv.Atoi(string(current))
    			nums = append(nums, x)
    		}
    		if len(current) == 0 || j == n-1 {
    			result := 0
    			if op == '*' {
    				result = 1
    			}
    			for _, x := range nums {
    				if op == '+' {
    					result = result + x
    				} else {
    					result = result * x
    				}
    			}
    			total += result
    			nums = []int{}
    		}
    	}
    
    	fmt.Println(total)
    }
    

  • First I tried to to part 2 with a very poor regex strategy and the performance was abysmal. Switched to plain substrings and boom, instant result.

    Golang

    func part1() {
    	ranges := readInput()
    	invalidSum := 0
    
    	for _, r := range ranges {
    		parts := strings.Split(r, "-")
    		start, _ := strconv.Atoi(parts[0])
    		end, _ := strconv.Atoi(parts[1])
    
    		for num := start; num <= end; num++ {
    			current := strconv.Itoa(num)
    			n := len(current)
    			if n%2 != 0 {
    				continue
    			}
    			left := current[:n/2]
    			right := current[n/2:]
    			if left == right {
    				invalidSum += num
    			}
    		}
    	}
    
    	fmt.Println(invalidSum)
    }
    
    func part2() {
    	ranges := readInput()
    	invalidSum := 0
    
    	for _, r := range ranges {
    		parts := strings.Split(r, "-")
    		start, _ := strconv.Atoi(parts[0])
    		end, _ := strconv.Atoi(parts[1])
    
    		for num := start; num <= end; num++ {
    			current := strconv.Itoa(num)
    			n := len(current)
    
    			for index := 1; index <= n/2; index++ {
    				if n%index != 0 {
    					continue
    				}
    
    				left := 0
    				right := index
    				prefix := current[left:right]
    				isRepeated := true
    				for left < n && right < n {
    					left = right
    					right = right + index
    					next := current[left:right]
    					if next != prefix {
    						isRepeated = false
    						break
    					}
    				}
    
    				if isRepeated {
    					invalidSum += num
    					break
    				}
    			}
    		}
    	}
    
    	fmt.Println(invalidSum)
    }
    

  • Golang

    func part1() {
    	// file, _ := os.Open("sample.txt")
    	file, _ := os.Open("input.txt")
    	defer file.Close()
    
    	scanner := bufio.NewScanner(file)
    	n := 100
    	current := 50
    	pointingAt0 := 0
    
    	for scanner.Scan() {
    		line := scanner.Text()
    		num, _ := strconv.Atoi(line[1:])
    		if line[0] == 'L' {
    			current = ((current-num)%n + n) % n
    		} else {
    			current = (current + num) % n
    		}
    		if current == 0 {
    			pointingAt0++
    		}
    	}
    
    	fmt.Println(pointingAt0)
    }
    
    func part2() {
    	// file, _ := os.Open("sample.txt")
    	file, _ := os.Open("input.txt")
    	defer file.Close()
    
    	scanner := bufio.NewScanner(file)
    	n := 100
    	current := 50
    	pointingAt0 := 0
    
    	for scanner.Scan() {
    		line := scanner.Text()
    		num, _ := strconv.Atoi(line[1:])
    
    		rounds := num / n
    		pointingAt0 += rounds
    		num = num % n
    		new := -1
    
    		if line[0] == 'L' {
    			new = ((current-num)%n + n) % n
    			if current != 0 && (new > current || new == 0) {
    				pointingAt0++
    			}
    		} else {
    			new = (current + num) % n
    			if current != 0 && (new < current || new == 0) {
    				pointingAt0++
    			}
    		}
    
    		current = new
    	}
    
    	fmt.Println(pointingAt0)
    }
    






  • I have mixed feelings about that company. They have some interesting things “going against the flow” like ditching the cloud and going back to on prem, hating on microservices, advocating against taking money from VCs, and now hiring juniors. On the other hand, the guy is a Musk fanboy and they push some anti-DEI bullshit. Also he’s a TypeScript hater for some reason…






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