diff --git a/manifest.toml b/manifest.toml index 8961bc3..f28dbf0 100644 --- a/manifest.toml +++ b/manifest.toml @@ -4,11 +4,14 @@ packages = [ { name = "argv", version = "1.0.2", build_tools = ["gleam"], requirements = [], otp_app = "argv", source = "hex", outer_checksum = "BA1FF0929525DEBA1CE67256E5ADF77A7CDDFE729E3E3F57A5BDCAA031DED09D" }, { name = "decode", version = "0.5.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "decode", source = "hex", outer_checksum = "05E14DC95A550BA51B8774485B04894B87A898C588B9B1C920104B110AED218B" }, + { name = "envoy", version = "1.0.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "envoy", source = "hex", outer_checksum = "95FD059345AA982E89A0B6E2A3BF1CF43E17A7048DCD85B5B65D3B9E4E39D359" }, { name = "filepath", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "filepath", source = "hex", outer_checksum = "67A6D15FB39EEB69DD31F8C145BB5A421790581BD6AA14B33D64D5A55DBD6587" }, - { name = "gladvent", version = "2.0.2", build_tools = ["gleam"], requirements = ["argv", "decode", "filepath", "gleam_erlang", "gleam_json", "gleam_otp", "gleam_package_interface", "gleam_stdlib", "glint", "parallel_map", "shellout", "simplifile", "snag", "spinner", "tom"], otp_app = "gladvent", source = "hex", outer_checksum = "1EDAF931C73B0E65C209B5F5745C540637FFCF8322BBA90000C5BC4C63DA7C70" }, + { name = "gladvent", version = "2.1.0", build_tools = ["gleam"], requirements = ["argv", "decode", "envoy", "filepath", "gleam_erlang", "gleam_http", "gleam_httpc", "gleam_json", "gleam_otp", "gleam_package_interface", "gleam_stdlib", "glint", "parallel_map", "shellout", "simplifile", "snag", "spinner", "tom"], otp_app = "gladvent", source = "hex", outer_checksum = "50E05A8AA03F9EAACE2F44333927975754C3895B0F7A4EE48B3A125B358D30E7" }, { name = "gleam_community_ansi", version = "1.4.1", build_tools = ["gleam"], requirements = ["gleam_community_colour", "gleam_stdlib"], otp_app = "gleam_community_ansi", source = "hex", outer_checksum = "4CD513FC62523053E62ED7BAC2F36136EC17D6A8942728250A9A00A15E340E4B" }, { name = "gleam_community_colour", version = "1.4.1", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_community_colour", source = "hex", outer_checksum = "386CB9B01B33371538672EEA8A6375A0A0ADEF41F17C86DDCB81C92AD00DA610" }, - { name = "gleam_erlang", version = "0.32.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "B18643083A0117AC5CFD0C1AEEBE5469071895ECFA426DCC26517A07F6AD9948" }, + { name = "gleam_erlang", version = "0.33.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "A1D26B80F01901B59AABEE3475DD4C18D27D58FA5C897D922FCB9B099749C064" }, + { name = "gleam_http", version = "3.7.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_http", source = "hex", outer_checksum = "A9EE0722106FCCAB8AD3BF9D0A3EFF92BFE8561D59B83BAE96EB0BE1938D4E0F" }, + { name = "gleam_httpc", version = "4.0.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_http", "gleam_stdlib"], otp_app = "gleam_httpc", source = "hex", outer_checksum = "76FEEC99473E568EBA34336A37CF3D54629ACE77712950DC9BB097B5FD664664" }, { name = "gleam_json", version = "2.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_json", source = "hex", outer_checksum = "0A57FB5666E695FD2BEE74C0428A98B0FC11A395D2C7B4CDF5E22C5DD32C74C6" }, { name = "gleam_otp", version = "0.14.1", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "5A8CE8DBD01C29403390A7BD5C0A63D26F865C83173CF9708E6E827E53159C65" }, { name = "gleam_package_interface", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_package_interface", source = "hex", outer_checksum = "CF3BFC5D0997750D9550D8D73A90F4B8D71C6C081B20ED4E70FFBE1E99AFC3C2" }, @@ -22,7 +25,7 @@ packages = [ { name = "shellout", version = "1.6.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "shellout", source = "hex", outer_checksum = "E2FCD18957F0E9F67E1F497FC9FF57393392F8A9BAEAEA4779541DE7A68DD7E0" }, { name = "simplifile", version = "2.2.0", build_tools = ["gleam"], requirements = ["filepath", "gleam_stdlib"], otp_app = "simplifile", source = "hex", outer_checksum = "0DFABEF7DC7A9E2FF4BB27B108034E60C81BEBFCB7AB816B9E7E18ED4503ACD8" }, { name = "snag", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "snag", source = "hex", outer_checksum = "08E9EB87C413457DB1DD66CD704C6878DACC9C93B418600F63873D0CD224E756" }, - { name = "spinner", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_stdlib", "glearray", "repeatedly"], otp_app = "spinner", source = "hex", outer_checksum = "9EE43AA33BE2DA5731B8F3F170AAB59AF1A815AFA5BF615F12C1B91F3B03F157" }, + { name = "spinner", version = "1.3.0", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_stdlib", "glearray", "repeatedly"], otp_app = "spinner", source = "hex", outer_checksum = "B824C4CFDA6AC912D14365BF365F2A52C4DA63EF2D768D2A1C46D9BF7AF669E7" }, { name = "tom", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "tom", source = "hex", outer_checksum = "228E667239504B57AD05EC3C332C930391592F6C974D0EFECF32FFD0F3629A27" }, ] diff --git a/src/aoc_2024/day_7.gleam b/src/aoc_2024/day_7.gleam new file mode 100644 index 0000000..76903b6 --- /dev/null +++ b/src/aoc_2024/day_7.gleam @@ -0,0 +1,88 @@ +import extra +import gleam/int +import gleam/list +import gleam/order +import gleam/string + +pub type Row { + Row(result: Int, operands: List(Int)) +} + +pub fn parse(input: String) -> List(Row) { + string.split(input, "\n") + |> list.map(fn(line) { + case string.split(line, ": ") { + [result_str, operands_str] -> { + Row( + result: extra.yolo_int(result_str), + operands: string.split(operands_str, " ") + |> list.map(extra.yolo_int), + ) + } + _ -> panic as "Bad input 1" + } + }) +} + +pub fn pt_1(input: List(Row)) { + input + |> list.filter(fn(row) { can_be_combined(row, [int.add, int.multiply]) }) + |> list.map(fn(row) { row.result }) + |> int.sum +} + +pub fn pt_2(input: List(Row)) { + input + |> list.filter(fn(row) { + can_be_combined(row, [int.add, int.multiply, concat_digits]) + }) + |> list.map(fn(row) { row.result }) + |> int.sum +} + +fn can_be_combined(row: Row, ops: List(fn(Int, Int) -> Int)) -> Bool { + case row.operands { + [first, ..rest] -> search(row.result, [#(first, rest)], ops) + _ -> panic as "No operands?!" + } +} + +fn concat_digits(a: Int, b: Int) -> Int { + // TODO could be faster if we do math (a * log10(b) + b) + extra.yolo_int(int.to_string(a) <> int.to_string(b)) +} + +fn search( + result: Int, + todos: List(#(Int, List(Int))), + ops: List(fn(Int, Int) -> Int), +) -> Bool { + case todos { + [] -> False + [#(acc_sum, operands), ..rest_of_todos] -> { + case operands { + [] -> + case acc_sum == result { + True -> True + False -> search(result, rest_of_todos, ops) + } + [operand, ..rest_of_operands] -> { + case acc_sum > result { + True -> search(result, rest_of_todos, ops) + False -> + search( + result, + list.append( + list.map(ops, fn(op) { + #(op(acc_sum, operand), rest_of_operands) + }), + rest_of_todos, + ), + ops, + ) + } + } + } + } + } +}