aboutsummaryrefslogtreecommitdiff
path: root/aoc2023/src/aoc2023.gleam
diff options
context:
space:
mode:
authorJ.J <thechairman@thechairman.info>2023-12-03 12:20:29 -0500
committerJ.J <thechairman@thechairman.info>2023-12-03 12:20:29 -0500
commit0607a032238b545d3d49d3af0e1763f82ccdd31a (patch)
treea216ed6f22cb75e699de66037273ecab3d07fcb3 /aoc2023/src/aoc2023.gleam
parent91e090a088470ec24ad834eb30588004d263efdd (diff)
downloadgleam_aoc-0607a032238b545d3d49d3af0e1763f82ccdd31a.tar.gz
gleam_aoc-0607a032238b545d3d49d3af0e1763f82ccdd31a.zip
testing
Diffstat (limited to 'aoc2023/src/aoc2023.gleam')
-rw-r--r--aoc2023/src/aoc2023.gleam86
1 files changed, 86 insertions, 0 deletions
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
+}