aboutsummaryrefslogtreecommitdiff
path: root/codingquest2024/src/day7/solution.gleam
diff options
context:
space:
mode:
Diffstat (limited to 'codingquest2024/src/day7/solution.gleam')
-rw-r--r--codingquest2024/src/day7/solution.gleam73
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
+}