Skip to content

Commit 1d2ec69

Browse files
committed
solve day 3 part 2
1 parent 7154cd1 commit 1d2ec69

File tree

2 files changed

+63
-3
lines changed

2 files changed

+63
-3
lines changed

src/advent_of_code.gleam

+3
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,7 @@ pub fn main() {
2525
io.println(
2626
"Day 3 - Mull It Over Part 1: " <> int.to_string(mull_it_over.part1()),
2727
)
28+
io.println(
29+
"Day 3 - Mull It Over Part 2: " <> int.to_string(mull_it_over.part2()),
30+
)
2831
}

src/day3/mull_it_over.gleam

+60-3
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import gleam/bool
12
import gleam/int
23
import gleam/string
34
import simplifile
@@ -6,11 +7,67 @@ pub fn part1() {
67
let filepath = "./src/day3/input.txt"
78

89
let assert Ok(input) = simplifile.read(from: filepath)
9-
parse_mul(input)
10+
parse_mul_rec(input, START, 0)
1011
}
1112

12-
fn parse_mul(input: String) {
13-
parse_mul_rec(input, START, 0)
13+
pub fn part2() {
14+
let filepath = "./src/day3/input.txt"
15+
16+
let assert Ok(input) = simplifile.read(from: filepath)
17+
parse_mul_rec2(input, 0, True)
18+
}
19+
20+
fn parse_mul_rec2(input: String, acc: Int, enabled: Bool) -> Int {
21+
case input {
22+
"do()" <> rest -> {
23+
parse_mul_rec2(rest, acc, True)
24+
}
25+
"don't()" <> rest -> {
26+
parse_mul_rec2(rest, acc, False)
27+
}
28+
"mul(" <> rest -> {
29+
case string.split_once(rest, ",") {
30+
Error(_) -> acc
31+
Ok(#(potential_first_number, after_comma)) -> {
32+
case parse_up_to_three_digits(potential_first_number) {
33+
Error(_) -> {
34+
parse_mul_rec2(rest, acc, enabled)
35+
}
36+
Ok(first_number) -> {
37+
case string.split_once(after_comma, ")") {
38+
Error(_) -> acc
39+
Ok(#(potential_second_number, potential_new_rest)) -> {
40+
case parse_up_to_three_digits(potential_second_number) {
41+
Error(_) -> parse_mul_rec2(rest, acc, enabled)
42+
Ok(second_number) -> {
43+
let multiplied_number = case enabled {
44+
False -> 0
45+
True -> first_number * second_number
46+
}
47+
parse_mul_rec2(
48+
potential_new_rest,
49+
multiplied_number + acc,
50+
enabled,
51+
)
52+
}
53+
}
54+
}
55+
}
56+
}
57+
}
58+
}
59+
}
60+
}
61+
"" -> acc
62+
_ -> {
63+
string.drop_start(input, 1) |> parse_mul_rec2(acc, enabled)
64+
}
65+
}
66+
}
67+
68+
fn parse_up_to_three_digits(input: String) -> Result(Int, Nil) {
69+
use <- bool.guard(string.length(input) > 3, Error(Nil))
70+
int.parse(input)
1471
}
1572

1673
/// parse with state machine

0 commit comments

Comments
 (0)