advent of code 2025 in gleam!
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

day7

+95 -1
+3 -1
src/advent_2025.gleam
··· 4 4 import day4 5 5 import day5 6 6 import day6 7 + import day7 7 8 8 9 pub fn main() { 9 10 // day1.day1main() ··· 11 12 // day3.day3main() 12 13 // day4.day4main() 13 14 // day5.day5main() 14 - day6.day6main() 15 + // day6.day6main() 16 + day7.day7main() 15 17 }
+18
src/day6.gleam
··· 103 103 list.reverse(line) 104 104 |> list.filter(fn(char) { char != " " }) 105 105 }) 106 + |> echo 106 107 |> list.filter(fn(x) { x != [] }) 107 108 |> list.map(fn(num) { 108 109 string.concat(num) 109 110 |> h.quickint 110 111 }) 112 + |> echo 113 + } 114 + 115 + fn chunk_it_out(input: List(String)) -> List(List(String)) { 116 + chunk_recurse(input, []) 117 + |> list.reverse 118 + } 119 + 120 + fn chunk_recurse( 121 + input: List(String), 122 + acc: List(List(String)), 123 + ) -> List(List(String)) { 124 + let #(head, rest) = list.split_while(input, fn(x) { x != " " }) 125 + case input { 126 + [] -> acc 127 + _ -> chunk_recurse(list.drop(rest, 1), [head, ..acc]) 128 + } 111 129 }
+74
src/day7.gleam
··· 1 + import gleam/dict 2 + import gleam/int 3 + import gleam/list 4 + import gleam/set 5 + import gleam/string 6 + import herbie as h 7 + import simplifile 8 + 9 + pub type Coord { 10 + Coord(x: Int, y: Int) 11 + } 12 + 13 + pub fn day7main() { 14 + let input = "./data/day7" 15 + let grid = 16 + part1input(input) 17 + |> h.grid_to_coords 18 + 19 + let assert [#(#(start_x, _start_y), _)] = 20 + dict.filter(grid, fn(_k, v) { v == "S" }) 21 + |> dict.to_list 22 + 23 + let splitters = isolate_splitters(grid) 24 + 25 + walk_splitters(splitters, start_x) 26 + |> echo 27 + } 28 + 29 + fn walk_splitters(splitters: List(Coord), start: Int) -> Int { 30 + let rays = 31 + set.new() 32 + |> set.insert(start) 33 + 34 + let #(_rays, return) = list.fold(splitters, #(rays, 0), fold_splitters) 35 + return 36 + } 37 + 38 + fn fold_splitters(acc: #(set.Set(Int), Int), splitter: Coord) { 39 + let #(rays, _count) = acc 40 + case set.contains(rays, splitter.x) { 41 + False -> acc 42 + True -> ray_split(acc, splitter.x) 43 + } 44 + } 45 + 46 + fn ray_split(acc: #(set.Set(Int), Int), splitter: Int) -> #(set.Set(Int), Int) { 47 + let #(rays, count) = acc 48 + let rays = 49 + rays 50 + |> set.insert(splitter + 1) 51 + |> set.insert(splitter - 1) 52 + |> set.drop([splitter]) 53 + 54 + #(rays, count + 1) 55 + } 56 + 57 + fn isolate_splitters(grid: dict.Dict(#(Int, Int), String)) -> List(Coord) { 58 + grid 59 + |> dict.filter(fn(_k, v) { v == "^" }) 60 + |> dict.to_list 61 + |> list.map(fn(coord) { 62 + let #(#(x, y), _z) = coord 63 + Coord(x:, y:) 64 + }) 65 + |> list.sort(fn(a, b) { int.compare(a.y, b.y) }) 66 + } 67 + 68 + fn part1input(input: String) -> List(List(String)) { 69 + let assert Ok(string_input) = simplifile.read(input) 70 + string_input 71 + |> string.trim 72 + |> string.split("\n") 73 + |> list.map(string.to_graphemes) 74 + }