adamu
Advent of Code 2023 - Day 1
Nobody’s doing Advent of Code this year? ![]()
I might do the first week or so.
For Day 1, first I solved it using regular expressions and String.replace, which took about 10ms for each part.
Then I rewrote it using binaries and recursion, which got each part under 1ms.
def filter_digits2(<<>>), do: <<>>
def filter_digits2(<<x, rest::binary>>) when x in ?1..?9, do: <<x>> <> filter_digits2(rest)
def filter_digits2(<<"one", rest::binary>>), do: "1" <> filter_digits2("e" <> rest)
def filter_digits2(<<"two", rest::binary>>), do: "2" <> filter_digits2("o" <> rest)
def filter_digits2(<<"three", rest::binary>>), do: "3" <> filter_digits2("e" <> rest)
def filter_digits2(<<"four", rest::binary>>), do: "4" <> filter_digits2("r" <> rest)
def filter_digits2(<<"five", rest::binary>>), do: "5" <> filter_digits2("e" <> rest)
def filter_digits2(<<"six", rest::binary>>), do: "6" <> filter_digits2("x" <> rest)
def filter_digits2(<<"seven", rest::binary>>), do: "7" <> filter_digits2("n" <> rest)
def filter_digits2(<<"eight", rest::binary>>), do: "8" <> filter_digits2("t" <> rest)
def filter_digits2(<<"nine", rest::binary>>), do: "9" <> filter_digits2("e" <> rest)
def filter_digits2(<<_, rest::binary>>), do: filter_digits2(rest)
Most Liked
Aetherus
Just tried solving Day 1 puzzles using the low-code platform developed by my company ![]()
There’s no function to split a string into lines, so I have to heavily rely on regular expressions.
By the way, the whole platform is powered by Elixir and Phoenix ![]()
kip
benchee is the go-to for benchmarking in Elixir. You can see my configuration in the bench directory in my advent_of_code repo.
To use it you would do mix run ./bench/bench.exs then sit back and relax ![]()
APB9785
My first approach didn’t handle overlaps properly in part 2, so I ended up with a somewhat funky pattern match syntax:
defp process_line(["o", "n", "e" | _] = [_h | t], ...),
do: process_line(t, ...)
There’s probably a cleaner way to do this, but it works!
Full solution here: https://github.com/APB9785/AoC-2023-elixir/blob/master/lib/day_01.ex
mruoss
I approached part 2 from both sides ![]()
defmodule Task2 do
@digits %{
"one" => 1,
"two" => 2,
"three" => 3,
"four" => 4,
"five" => 5,
"six" => 6,
"seven" => 7,
"eight" => 8,
"nine" => 9
}
def solve(input) do
input
|> String.split("\n", trim: true)
|> Enum.map(&convert_line/1)
|> Enum.sum()
end
def convert_line(line) do
10 * first_digit(line) + last_digit(String.reverse(line))
end
for digit <- 1..9 do
string = Integer.to_string(digit)
defp first_digit(<<unquote(string), _::binary>>), do: unquote(digit)
defp last_digit(<<unquote(string), _::binary>>), do: unquote(digit)
end
for {string, digit} <- @digits do
reverse_string = String.reverse(string)
defp first_digit(<<unquote(string), _::binary>>), do: unquote(digit)
defp last_digit(<<unquote(reverse_string), _::binary>>), do: unquote(digit)
end
defp first_digit(<<_::utf8, rest::binary>>), do: first_digit(rest)
defp last_digit(<<_::utf8, rest::binary>>), do: last_digit(rest)
end
Askath
Took me way to long, as I misread the question. But was nice trying out elixir with a more difficult prolbem for the first time! really enjoyed it. Although my solution seems bruteforced ![]()
defmodule Aoc1 do
@moduledoc """
Documentation for `Aoc1`.
"""
@doc """
Hello world.
## Examples
iex> Aoc1.hello()
:world
"""
def first_and_last(string) do
first = String.first(string)
last = String.last(string)
IO.puts("first: #{first}, last: #{last}")
{first, last}
end
def read_file do
case File.read("input") do
{:ok, result} ->
result
{:error, error} ->
IO.puts("Error: #{error}")
end
end
def replace_spoken_numbers(list) do
digits = [
{"eighthree", 83},
{"eightwo", 82},
{"fiveight", 58},
{"threeight", 38},
{"sevenine", 79},
{"oneight", 18},
{"twone", 21},
{"one", 1},
{"two", 2},
{"three", 3},
{"four", 4},
{"five", 5},
{"six", 6},
{"seven", 7},
{"eight", 8},
{"nine", 9},
{"zero", 0}
]
Enum.map(list, fn line ->
Enum.reduce(digits, line, fn {word, digit}, acc ->
String.replace(acc, word, Integer.to_string(digit))
end)
end)
end
def parse(file) do
file |> String.split("\n", trim: true) |> replace_spoken_numbers()
end
def hello do
numbers =
parse(read_file())
|> Enum.map(fn line ->
Regex.replace(~r/[a-z]/, line, "") |> first_and_last()
end)
Enum.reduce(numbers, 0, fn {first, last}, acc ->
num = first <> last
IO.puts(num)
acc = acc + String.to_integer(num)
acc
end)
|> IO.inspect()
end
end
Aoc1.hello()










