Mixifying
This commit is contained in:
4
.formatter.exs
Normal file
4
.formatter.exs
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
# Used by "mix format"
|
||||||
|
[
|
||||||
|
inputs: ["{mix,.formatter}.exs", "{config,lib,test}/**/*.{ex,exs}"]
|
||||||
|
]
|
||||||
24
.gitignore
vendored
Normal file
24
.gitignore
vendored
Normal 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
21
README.md
Normal 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
18
lib/advent_of_code.ex
Normal 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
8
lib/year_2025/day1.exs
Normal 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)
|
||||||
|
|
||||||
@@ -1,13 +1,13 @@
|
|||||||
defmodule Dial do
|
defmodule AdventOfCode.Year2025.Dial do
|
||||||
# Initial conditions
|
# Initial conditions
|
||||||
def rotate(operations), do: rotate(50, operations, 0)
|
def rotate(operations), do: rotate(50, operations, 0)
|
||||||
|
|
||||||
# When no operations remain, return the number of zeroes
|
# 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
|
# Compute the new dial position
|
||||||
def rotate(index, [head | tail], zeroes) do
|
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))
|
"R" <> number -> rotate_right(index, String.to_integer(number))
|
||||||
"L" <> number -> rotate_left(index, String.to_integer(number))
|
"L" <> number -> rotate_left(index, String.to_integer(number))
|
||||||
end
|
end
|
||||||
@@ -19,26 +19,20 @@ defmodule Dial do
|
|||||||
end
|
end
|
||||||
|
|
||||||
defp rotate_right(index, number) do
|
defp rotate_right(index, number) do
|
||||||
|
crosses = div(number, 100)
|
||||||
diff = index + rem(number, 100)
|
diff = index + rem(number, 100)
|
||||||
case diff do
|
case diff do
|
||||||
diff when diff <= 99 -> diff
|
diff when diff <= 99 -> { diff, crosses }
|
||||||
diff when diff > 99 -> diff - 100
|
diff when diff > 99 -> { diff - 100, crosses + 1 }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
defp rotate_left(index, number) do
|
defp rotate_left(index, number) do
|
||||||
|
crosses = div(number, 100)
|
||||||
diff = index - rem(number, 100)
|
diff = index - rem(number, 100)
|
||||||
case diff do
|
case diff do
|
||||||
diff when diff >= 0 -> diff
|
diff when diff >= 0 -> { diff, crosses }
|
||||||
diff when diff < 0 -> diff + 100
|
diff when diff < 0 -> { diff + 100, crosses + 1 }
|
||||||
end
|
end
|
||||||
end
|
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
28
mix.exs
Normal 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
1
test/test_helper.exs
Normal file
@@ -0,0 +1 @@
|
|||||||
|
ExUnit.start()
|
||||||
25
test/year_2025/dial_test.exs
Normal file
25
test/year_2025/dial_test.exs
Normal 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
|
||||||
Reference in New Issue
Block a user