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
- What is this?: Here is a post with a large amount of details: https://programming.dev/post/6637268
- Where do I participate?: https://adventofcode.com/
- Is there a leaderboard for the community?: We have a programming.dev leaderboard with the info on how to join in this post: https://programming.dev/post/6631465
Nim
import ../aoc, re, sequtils, strutils, math proc mulsum*(line:string):int= let matches = line.findAll(re"mul\([0-9]{1,3},[0-9]{1,3}\)") let pairs = matches.mapIt(it[4..^2].split(',').map(parseInt)) pairs.mapIt(it[0]*it[1]).sum proc filter*(line:string):int= var state = true; var i=0 while i < line.len: if state: let off = line.find("don't()", i) if off == -1: break result += line[i..<off].mulsum i = off+6 state = false else: let on = line.find("do()", i) if on == -1: break i = on+4 state = true if state: result += line[i..^1].mulsum proc solve*(input:string): array[2,int] = #part 1&2 result = [input.mulsum, input.filter]
I had a nicer solution in mind for part 2, but for some reason
nre
didn’t want to work for me, andre
couldn’t give me the start/end or all results, so I ended up doing this skip/toggle approach.Also initially I was doing it line by line out of habit from other puzzles, but then ofc the
don't()
s didn’t propagate to the next line.