Mixifying

This commit is contained in:
2025-12-13 15:42:22 -05:00
parent dbe0615d0e
commit d34cf3575c
10 changed files with 138 additions and 15 deletions

4
.formatter.exs Normal file
View File

@@ -0,0 +1,4 @@
# Used by "mix format"
[
inputs: ["{mix,.formatter}.exs", "{config,lib,test}/**/*.{ex,exs}"]
]

24
.gitignore vendored Normal file
View File

@@ -0,0 +1,24 @@
# 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/
# Temporary files, for example, from tests.
/tmp/
# 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").
advent_of_code-*.tar

21
README.md Normal file
View File

@@ -0,0 +1,21 @@
# AdventOfCode
**TODO: Add description**
## Installation
If [available in Hex](https://hex.pm/docs/publish), the package can be installed
by adding `advent_of_code` to your list of dependencies in `mix.exs`:
```elixir
def deps do
[
{:advent_of_code, "~> 0.1.0"}
]
end
```
Documentation can be generated with [ExDoc](https://github.com/elixir-lang/ex_doc)
and published on [HexDocs](https://hexdocs.pm). Once published, the docs can
be found at <https://hexdocs.pm/advent_of_code>.

18
lib/advent_of_code.ex Normal file
View File

@@ -0,0 +1,18 @@
defmodule AdventOfCode do
@moduledoc """
Documentation for `AdventOfCode`.
"""
@doc """
Hello world.
## Examples
iex> AdventOfCode.hello()
:world
"""
def hello do
:world
end
end

8
lib/year_2025/day1.exs Normal file
View File

@@ -0,0 +1,8 @@
filepath = Path.join([File.cwd!, "lib", "year_2025", "day1_input.txt"])
ops = File.stream!(filepath)
|>Stream.map(&String.trim_trailing/1)
|>Enum.to_list
{_, zeroes} = AdventOfCode.Year2025.Dial.rotate(ops)
IO.puts(zeroes)

View File

@@ -1,13 +1,13 @@
defmodule Dial do
defmodule AdventOfCode.Year2025.Dial do
# Initial conditions
def rotate(operations), do: rotate(50, operations, 0)
# When no operations remain, return the number of zeroes
def rotate(_, [], zeroes), do: zeroes
def rotate(index, [], zeroes), do: { index, zeroes }
# Compute the new dial position
def rotate(index, [head | tail], zeroes) do
new_index = case head do
{ new_index, _crosses } = case head do
"R" <> number -> rotate_right(index, String.to_integer(number))
"L" <> number -> rotate_left(index, String.to_integer(number))
end
@@ -19,26 +19,20 @@ defmodule Dial do
end
defp rotate_right(index, number) do
crosses = div(number, 100)
diff = index + rem(number, 100)
case diff do
diff when diff <= 99 -> diff
diff when diff > 99 -> diff - 100
diff when diff <= 99 -> { diff, crosses }
diff when diff > 99 -> { diff - 100, crosses + 1 }
end
end
defp rotate_left(index, number) do
crosses = div(number, 100)
diff = index - rem(number, 100)
case diff do
diff when diff >= 0 -> diff
diff when diff < 0 -> diff + 100
diff when diff >= 0 -> { diff, crosses }
diff when diff < 0 -> { diff + 100, crosses + 1 }
end
end
end
ops = File.stream!("./day1.txt")
|> Stream.map(&String.trim_trailing/1)
|> Enum.to_list()
dial = Dial.rotate(ops)
IO.puts dial

28
mix.exs Normal file
View File

@@ -0,0 +1,28 @@
defmodule AdventOfCode.MixProject do
use Mix.Project
def project do
[
app: :advent_of_code,
version: "0.1.0",
elixir: "~> 1.19",
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
[
# {:dep_from_hexpm, "~> 0.3.0"},
# {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"}
]
end
end

1
test/test_helper.exs Normal file
View File

@@ -0,0 +1 @@
ExUnit.start()

View File

@@ -0,0 +1,25 @@
defmodule AdventOfCode.Year2025.DialTest do
use ExUnit.Case, async: true
import AdventOfCode.Year2025.Dial
test "dial starts at 50" do
{ index, _ } = rotate([])
assert index == 50
end
test "rotate right increments index" do
{index, _} = rotate(["R1"])
assert index == 51
end
test "rotate left decrements index" do
{index, _} = rotate(["L1"])
assert index ==49
end
test "increments zero crossings when landing on zero" do
{_, zeroes} = rotate(["R50"])
assert zeroes == 1
end
end