solve 2023 1.2
This commit is contained in:
parent
c5c6cf2582
commit
750d7dc6a8
4 changed files with 88 additions and 26 deletions
|
@ -3,7 +3,6 @@ import Config
|
||||||
config :advent_of_code_utils,
|
config :advent_of_code_utils,
|
||||||
auto_compile?: true,
|
auto_compile?: true,
|
||||||
time_calls?: true,
|
time_calls?: true,
|
||||||
gen_tests?: true,
|
|
||||||
session: System.get_env("ADVENT_OF_CODE_SESSION")
|
session: System.get_env("ADVENT_OF_CODE_SESSION")
|
||||||
|
|
||||||
config :iex, inspect: [charlists: :as_lists]
|
config :iex, inspect: [charlists: :as_lists]
|
||||||
|
|
|
@ -2,26 +2,98 @@ import AOC
|
||||||
|
|
||||||
aoc 2023, 1 do
|
aoc 2023, 1 do
|
||||||
def p1(input) do
|
def p1(input) do
|
||||||
input
|
lines = String.split(input, "\n")
|
||||||
|> String.split("\n")
|
|
||||||
|> Stream.map(&get_first_and_last_numbers_as_number/1)
|
firsts =
|
||||||
|
lines
|
||||||
|
|> Stream.map(&to_digits/1)
|
||||||
|
|> Stream.map(&List.first/1)
|
||||||
|
|
||||||
|
lasts =
|
||||||
|
lines
|
||||||
|
|> Stream.map(&String.reverse/1)
|
||||||
|
|> Stream.map(&to_digits/1)
|
||||||
|
|> Stream.map(&List.first/1)
|
||||||
|
|
||||||
|
Stream.zip_with(firsts, lasts, &digits_to_number/2)
|
||||||
|> Enum.sum()
|
|> Enum.sum()
|
||||||
end
|
end
|
||||||
|
|
||||||
def p2(_input) do
|
def p2(input) do
|
||||||
|
lines = String.split(input, "\n")
|
||||||
|
|
||||||
|
firsts =
|
||||||
|
lines
|
||||||
|
|> Stream.map(&to_digits_2/1)
|
||||||
|
|> Stream.map(&List.first/1)
|
||||||
|
|
||||||
|
lasts =
|
||||||
|
lines
|
||||||
|
|> Stream.map(&String.reverse/1)
|
||||||
|
|> Stream.map(&to_digits_3/1)
|
||||||
|
|> Stream.map(&List.first/1)
|
||||||
|
|
||||||
|
Stream.zip_with(firsts, lasts, &digits_to_number/2)
|
||||||
|
|> Enum.sum()
|
||||||
end
|
end
|
||||||
|
|
||||||
def get_first_and_last_numbers_as_number(str) do
|
def digits_to_number(f, l), do: String.to_integer("#{f}#{l}")
|
||||||
trimmed =
|
|
||||||
str
|
|
||||||
|> String.replace(~r/^[^\d]+/, "")
|
|
||||||
|> String.reverse()
|
|
||||||
|> String.replace(~r/^[^\d]+/, "")
|
|
||||||
|> String.reverse()
|
|
||||||
|
|
||||||
first = String.first(trimmed)
|
def to_digits(""), do: []
|
||||||
last = String.last(trimmed)
|
def to_digits("1" <> rest), do: [1 | to_digits(rest)]
|
||||||
|
def to_digits("2" <> rest), do: [2 | to_digits(rest)]
|
||||||
|
def to_digits("3" <> rest), do: [3 | to_digits(rest)]
|
||||||
|
def to_digits("4" <> rest), do: [4 | to_digits(rest)]
|
||||||
|
def to_digits("5" <> rest), do: [5 | to_digits(rest)]
|
||||||
|
def to_digits("6" <> rest), do: [6 | to_digits(rest)]
|
||||||
|
def to_digits("7" <> rest), do: [7 | to_digits(rest)]
|
||||||
|
def to_digits("8" <> rest), do: [8 | to_digits(rest)]
|
||||||
|
def to_digits("9" <> rest), do: [9 | to_digits(rest)]
|
||||||
|
def to_digits(<<_::binary-size(1), rest::binary>>), do: to_digits(rest)
|
||||||
|
|
||||||
String.to_integer(first <> last)
|
def to_digits_2(""), do: []
|
||||||
end
|
def to_digits_2("1" <> rest), do: [1 | to_digits_2(rest)]
|
||||||
|
def to_digits_2("one" <> rest), do: [1 | to_digits_2(rest)]
|
||||||
|
def to_digits_2("2" <> rest), do: [2 | to_digits_2(rest)]
|
||||||
|
def to_digits_2("two" <> rest), do: [2 | to_digits_2(rest)]
|
||||||
|
def to_digits_2("3" <> rest), do: [3 | to_digits_2(rest)]
|
||||||
|
def to_digits_2("three" <> rest), do: [3 | to_digits_2(rest)]
|
||||||
|
def to_digits_2("4" <> rest), do: [4 | to_digits_2(rest)]
|
||||||
|
def to_digits_2("four" <> rest), do: [4 | to_digits_2(rest)]
|
||||||
|
def to_digits_2("5" <> rest), do: [5 | to_digits_2(rest)]
|
||||||
|
def to_digits_2("five" <> rest), do: [5 | to_digits_2(rest)]
|
||||||
|
def to_digits_2("6" <> rest), do: [6 | to_digits_2(rest)]
|
||||||
|
def to_digits_2("six" <> rest), do: [6 | to_digits_2(rest)]
|
||||||
|
def to_digits_2("7" <> rest), do: [7 | to_digits_2(rest)]
|
||||||
|
def to_digits_2("seven" <> rest), do: [7 | to_digits_2(rest)]
|
||||||
|
def to_digits_2("8" <> rest), do: [8 | to_digits_2(rest)]
|
||||||
|
def to_digits_2("eight" <> rest), do: [8 | to_digits_2(rest)]
|
||||||
|
def to_digits_2("9" <> rest), do: [9 | to_digits_2(rest)]
|
||||||
|
def to_digits_2("nine" <> rest), do: [9 | to_digits_2(rest)]
|
||||||
|
|
||||||
|
def to_digits_2(<<_::binary-size(1), rest::binary>>),
|
||||||
|
do: to_digits_2(rest)
|
||||||
|
|
||||||
|
def to_digits_3(""), do: []
|
||||||
|
def to_digits_3("1" <> rest), do: [1 | to_digits_3(rest)]
|
||||||
|
def to_digits_3("eno" <> rest), do: [1 | to_digits_3(rest)]
|
||||||
|
def to_digits_3("2" <> rest), do: [2 | to_digits_3(rest)]
|
||||||
|
def to_digits_3("owt" <> rest), do: [2 | to_digits_3(rest)]
|
||||||
|
def to_digits_3("3" <> rest), do: [3 | to_digits_3(rest)]
|
||||||
|
def to_digits_3("eerht" <> rest), do: [3 | to_digits_3(rest)]
|
||||||
|
def to_digits_3("4" <> rest), do: [4 | to_digits_3(rest)]
|
||||||
|
def to_digits_3("ruof" <> rest), do: [4 | to_digits_3(rest)]
|
||||||
|
def to_digits_3("5" <> rest), do: [5 | to_digits_3(rest)]
|
||||||
|
def to_digits_3("evif" <> rest), do: [5 | to_digits_3(rest)]
|
||||||
|
def to_digits_3("6" <> rest), do: [6 | to_digits_3(rest)]
|
||||||
|
def to_digits_3("xis" <> rest), do: [6 | to_digits_3(rest)]
|
||||||
|
def to_digits_3("7" <> rest), do: [7 | to_digits_3(rest)]
|
||||||
|
def to_digits_3("neves" <> rest), do: [7 | to_digits_3(rest)]
|
||||||
|
def to_digits_3("8" <> rest), do: [8 | to_digits_3(rest)]
|
||||||
|
def to_digits_3("thgie" <> rest), do: [8 | to_digits_3(rest)]
|
||||||
|
def to_digits_3("9" <> rest), do: [9 | to_digits_3(rest)]
|
||||||
|
def to_digits_3("enin" <> rest), do: [9 | to_digits_3(rest)]
|
||||||
|
|
||||||
|
def to_digits_3(<<_::binary-size(1), rest::binary>>),
|
||||||
|
do: to_digits_3(rest)
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
import AOC
|
|
||||||
|
|
||||||
aoc_test 2023, 1, async: true do
|
|
||||||
describe "p1" do
|
|
||||||
test "works for the example input" do
|
|
||||||
assert p1(example_string()) == 142
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -14,7 +14,7 @@
|
||||||
1. [2020] **17/50** 🌟
|
1. [2020] **17/50** 🌟
|
||||||
1. [2021] **43/50** 🌟
|
1. [2021] **43/50** 🌟
|
||||||
1. [2022] **14/50** 🌟
|
1. [2022] **14/50** 🌟
|
||||||
1. [2023] **1/50** 🌟
|
1. [2023] **2/50** 🌟
|
||||||
|
|
||||||
[2015]: ./2015
|
[2015]: ./2015
|
||||||
[2017]: ./2017
|
[2017]: ./2017
|
||||||
|
|
Loading…
Reference in a new issue