-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path01.rhm
66 lines (51 loc) · 1.22 KB
/
01.rhm
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#lang rhombus/static
import:
"util/advent_of_code.rhm" as aoc
"util/parsec.rhm" open
"util/misc.rhm" open
@example_input(test_input1){
3 4
4 3
2 5
1 3
3 9
3 3
}
def line_p:
sequence:
l = integer
spaces
r = integer
char(Char"\n")
pure([l, r])
def part1_input_p:
manyl(line_p,
Pair([], []),
fun(Pair(ls :~ List, rs :~ List), [l, r]):
Pair(ls.add(l), rs.add(r)))
fun parse_input(p, s):
def values(Pair(l, r), []) = parse_string(p, s)
values(l, r)
fun run1(s):
let values(ll :~ List, rl :~ List) = parse_input(part1_input_p, s)
let ll = ll.sort()
let rl = rl.sort()
for values(sum = 0) (l: ll, r: rl):
sum + math.abs(l - r)
check run1(test_input1) ~is 11
module part1:
def input = aoc.fetch_input(aoc.find_session(), 2024, 1)
run1(input)
def part2_input_p:
manyl(line_p,
Pair([], {}),
fun(Pair(ls :~ List, m :~ Map), [l, r]):
Pair(ls.add(l), m ++ {r: m.get(r, 0) + 1}))
fun run2(s):
let values(ll :~ List, rm :~ Map) = parse_input(part2_input_p, s)
for values(sum = 0) (l: ll):
sum + l * rm.get(l, 0)
check run2(test_input1) ~is 31
module part2:
def input = aoc.fetch_input(aoc.find_session(), 2024, 1)
run2(input)