my solutions to advent of code
aoc
advent-of-code
1import gleam/int
2import gleam/io
3import gleam/list
4import gleam/order.{Eq, Gt, Lt}
5import gleam/set
6import gleam/string
7import simplifile as file
8
9pub fn main() {
10 let assert Ok(input) = file.read(from: "../input.txt")
11 as "Input file not found"
12 let assert [fresh_ranges, available] =
13 input |> string.trim |> string.split("\n\n")
14 let fresh_ranges =
15 fresh_ranges
16 |> string.trim
17 |> string.split("\n")
18 // |> list.reverse
19 // |> list.drop(5)
20 // |> list.take(12)
21 // |> list.reverse
22 |> list.map(fn(i) {
23 let assert [from, to] = i |> string.trim |> string.split("-")
24 let assert Ok(from) = int.parse(from)
25 let assert Ok(to) = int.parse(to)
26 // #(from / 100_000_000, to / 100_000_000)
27 #(from, to)
28 })
29 let available =
30 available
31 |> string.split("\n")
32 |> list.map(fn(i) {
33 let assert Ok(id) = int.parse(i)
34 id
35 })
36
37 available
38 |> list.fold(0, fn(acc, i) {
39 acc
40 + case list.any(fresh_ranges, fn(range) { i >= range.0 && i <= range.1 }) {
41 True -> 1
42 False -> 0
43 }
44 })
45 |> int.to_string
46 |> io.println
47
48 // nicer looking but idc
49 // |> list.filter(fn(i) {
50 // list.any(fresh_ranges, fn(range) { i >= range.0 && i <= range.1 })
51 // })
52 // |> list.length
53
54 // this thing crashed my computer btw im stupid
55 // let haha =
56 // fresh_ranges
57 // |> list.fold(set.new(), fn(acc, i) {
58 // list.range(i.0, i.1) |> list.fold(acc, fn(acc, i) { set.insert(acc, i) })
59 // })
60 // io.println(set.size(haha) |> int.to_string)
61
62 let base_set: set.Set(#(Int, Int)) = set.new()
63 fresh_ranges
64 |> list.fold(base_set, fn(prev_seen_ranges, range) {
65 let #(range, seen_ranges) =
66 prev_seen_ranges
67 |> set.fold(#(range, prev_seen_ranges), fn(acc, seen_range) {
68 let #(range, seen_ranges) = acc
69 // echo #(
70 // range,
71 // seen_range,
72 // int.compare(range.0, seen_range.0),
73 // int.compare(range.1, seen_range.1),
74 // int.compare(range.0, seen_range.1),
75 // int.compare(range.1, seen_range.0),
76 // )
77 // btw im refusing to ever do something better than this idc about your sorting and whatever this is the way shut the fuck up i spent three hours on this i will be using it
78 case
79 int.compare(range.0, seen_range.0),
80 int.compare(range.1, seen_range.1),
81 int.compare(range.0, seen_range.1),
82 int.compare(range.1, seen_range.0)
83 {
84 // if there's no touching
85 Gt, Gt, Gt, Gt | Lt, Lt, Lt, Lt -> #(range, seen_ranges)
86 // if it's inside of the other one
87 Gt, Lt, _, _ | Eq, Lt, _, _ | Gt, Eq, _, _ | Eq, Eq, _, _ -> #(
88 #(-1, -1),
89 seen_ranges,
90 )
91 // if the other one is inside it
92 Lt, Gt, _, _ | Eq, Gt, _, _ | Lt, Eq, _, _ -> #(
93 range,
94 set.delete(seen_ranges, seen_range),
95 )
96 // if it's touching on the left side make them touch
97 Lt, Lt, _, _ -> #(
98 #(range.0, seen_range.1),
99 set.delete(seen_ranges, seen_range),
100 )
101 // if it's touching on the right size make them touch
102 Gt, Gt, _, _ -> #(
103 #(seen_range.0, range.1),
104 set.delete(seen_ranges, seen_range),
105 )
106 }
107 })
108
109 case range == #(-1, -1) {
110 False -> seen_ranges |> set.insert(range)
111 True -> seen_ranges
112 }
113 })
114 |> set.fold(0, fn(acc, range) { acc + range.1 - range.0 + 1 })
115 |> int.to_string
116 |> io.println
117}