1
+ import gleam/bool
1
2
import gleam/int
2
3
import gleam/string
3
4
import simplifile
@@ -6,11 +7,67 @@ pub fn part1() {
6
7
let filepath = "./src/day3/input.txt"
7
8
8
9
let assert Ok ( input ) = simplifile . read ( from : filepath )
9
- parse_mul ( input )
10
+ parse_mul_rec ( input , START , 0 )
10
11
}
11
12
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 )
14
71
}
15
72
16
73
/// parse with state machine
0 commit comments