24
🍷 - 2024 DAY 3 SOLUTIONS -🍷
(programming.dev)
I wrote matchesActual
cause all of smalltalk'sstupid matchesDo:
or whatever don't give you the actual match with captures, only substrings (that wasted a good 40 minutes).
Also smalltalk really needs an index operator
day3p1: input
| reg sum |
reg := 'mul\((\d\d?\d?),(\d\d?\d?)\)' asRegex.
sum := 0.
reg matchesActual: input do: [ :m | " + sum at end cause operator precedence"
sum := (m subexpression: 2) asInteger * (m subexpression: 3) asInteger + sum
].
^ sum.
day3p2: input
| reg sum do val |
reg := 'do(\:?n''t)?\(\)|mul\((\d{1,3}),(\d{1,3})\)' asRegex.
sum := 0.
do := true.
reg matchesActual: input do: [ :m |
val := m subexpression: 1.
(val at: 1) = $d ifTrue: [ do := (val size < 5) ]
ifFalse: [
do ifTrue: [
sum := (m subexpression: 2) asInteger * (m subexpression: 3) asInteger + sum.
]. ].
].
^ sum.
defmodule AdventOfCode.Solution.Year2024.Day03 do
def part1(input) do
Regex.scan(~r/mul\((?<l>\d+),(?<r>\d+)\)/, input, capture: ["l", "r"])
|> Stream.map(fn l -> Enum.reduce(l, 1, &(&2 * String.to_integer(&1))) end)
|> Enum.sum()
end
def part2(input) do
input |> String.replace(~r/don't\(\).*(do\(\)|$)/Us, "") |> part1
end
end
Just did some basic regex stuff.
Part 1 and 2
(defun p1-mult (str)
"pulls out numbers and multiplies them, assumes already filtered by size"
(let ((vals (ppcre:all-matches-as-strings "\\d+" str)))
(apply #'* (or (mapcar #'parse-integer vals) '(0)))))
(defun p1-process-line (line)
"look for mul, do the mul, and sum"
(let ((ptrn "mul\\(\\d?\\d?\\d,\\d?\\d?\\d\\)"))
(apply #'+ (mapcar #'p1-mult (ppcre:all-matches-as-strings ptrn line)))))
(defun run-p1 (file)
(let ((data (read-file file #'p1-process-line)))
(apply #'+ data)))
(defun p2-process-line (line)
"looks for mul, do, and don't"
(let ((ptrn "(mul\\(\\d?\\d?\\d,\\d?\\d?\\d\\))|(do\\(\\))|(don't\\(\\))"))
(ppcre:all-matches-as-strings ptrn line)))
(defun p2-filter (data)
"expects list containing the string tokens (mul, do, don't) from the file"
(let ((process t))
(loop for x in data
when (string= "don't()" x)
do (setf process nil)
when (string= "do()" x)
do (setf process t)
when process
sum (p1-mult x))))
(defun run-p2 (file)
(let ((data (read-file file #'p2-process-line)))
;; treat the input as one line to make processing the do's and don't's easier
(p2-filter (flatten data))))
An unofficial home for the advent of code community on programming.dev!
Advent of Code is an annual Advent calendar of small programming puzzles for a variety of skill sets and skill levels that can be solved in any programming language you like.
Solution Threads
M | T | W | T | F | S | S |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 |
Icon base by Lorc under CC BY 3.0 with modifications to add a gradient
console.log('Hello World')