diff options
author | H.J <thechairman@thechairman.info> | 2024-03-22 14:30:51 -0400 |
---|---|---|
committer | H.J <thechairman@thechairman.info> | 2024-03-22 14:30:51 -0400 |
commit | a2c2b728ec6051323ed937f54816089cd2ae9d20 (patch) | |
tree | 21fcb2be2d16c5155641f747eba3edb17d284d7e /codingquest2024/src/day7 | |
parent | e09491b19729a8848ea11662fb1173f5c466e910 (diff) | |
download | gleam_aoc-a2c2b728ec6051323ed937f54816089cd2ae9d20.tar.gz gleam_aoc-a2c2b728ec6051323ed937f54816089cd2ae9d20.zip |
Codingquest complete
Diffstat (limited to 'codingquest2024/src/day7')
-rw-r--r-- | codingquest2024/src/day7/solution.gleam | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/codingquest2024/src/day7/solution.gleam b/codingquest2024/src/day7/solution.gleam new file mode 100644 index 0000000..2ca7cbf --- /dev/null +++ b/codingquest2024/src/day7/solution.gleam @@ -0,0 +1,73 @@ +import gleam/io +import gleam/string +import gleam/set.{type Set} +import gleam/int +import gleam/regex.{Match} +import gleam/option.{Some} +import simplifile + +pub opaque type Item { + File(name: String, size: Int) + Directory(name: String) +} + +pub fn main() { + let assert Ok(data) = simplifile.read(from: "./src/day7/data.txt") + let lines = string.split(data, "\n") + + mark_for_deletion(lines, 0, "", set.new()) + |> io.debug() +} + +fn mark_for_deletion( + lines: List(String), + deleted: Int, + current_folder: String, + deleted_folders: Set(String), +) { + case lines { + [] -> deleted + ["Folder: " <> folder, ..rest] -> + mark_for_deletion(rest, deleted, folder, deleted_folders) + [file, ..rest] -> { + case + string.contains(file, "temporary") + || string.contains(file, "delete") + || set.contains(deleted_folders, current_folder) + { + True -> + case string.contains(file, "[FOLDER") { + True -> { + file + |> get_folder_number() + |> set.insert(deleted_folders, _) + |> mark_for_deletion(rest, deleted, current_folder, _) + } + False -> { + file + |> get_file_size() + |> int.add(deleted, _) + |> mark_for_deletion(rest, _, current_folder, deleted_folders) + } + } + False -> + mark_for_deletion(rest, deleted, current_folder, deleted_folders) + } + } + } +} + +fn get_folder_number(file) { + let assert Ok(re) = regex.from_string("\\[FOLDER ([0-9]+)\\]") + + let assert [Match(submatches: [Some(n)], ..)] = regex.scan(re, file) + n +} + +fn get_file_size(file) { + let assert Ok(re) = regex.from_string("- .+ ([0-9]+)$") + + let assert [Match(submatches: [Some(n)], ..)] = regex.scan(re, file) + let assert Ok(n) = int.parse(n) + n +} |