Skip to content

Commit

Permalink
Refactor - abstract solver
Browse files Browse the repository at this point in the history
  • Loading branch information
code-shoily committed Dec 7, 2023
1 parent 3ff8ce3 commit f15192c
Showing 1 changed file with 18 additions and 45 deletions.
63 changes: 18 additions & 45 deletions lib/2023/day_07.ex
Original file line number Diff line number Diff line change
Expand Up @@ -33,33 +33,23 @@ defmodule AdventOfCode.Y2023.Day07 do
{run_1(input), run_2(input)}
end

defp run_1(input) do
input
|> Enum.group_by(&elem(&1, 0))
|> Enum.sort_by(fn {rank, _} -> rank end)
|> Enum.flat_map(fn {_, hands} ->
Enum.sort(hands, fn {_, h1, _}, {_, h2, _} -> smaller?(h1, h2, @card_rank_1) end)
end)
|> Enum.with_index(1)
|> Enum.reduce(0, fn {{_, _, bid}, rank}, acc ->
acc + bid * rank
end)
end
defp run_1(input), do: get_winnings(input, @card_rank_1)

defp run_2(input) do
input
|> Enum.map(fn {rank, hand, bid} ->
{get_updated_rank(rank, hand), hand, bid}
end)
|> Enum.map(fn {rank, hand, bid} -> {jokered_rank(rank, hand), hand, bid} end)
|> get_winnings(@card_rank_2)
end

def get_winnings(card_configuration, value_mapping) do
card_configuration
|> Enum.group_by(&elem(&1, 0))
|> Enum.sort_by(fn {rank, _} -> rank end)
|> Enum.flat_map(fn {_, hands} ->
Enum.sort(hands, fn {_, h1, _}, {_, h2, _} -> smaller?(h1, h2, @card_rank_2) end)
hands |> Enum.sort(fn {_, h1, _}, {_, h2, _} -> smaller?(h1, h2, value_mapping) end)
end)
|> Enum.with_index(1)
|> Enum.reduce(0, fn {{_, _, bid}, rank}, acc ->
acc + bid * rank
end)
|> Enum.reduce(0, fn {{_, _, bid}, rank}, acc -> acc + bid * rank end)
end

def parse(data \\ input()) do
Expand All @@ -78,48 +68,31 @@ defmodule AdventOfCode.Y2023.Day07 do
|> Map.new(fn {a, b} -> {a, length(b)} end)
end

def get_updated_rank(rank, hand) do
def jokered_rank(rank, hand) do
freq = frequency(hand)

case {rank, freq["J"]} do
# No J present
{_, nil} -> rank
# high card
{1, _} -> 2
# 1 pair
{2, _} -> 4
# 2 pairs
{3, 1} -> 5
{3, 2} -> 6
# 3 of a kind
{4, _} -> 6
# full house
{5, _} -> 7
# 4 of a kind
{6, _} -> 7
# no change - highest rank
{7, _} -> rank
end
end

def get_rank(hand) do
values = hand |> frequency() |> Map.values() |> Enum.sort()

cond do
# High Card
[1, 1, 1, 1, 1] == values -> 1
# 1 Pair
[1, 1, 1, 2] == values -> 2
# 2 Pairs
[1, 2, 2] == values -> 3
# 3 of a kind
[1, 1, 3] == values -> 4
# Full House
[2, 3] == values -> 5
# 4 of a kind
[1, 4] == values -> 6
# 5 of a kind
[5] == values -> 7
case hand |> frequency() |> Map.values() |> Enum.sort() do
[1, 1, 1, 1, 1] -> 1
[1, 1, 1, 2] -> 2
[1, 2, 2] -> 3
[1, 1, 3] -> 4
[2, 3] -> 5
[1, 4] -> 6
[5] -> 7
end
end

Expand Down

0 comments on commit f15192c

Please sign in to comment.