my solutions to advent of code
aoc advent-of-code
at main 2.2 kB view raw
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}