my aoc solutions
0
fork

Configure Feed

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

day 4

nnuuvv 0a93deda dcccb52e

+92
+92
src/aoc_2025/day_4.gleam
··· 1 + import gleam/dict 2 + import gleam/list 3 + import gleam/result 4 + import gleam/string 5 + 6 + pub fn parse(input: String) -> dict.Dict(#(Int, Int), Storage) { 7 + input 8 + |> string.split("\n") 9 + |> list.index_fold(dict.new(), fn(grid, row, row_index) { 10 + row 11 + |> string.to_graphemes() 12 + |> list.index_fold(grid, fn(grid, column, column_index) { 13 + let location = case column { 14 + "." -> Empty 15 + "@" -> Roll 16 + _ -> panic as "invalid input" 17 + } 18 + dict.insert(grid, #(row_index, column_index), location) 19 + }) 20 + }) 21 + } 22 + 23 + pub type Storage { 24 + Roll 25 + Empty 26 + } 27 + 28 + pub fn pt_1(warehouse: dict.Dict(#(Int, Int), Storage)) { 29 + warehouse 30 + |> dict.filter(fn(coord, storage) { can_access(warehouse, coord, storage) }) 31 + |> dict.values() 32 + |> list.length() 33 + } 34 + 35 + fn can_access(warehouse, coord, storage) { 36 + case storage { 37 + Empty -> False 38 + Roll -> { 39 + let #(row, column) = coord 40 + let top_left = 41 + dict.get(warehouse, #(row - 1, column - 1)) |> result.unwrap(Empty) 42 + let top_middle = 43 + dict.get(warehouse, #(row - 1, column)) |> result.unwrap(Empty) 44 + let top_right = 45 + dict.get(warehouse, #(row - 1, column + 1)) |> result.unwrap(Empty) 46 + 47 + let left_middle = 48 + dict.get(warehouse, #(row, column - 1)) |> result.unwrap(Empty) 49 + let right_middle = 50 + dict.get(warehouse, #(row, column + 1)) |> result.unwrap(Empty) 51 + 52 + let bottom_left = 53 + dict.get(warehouse, #(row + 1, column - 1)) |> result.unwrap(Empty) 54 + let bottom_middle = 55 + dict.get(warehouse, #(row + 1, column)) |> result.unwrap(Empty) 56 + let bottom_right = 57 + dict.get(warehouse, #(row + 1, column + 1)) |> result.unwrap(Empty) 58 + 59 + [ 60 + top_left, 61 + top_middle, 62 + top_right, 63 + left_middle, 64 + right_middle, 65 + bottom_left, 66 + bottom_middle, 67 + bottom_right, 68 + ] 69 + |> list.count(fn(item) { item == Roll }) 70 + < 4 71 + } 72 + } 73 + } 74 + 75 + pub fn pt_2(warehouse: dict.Dict(#(Int, Int), Storage)) { 76 + pt_2_loop(warehouse, 0) 77 + } 78 + 79 + fn pt_2_loop(warehouse, count) { 80 + let accessible = 81 + warehouse 82 + |> dict.filter(fn(coord, storage) { can_access(warehouse, coord, storage) }) 83 + |> dict.keys() 84 + 85 + case accessible { 86 + [] -> count 87 + _ -> { 88 + let warehouse = warehouse |> dict.drop(accessible) 89 + pt_2_loop(warehouse, count + list.length(accessible)) 90 + } 91 + } 92 + }