diff options
-rw-r--r-- | aoc2023/src/.gitignore | 2 | ||||
-rw-r--r-- | aoc2023/src/aoc2023.gleam | 86 |
2 files changed, 88 insertions, 0 deletions
diff --git a/aoc2023/src/.gitignore b/aoc2023/src/.gitignore new file mode 100644 index 0000000..d9408e9 --- /dev/null +++ b/aoc2023/src/.gitignore @@ -0,0 +1,2 @@ +input.txt +aoc2023.gleam
\ No newline at end of file diff --git a/aoc2023/src/aoc2023.gleam b/aoc2023/src/aoc2023.gleam index ea5c211..9fb5213 100644 --- a/aoc2023/src/aoc2023.gleam +++ b/aoc2023/src/aoc2023.gleam @@ -1,5 +1,91 @@ import gleam/io +import gleam/string +import gleam/list +import gleam/int pub fn main() { io.println("Hello from aoc2023!") } + +type Symbol { + Period + Symbol(String) + Number(Int) +} + +type CoordItem { + CoordItem(List(#(Int, Int)), Symbol) +} + +fn parse_grid1(input: String) { + use line, x_coord <- list.index_map(string.split(input, "\n")) + use char, y_coord <- list.index_map(string.to_graphemes(line), []) + case char { + "." -> [CoordItem([#(x_coord, y_coord)], Period), ..acc] + x -> { + case int.parse(x) { + Error(_) -> [CoordItem([#(x_coord, y_coord)], Symbol(x)), ..acc] + Ok(n) -> { + case acc { + [CoordItem(coords, Number(num)), ..rest] -> { + let assert Ok(num) = int.digits(num, 10) + let assert Ok(thing) = int.undigits(list.append(num, [n]), 10) + [ + CoordItem([#(x_coord, y_coord), ..coords], Number(thing)), + ..rest + ] + } + _ -> [CoordItem([#(x_coord, y_coord)], Number(n)), ..acc] + } + } + } + } + } +} + +fn parse_grid(input: String) -> List(CoordItem) { + let lines = string.split(input, "\n") + list.index_fold( + lines, + [], + fn(acc, line, x_coord) { + let row = + list.index_fold( + string.to_graphemes(line), + [], + fn(acc, char, y_coord) { + case char { + "." -> [CoordItem([#(x_coord, y_coord)], Period), ..acc] + x -> { + case int.parse(x) { + Error(_) -> [ + CoordItem([#(x_coord, y_coord)], Symbol(x)), + ..acc + ] + Ok(n) -> { + case acc { + [CoordItem(coords, Number(num)), ..rest] -> { + let assert Ok(num) = int.digits(num, 10) + let assert Ok(thing) = + int.undigits(list.append(num, [n]), 10) + [ + CoordItem( + [#(x_coord, y_coord), ..coords], + Number(thing), + ), + ..rest + ] + } + _ -> [CoordItem([#(x_coord, y_coord)], Number(n)), ..acc] + } + } + } + } + } + }, + ) + [row, ..acc] + }, + ) + |> list.flatten +} |