defmodule Aoc2023.Day7 do use Aoc2023 @ranking_1 %{ ?A => 13, ?K => 12, ?Q => 11, ?J => 10, ?T => 9, ?9 => 8, ?8 => 7, ?7 => 6, ?6 => 5, ?5 => 4, ?4 => 3, ?3 => 2, ?2 => 1 } @ranking_2 @ranking_1 |> Map.put(?J, 0) def hand_type(values) do for ty <- values, reduce: %{} do m -> Map.update(m, ty, 1, &(&1 + 1)) end |> Enum.map(pipe(elem(1))) |> Enum.sort(:desc) |> case do [5] -> 6 [4, 1] -> 5 [3, 2] -> 4 [3, 1, 1] -> 3 [2, 2, 1] -> 2 [2, 1, 1, 1] -> 1 [1, 1, 1, 1, 1] -> 0 end end def parse(input) do fn rankings, hand_rank -> input |> lines |> Enum.map(&String.split/1) |> Enum.map(fn [hand, bid] -> { hand |> String.to_charlist() |> Enum.map(&Map.get(rankings, &1)), bid |> String.to_integer() } end) |> Enum.sort_by(elem(0) |> hand_rank.() &&& elem(0), :asc) |> Enum.with_index(1) |> Enum.map(fn {{_, bid}, index} -> bid * index end) |> Enum.sum() end end def part1(input) do input.(@ranking_1, &hand_type/1) end def part2(input) do input.( @ranking_2, fn hand -> @ranking_2 |> Enum.map(pipe(elem(1))) |> Enum.map(fn j -> hand |> Enum.map(&if &1 == 0, do: j, else: &1) end) |> Enum.map(&hand_type/1) |> Enum.max() end ) end end