Day 5: Print Queue

Megathread guidelines

  • Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever)
  • You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as https://topaz.github.io/paste/ if you prefer sending it through a URL

FAQ

  • aurele@sh.itjust.works
    link
    fedilink
    English
    arrow-up
    0
    ·
    17 days ago

    Elixir

    defmodule AdventOfCode.Solution.Year2024.Day05 do
      use AdventOfCode.Solution.SharedParse
    
      @impl true
      def parse(input) do
        [rules, pages_list] =
          String.split(input, "\n\n", limit: 2) |> Enum.map(&String.split(&1, "\n", trim: true))
    
        {for(rule <- rules, do: String.split(rule, "|") |> Enum.map(&String.to_integer/1))
         |> MapSet.new(),
         for(pages <- pages_list, do: String.split(pages, ",") |> Enum.map(&String.to_integer/1))}
      end
    
      def part1({rules, pages_list}), do: solve(rules, pages_list, false)
    
      def part2({rules, pages_list}), do: solve(rules, pages_list, true)
    
      def solve(rules, pages_list, negate) do
        for pages <- pages_list, reduce: 0 do
          total ->
            ordered = Enum.sort(pages, &([&1, &2] in rules))
    
            if negate != (ordered == pages),
              do: total + Enum.at(ordered, div(length(ordered), 2)),
              else: total
        end
      end
    end