my solutions to advent of code
aoc
advent-of-code
1import gleam/int.{add, min, multiply, to_string}
2import gleam/io.{println}
3import gleam/list.{combinations, fold, map, reduce}
4import gleam/result.{unwrap}
5import gleam/string.{split, trim}
6import simplifile.{read}
7
8pub fn main() {
9 let input =
10 read(from: "../input.txt")
11 |> unwrap("")
12 |> trim()
13 |> split("\n")
14 |> map(fn(str) {
15 split(str, "x")
16 |> map(fn(str) { int.base_parse(str, 10) |> unwrap(0) })
17 })
18
19 // part 1
20 println(
21 input
22 |> fold(0, fn(prev, cur) {
23 let sides =
24 cur
25 |> combinations(2)
26 |> map(fn(v) { fold(v, 1, multiply) })
27
28 prev
29 + fold(sides, 0, fn(prev, cur) { prev + 2 * cur })
30 + { reduce(sides, min) |> unwrap(0) }
31 })
32 |> to_string,
33 )
34
35 // part 2
36 println(
37 input
38 |> fold(0, fn(prev, cur) {
39 let smallest_perimeter =
40 reduce(
41 cur
42 |> map(fn(v) { multiply(v, 2) })
43 |> combinations(2)
44 |> map(fn(v) { fold(v, 0, add) }),
45 min,
46 )
47 |> unwrap(0)
48
49 prev + smallest_perimeter + fold(cur, 1, multiply)
50 })
51 |> to_string,
52 )
53}