my solutions to advent of code
aoc
advent-of-code
1import gleam/dict
2import gleam/int
3import gleam/io
4import gleam/list
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 input = input |> string.trim |> string.split("\n")
13 let assert Ok(start) = input |> list.first
14 let start =
15 start
16 |> string.to_graphemes
17 |> list.index_fold(0, fn(acc, v, i) {
18 case v {
19 "S" -> i
20 _ -> acc
21 }
22 })
23 let splitters_map =
24 input
25 |> list.drop(1)
26 |> list.index_map(fn(line, i) {
27 case i % 2 {
28 0 -> ""
29 _ -> line
30 }
31 })
32 |> list.filter(fn(line) { line != "" })
33 |> list.map(fn(line) {
34 line
35 |> string.to_graphemes
36 |> list.index_fold(set.new(), fn(d, char, i) {
37 case char {
38 "^" -> set.insert(d, i)
39 _ -> d
40 }
41 })
42 })
43 let #(_beams, times) =
44 splitters_map
45 |> list.fold(#(set.new() |> set.insert(start), 0), fn(acc, splitters) {
46 let #(beams, times) = acc
47 beams
48 |> set.fold(#(beams, times), fn(acc, beam) {
49 let #(beams, times) = acc
50 case splitters |> set.contains(beam) {
51 False -> acc
52 True -> #(
53 beams
54 |> set.delete(beam)
55 |> set.insert(beam - 1)
56 |> set.insert(beam + 1),
57 times + 1,
58 )
59 }
60 })
61 })
62
63 times
64 |> int.to_string
65 |> io.println
66
67 let timelines =
68 splitters_map
69 |> list.index_fold(
70 dict.new() |> dict.insert("", start),
71 fn(timelines, splitters, i) {
72 echo i
73 // echo #(timelines, splitters)
74 timelines
75 |> dict.fold(timelines, fn(timelines, timeline, beam) {
76 case splitters |> set.contains(beam) {
77 False -> timelines
78 True -> {
79 timelines
80 |> dict.delete(timeline)
81 |> dict.insert(timeline <> "-", beam - 1)
82 |> dict.insert(timeline <> "+", beam + 1)
83 }
84 }
85 })
86 },
87 )
88 echo timelines
89 timelines
90 |> dict.size
91 |> int.to_string
92 |> io.println
93}