From 4d1b02e9167349d941bab096982ac3e8fd51b4f3 Mon Sep 17 00:00:00 2001
From: sloane <git@sloanelybutsurely.com>
Date: Sun, 1 Dec 2024 08:45:07 -0500
Subject: [PATCH] solve 2024 day 1

---
 2024/.formatter.exs             |  5 ++++
 2024/.github/workflows/test.yml | 23 ----------------
 2024/.gitignore                 | 32 +++++++++++++++++++---
 2024/.iex.exs                   |  1 +
 2024/.mise.toml                 |  3 ---
 2024/README.md                  |  9 ++++---
 2024/config/config.exs          |  8 ++++++
 2024/gleam.toml                 | 22 ---------------
 2024/lib/2024/1.ex              | 34 ++++++++++++++++++++++++
 2024/manifest.toml              | 22 ---------------
 2024/mix.exs                    | 28 ++++++++++++++++++++
 2024/mix.lock                   |  6 +++++
 2024/src/aoc.gleam              | 47 ---------------------------------
 2024/test/aoc_test.gleam        | 12 ---------
 README.md                       |  2 +-
 15 files changed, 117 insertions(+), 137 deletions(-)
 create mode 100644 2024/.formatter.exs
 delete mode 100644 2024/.github/workflows/test.yml
 create mode 100644 2024/.iex.exs
 delete mode 100644 2024/.mise.toml
 create mode 100644 2024/config/config.exs
 delete mode 100644 2024/gleam.toml
 create mode 100644 2024/lib/2024/1.ex
 delete mode 100644 2024/manifest.toml
 create mode 100644 2024/mix.exs
 create mode 100644 2024/mix.lock
 delete mode 100644 2024/src/aoc.gleam
 delete mode 100644 2024/test/aoc_test.gleam

diff --git a/2024/.formatter.exs b/2024/.formatter.exs
new file mode 100644
index 0000000..015debb
--- /dev/null
+++ b/2024/.formatter.exs
@@ -0,0 +1,5 @@
+# Used by "mix format"
+[
+  plugins: [Styler],
+  inputs: ["{mix,.formatter}.exs", "{config,lib,test}/**/*.{ex,exs}"]
+]
diff --git a/2024/.github/workflows/test.yml b/2024/.github/workflows/test.yml
deleted file mode 100644
index 6026a40..0000000
--- a/2024/.github/workflows/test.yml
+++ /dev/null
@@ -1,23 +0,0 @@
-name: test
-
-on:
-  push:
-    branches:
-      - master
-      - main
-  pull_request:
-
-jobs:
-  test:
-    runs-on: ubuntu-latest
-    steps:
-      - uses: actions/checkout@v4
-      - uses: erlef/setup-beam@v1
-        with:
-          otp-version: "27.1.2"
-          gleam-version: "1.6.1"
-          rebar3-version: "3"
-          # elixir-version: "1.15.4"
-      - run: gleam deps download
-      - run: gleam test
-      - run: gleam format --check src test
diff --git a/2024/.gitignore b/2024/.gitignore
index 599be4e..81d1cf9 100644
--- a/2024/.gitignore
+++ b/2024/.gitignore
@@ -1,4 +1,30 @@
-*.beam
-*.ez
-/build
+# The directory Mix will write compiled artifacts to.
+/_build/
+
+# If you run "mix test --cover", coverage assets end up here.
+/cover/
+
+# The directory Mix downloads your dependencies sources to.
+/deps/
+
+# Where third-party dependencies like ExDoc output generated docs.
+/doc/
+
+# Ignore .fetch files in case you like to edit your project deps locally.
+/.fetch
+
+# If the VM crashes, it generates a dump, let's ignore it too.
 erl_crash.dump
+
+# Also ignore archive artifacts (built via "mix archive.build").
+*.ez
+
+# Ignore package tarball (built via "mix hex.build").
+aoc2024-*.tar
+
+# Temporary files, for example, from tests.
+/tmp/
+
+.envrc
+
+/input/
diff --git a/2024/.iex.exs b/2024/.iex.exs
new file mode 100644
index 0000000..795d6b6
--- /dev/null
+++ b/2024/.iex.exs
@@ -0,0 +1 @@
+import AOC.IEx
diff --git a/2024/.mise.toml b/2024/.mise.toml
deleted file mode 100644
index b7e64af..0000000
--- a/2024/.mise.toml
+++ /dev/null
@@ -1,3 +0,0 @@
-[tools]
-gleam = "1.6.1"
-erlang = "27.1.2"
diff --git a/2024/README.md b/2024/README.md
index e7813ca..1a6de16 100644
--- a/2024/README.md
+++ b/2024/README.md
@@ -2,8 +2,9 @@
 
 |  S  |  M  |  T  |  W  |  T  |  F  |  S  |
 | :-: | :-: | :-: | :-: | :-: | :-: | :-: |
-|   1 |  2  |   3 |   4 |   5 |   6 |   7 |
-|   8 |  9  |  10 |  11 |  12 |  13 |  14 |
-|  15 | 16  |  17 |  18 |  19 |  20 |  21 |
-|  22 | 23  |  24 |  25 |     |     |     |
+| [1] |   2 |   3 |   4 |   5 |   6 |   7 |
+|   8 |   9 |  10 |  11 |  12 |  13 |  14 |
+|  15 |  16 |  17 |  18 |  19 |  20 |  21 |
+|  22 |  23 |  24 |  25 |     |     |     |
 
+[1]: ./lib/2024/1.ex
diff --git a/2024/config/config.exs b/2024/config/config.exs
new file mode 100644
index 0000000..b5502e1
--- /dev/null
+++ b/2024/config/config.exs
@@ -0,0 +1,8 @@
+import Config
+
+config :advent_of_code_utils,
+  session: System.fetch_env!("AOC_SESSION"),
+  auto_compile?: true,
+  time_calls?: true
+
+config :iex, inspect: [charlists: :as_lists]
diff --git a/2024/gleam.toml b/2024/gleam.toml
deleted file mode 100644
index 896dae6..0000000
--- a/2024/gleam.toml
+++ /dev/null
@@ -1,22 +0,0 @@
-name = "aoc"
-version = "1.0.0"
-
-# Fill out these fields if you intend to generate HTML documentation or publish
-# your project to the Hex package manager.
-#
-# description = ""
-# licences = ["Apache-2.0"]
-# repository = { type = "github", user = "", repo = "" }
-# links = [{ title = "Website", href = "" }]
-#
-# For a full reference of all the available options, you can have a look at
-# https://gleam.run/writing-gleam/gleam-toml/.
-
-[dependencies]
-gleam_stdlib = ">= 0.34.0 and < 2.0.0"
-glint = ">= 1.1.0 and < 2.0.0"
-argv = ">= 1.0.2 and < 2.0.0"
-birl = ">= 1.7.1 and < 2.0.0"
-
-[dev-dependencies]
-gleeunit = ">= 1.0.0 and < 2.0.0"
diff --git a/2024/lib/2024/1.ex b/2024/lib/2024/1.ex
new file mode 100644
index 0000000..2a3456d
--- /dev/null
+++ b/2024/lib/2024/1.ex
@@ -0,0 +1,34 @@
+import AOC
+
+aoc 2024, 1 do
+  def p1(input) do
+    {left, right} = read_input(input)
+
+    left
+    |> Enum.sort()
+    |> Enum.zip_with(Enum.sort(right), &abs(&1 - &2))
+    |> Enum.sum()
+  end
+
+  def p2(input) do
+    {left, right} = read_input(input)
+
+    right_list_freqs = Enum.frequencies(right)
+
+    left
+    |> Enum.map(&(&1 * Map.get(right_list_freqs, &1, 0)))
+    |> Enum.sum()
+  end
+
+  defp read_input(input) do
+    input
+    |> String.split("\n")
+    |> Enum.map(fn line ->
+      line
+      |> String.split()
+      |> Enum.map(&String.to_integer/1)
+      |> List.to_tuple()
+    end)
+    |> Enum.unzip()
+  end
+end
diff --git a/2024/manifest.toml b/2024/manifest.toml
deleted file mode 100644
index 977a4d1..0000000
--- a/2024/manifest.toml
+++ /dev/null
@@ -1,22 +0,0 @@
-# This file was generated by Gleam
-# You typically do not need to edit this file
-
-packages = [
-  { name = "argv", version = "1.0.2", build_tools = ["gleam"], requirements = [], otp_app = "argv", source = "hex", outer_checksum = "BA1FF0929525DEBA1CE67256E5ADF77A7CDDFE729E3E3F57A5BDCAA031DED09D" },
-  { name = "birl", version = "1.7.1", build_tools = ["gleam"], requirements = ["gleam_stdlib", "ranger"], otp_app = "birl", source = "hex", outer_checksum = "5C66647D62BCB11FE327E7A6024907C4A17954EF22865FE0940B54A852446D01" },
-  { 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_json", version = "2.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_json", source = "hex", outer_checksum = "0A57FB5666E695FD2BEE74C0428A98B0FC11A395D2C7B4CDF5E22C5DD32C74C6" },
-  { name = "gleam_stdlib", version = "0.43.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "69EF22E78FDCA9097CBE7DF91C05B2A8B5436826D9F66680D879182C0860A747" },
-  { name = "gleeunit", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "F7A7228925D3EE7D0813C922E062BFD6D7E9310F0BEE585D3A42F3307E3CFD13" },
-  { name = "glint", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_community_colour", "gleam_stdlib", "snag"], otp_app = "glint", source = "hex", outer_checksum = "A3F1B7C665FD216BE6A886D56537F0E095FB07DF62146074109270B798F8CEC4" },
-  { name = "ranger", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "ranger", source = "hex", outer_checksum = "1566C272B1D141B3BBA38B25CB761EF56E312E79EC0E2DFD4D3C19FB0CC1F98C" },
-  { name = "snag", version = "0.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "snag", source = "hex", outer_checksum = "54D32E16E33655346AA3E66CBA7E191DE0A8793D2C05284E3EFB90AD2CE92BCC" },
-]
-
-[requirements]
-argv = { version = ">= 1.0.2 and < 2.0.0" }
-birl = { version = ">= 1.7.1 and < 2.0.0" }
-gleam_stdlib = { version = ">= 0.34.0 and < 2.0.0" }
-gleeunit = { version = ">= 1.0.0 and < 2.0.0" }
-glint = { version = ">= 1.1.0 and < 2.0.0" }
diff --git a/2024/mix.exs b/2024/mix.exs
new file mode 100644
index 0000000..ff15d14
--- /dev/null
+++ b/2024/mix.exs
@@ -0,0 +1,28 @@
+defmodule Aoc2024.MixProject do
+  use Mix.Project
+
+  def project do
+    [
+      app: :aoc2024,
+      version: "0.1.0",
+      elixir: "~> 1.17",
+      start_permanent: Mix.env() == :prod,
+      deps: deps()
+    ]
+  end
+
+  # Run "mix help compile.app" to learn about applications.
+  def application do
+    [
+      extra_applications: [:logger]
+    ]
+  end
+
+  # Run "mix help deps" to learn about dependencies.
+  defp deps do
+    [
+      {:advent_of_code_utils, "~> 4.0"},
+      {:styler, "~> 1.2", only: [:dev, :test], runtime: false}
+    ]
+  end
+end
diff --git a/2024/mix.lock b/2024/mix.lock
new file mode 100644
index 0000000..d127457
--- /dev/null
+++ b/2024/mix.lock
@@ -0,0 +1,6 @@
+%{
+  "advent_of_code_utils": {:hex, :advent_of_code_utils, "4.0.1", "591073a49600cbceae6d92e0fb2d2c56b59f6d383851e2a7c00c3bf0e4f33f4f", [:mix], [{:floki, "~> 0.34", [hex: :floki, repo: "hexpm", optional: false]}, {:tz, "~> 0.26", [hex: :tz, repo: "hexpm", optional: false]}], "hexpm", "684d016883d7b5443d9d22abc34013fb6f1d5d9ff114859a40890545a570eec8"},
+  "floki": {:hex, :floki, "0.36.3", "1102f93b16a55bc5383b85ae3ec470f82dee056eaeff9195e8afdf0ef2a43c30", [:mix], [], "hexpm", "fe0158bff509e407735f6d40b3ee0d7deb47f3f3ee7c6c182ad28599f9f6b27a"},
+  "styler": {:hex, :styler, "1.2.1", "28f9e3d4b065c22575c56b8ae03d05188add1b21bec5ae664fc1551e2dfcc41b", [:mix], [], "hexpm", "71dc33980e530d21ca54db9c2075e646faa6e7b744a9d4a3dfb0ff01f56595f0"},
+  "tz": {:hex, :tz, "0.28.1", "717f5ffddfd1e475e2a233e221dc0b4b76c35c4b3650b060c8e3ba29dd6632e9", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:mint, "~> 1.6", [hex: :mint, repo: "hexpm", optional: true]}], "hexpm", "bfdca1aa1902643c6c43b77c1fb0cb3d744fd2f09a8a98405468afdee0848c8a"},
+}
diff --git a/2024/src/aoc.gleam b/2024/src/aoc.gleam
deleted file mode 100644
index bfd7936..0000000
--- a/2024/src/aoc.gleam
+++ /dev/null
@@ -1,47 +0,0 @@
-import argv
-import birl
-import gleam/int
-import gleam/io
-import gleam/list
-import gleam/string
-import glint
-
-fn day_flag() -> glint.Flag(Int) {
-  let flag =
-    glint.int_flag("day")
-    |> glint.flag_help("The day to run")
-
-  case birl.now() |> birl.get_day() {
-    birl.Day(year: _, month: 12, date: date) ->
-      flag
-      |> glint.flag_default(date)
-    _ -> flag
-  }
-}
-
-fn parts_flag() -> glint.Flag(List(Int)) {
-  glint.ints_flag("part")
-  |> glint.flag_default([1, 2])
-  |> glint.flag_help("The part(s) to run")
-}
-
-fn run() -> glint.Command(Nil) {
-  use day <- glint.flag(day_flag())
-  use parts <- glint.flag(parts_flag())
-  use _, _, flags <- glint.command()
-  let assert Ok(day) = day(flags)
-  let assert Ok(parts) = parts(flags)
-  io.println(int.to_string(day))
-  parts
-  |> list.map(int.to_string)
-  |> string.join(", ")
-  |> io.println()
-}
-
-pub fn main() {
-  glint.new()
-  |> glint.with_name("run")
-  |> glint.pretty_help(glint.default_pretty_help())
-  |> glint.add(at: [], do: run())
-  |> glint.run(argv.load().arguments)
-}
diff --git a/2024/test/aoc_test.gleam b/2024/test/aoc_test.gleam
deleted file mode 100644
index 3831e7a..0000000
--- a/2024/test/aoc_test.gleam
+++ /dev/null
@@ -1,12 +0,0 @@
-import gleeunit
-import gleeunit/should
-
-pub fn main() {
-  gleeunit.main()
-}
-
-// gleeunit test functions end in `_test`
-pub fn hello_world_test() {
-  1
-  |> should.equal(1)
-}
diff --git a/README.md b/README.md
index a90a087..c80289f 100644
--- a/README.md
+++ b/README.md
@@ -15,7 +15,7 @@
 | [2021] | **43/50** 🌟 | Elixir |
 | [2022] | **14/50** 🌟 | Elixir, Haskell |
 | [2023] | **19/50** 🌟 | Elixir, Haskell |
-| [2024] | | |
+| [2024] | **2/50** 🌟  | Elixir |
 
 [2015]: ./2015
 [2017]: ./2017