From 91994445fd466993fec00edca33ac18b2b3d9f20 Mon Sep 17 00:00:00 2001 From: Pedro Correa Date: Mon, 8 Dec 2025 20:49:28 -0300 Subject: [PATCH] :sparkles: (Gleam) aoc day 3 --- output.log | 12 +++++++++++ src/day_03.gleam | 47 ++++++++++++++++++++++++++++++++++++++++++ test/day_03_test.gleam | 29 ++++++++++++++++++++++++++ 3 files changed, 88 insertions(+) create mode 100644 output.log create mode 100644 src/day_03.gleam create mode 100644 test/day_03_test.gleam diff --git a/output.log b/output.log new file mode 100644 index 0000000..1d74af1 --- /dev/null +++ b/output.log @@ -0,0 +1,12 @@ +....... +assert test/day_03_test.gleam:16 + test: day_03_test.calculate_jolts_test + code: assert "987654321111111" + |> day_03.format_input + |> day_03.calculate_highest_jolts + == 357 + left: 332690 +right: literal + info: Assertion failed. + +7 passed, 1 failures diff --git a/src/day_03.gleam b/src/day_03.gleam new file mode 100644 index 0000000..066ef12 --- /dev/null +++ b/src/day_03.gleam @@ -0,0 +1,47 @@ +import gleam/bool +import gleam/int +import gleam/list +import gleam/string + +pub fn format_input(input: String) -> List(List(Int)) { + input + |> string.split("\n") + |> list.filter_map(fn(line) { + use <- bool.guard(when: line == "", return: Error("")) + + line + |> string.split("") + |> list.map(fn(b) { + let assert Ok(b) = int.parse(b) + b + }) + |> Ok + }) +} + +fn get_highest_numbers(bank: List(Int), acc: #(Int, Int)) -> #(Int, Int) { + case bank { + [] -> acc + [jolt] -> #(jolt, acc.0) + [jolt, ..rest] -> { + let #(prev_jolt, prev_acc) = get_highest_numbers(rest, acc) + let actual_acc = jolt * 10 + prev_jolt + + case jolt > prev_jolt, actual_acc > prev_acc { + True, True -> #(jolt, actual_acc) + False, True -> #(prev_jolt, actual_acc) + True, False -> #(jolt, prev_acc) + False, False -> #(prev_jolt, prev_acc) + } + } + } +} + +pub fn calculate_highest_jolts(banks: List(List(Int))) -> Int { + banks + |> list.map(fn(bank) { + let #(_, v) = get_highest_numbers(bank, #(0, 0)) + v + }) + |> list.fold(0, fn(acc, value) { acc + value }) +} diff --git a/test/day_03_test.gleam b/test/day_03_test.gleam new file mode 100644 index 0000000..cfc82f1 --- /dev/null +++ b/test/day_03_test.gleam @@ -0,0 +1,29 @@ +import day_03 +import simplifile + +pub fn read_input_test() { + assert "987654321111111\n811111111111119\n234234234234278\n818181911112111" + |> day_03.format_input + == [ + [9, 8, 7, 6, 5, 4, 3, 2, 1, 1, 1, 1, 1, 1, 1], + [8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9], + [2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 7, 8], + [8, 1, 8, 1, 8, 1, 9, 1, 1, 1, 1, 2, 1, 1, 1], + ] +} + +pub fn calculate_jolts_test() { + assert "987654321111111\n811111111111119\n234234234234278\n818181911112111" + |> day_03.format_input + |> day_03.calculate_highest_jolts + == 357 +} + +pub fn calculate_jolts_for_real_test() { + let assert Ok(file) = simplifile.read("input/day_03") + + assert file + |> day_03.format_input + |> day_03.calculate_highest_jolts + == 17_311 +} -- 2.51.2