diff options
| -rw-r--r-- | .gitignore | 3 | ||||
| -rw-r--r-- | flake.lock | 58 | ||||
| -rw-r--r-- | flake.nix | 22 | ||||
| -rw-r--r-- | src/day01.exs | 20 | ||||
| -rw-r--r-- | src/day02.exs | 36 | 
5 files changed, 139 insertions, 0 deletions
| diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..37c186c --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.direnv/ +.envrc +data/
\ No newline at end of file diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..7e3bd39 --- /dev/null +++ b/flake.lock @@ -0,0 +1,58 @@ +{ +  "nodes": { +    "flake-utils": { +      "inputs": { +        "systems": "systems" +      }, +      "locked": { +        "lastModified": 1731533236, +        "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", +        "owner": "numtide", +        "repo": "flake-utils", +        "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", +        "type": "github" +      }, +      "original": { +        "owner": "numtide", +        "repo": "flake-utils", +        "type": "github" +      } +    }, +    "nixpkgs": { +      "locked": { +        "lastModified": 1730327045, +        "narHash": "sha256-xKel5kd1AbExymxoIfQ7pgcX6hjw9jCgbiBjiUfSVJ8=", +        "path": "/nix/store/ylrrz211xgjzkcpyiafpq9y2yws7fyah-source", +        "rev": "080166c15633801df010977d9d7474b4a6c549d7", +        "type": "path" +      }, +      "original": { +        "id": "nixpkgs", +        "type": "indirect" +      } +    }, +    "root": { +      "inputs": { +        "flake-utils": "flake-utils", +        "nixpkgs": "nixpkgs" +      } +    }, +    "systems": { +      "locked": { +        "lastModified": 1681028828, +        "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", +        "owner": "nix-systems", +        "repo": "default", +        "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", +        "type": "github" +      }, +      "original": { +        "owner": "nix-systems", +        "repo": "default", +        "type": "github" +      } +    } +  }, +  "root": "root", +  "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..3e5ccdd --- /dev/null +++ b/flake.nix @@ -0,0 +1,22 @@ +{ +  description = "Development shell for aoc2024"; + +  inputs = { +    flake-utils = { +      url = "github:numtide/flake-utils"; +    }; +  }; + +  outputs = { self, nixpkgs, flake-utils }: +    flake-utils.lib.eachDefaultSystem (system: +      let +        pkgs = import nixpkgs { inherit system; }; +      in { +        devShells.default = pkgs.mkShell { +          buildInputs = [ +            pkgs.elixir +            pkgs.elixir-ls +          ]; +        }; +      }); +} diff --git a/src/day01.exs b/src/day01.exs new file mode 100644 index 0000000..b9b346d --- /dev/null +++ b/src/day01.exs @@ -0,0 +1,20 @@ +[l1, l2] = IO.read(:stdio, :eof) +|> String.split([" ", "\n"], trim: true) +|> Enum.map(&String.to_integer/1) +|> Enum.with_index() +|> Enum.split_with(fn {_v, i} -> rem(i, 2) == 0 end) +|> Tuple.to_list() +|> Enum.map(fn l -> Enum.map(l, fn {v, _i} -> v end) end) +|> Enum.map(&Enum.sort/1) + +ans1 = Enum.zip(l1, l2) +|> Enum.map(fn {v1, v2} -> abs(v1 - v2) end) +|> Enum.sum() + +IO.puts(ans1) + +c2 = Enum.frequencies(l2) + +ans2 = Enum.map(l1, &(&1 * Map.get(c2, &1, 0))) |> Enum.sum() + +IO.puts(ans2) diff --git a/src/day02.exs b/src/day02.exs new file mode 100644 index 0000000..ae7bfde --- /dev/null +++ b/src/day02.exs @@ -0,0 +1,36 @@ +defmodule Day02 do +  def parse_report(line) do +    line +    |> String.trim() +    |> String.split(" ") +    |> Enum.map(&String.to_integer/1) +  end + +  def is_report_safe(report) do +    diffs = report +    |> Enum.chunk_every(2, 1, :discard) +    |> Enum.map(fn [a, b] -> b - a end) + +    Enum.all?(diffs, fn x -> 1 <= x and x <= 3 end) or +      Enum.all?(diffs, fn x -> -3 <= x and x <= -1 end) +  end + +  def is_report_safe_with_dampener(report) do +    is_report_safe(report) or +      Enum.any?(0..Enum.count(report)-1, +                fn i -> List.delete_at(report, i) |> is_report_safe() end) +  end +end + +reports = IO.stream(:stdio, :line) +|> Enum.map(&Day02.parse_report/1) + +ans1 = reports +|> Enum.count(&Day02.is_report_safe/1) + +IO.puts(ans1) + +ans2 = reports +|> Enum.count(&Day02.is_report_safe_with_dampener/1) + +IO.puts(ans2) | 
