Skip Navigation

🍷 - 2024 DAY 3 SOLUTIONS -🍷

Day 3: Mull It Over

Megathread guidelines

  • Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever)
  • You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as https://topaz.github.io/paste/ if you prefer sending it through a URL

FAQ

52

You're viewing a single thread.

52 comments
  • 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)
    }
    
You've viewed 52 comments.