stevensonmt
Advent Of Code 2022 - Day 13
Anyone else think the prompt for this challenge is contradictory?
The rules for comparing packets include
- If both values are lists, compare the first value of each list, then the second value, and so on. If the left list runs out of items first, the inputs are in the right order. If the right list runs out of items first, the inputs are not in the right order. If the lists are the same length and no comparison makes a decision about the order, continue checking the next part of the input.
- If exactly one value is an integer, convert the integer to a list which contains that integer as its only value, then retry the comparison. For example, if comparing
[0,0,0]and2, convert the right value to[2](a list containing2); the result is then found by instead comparing[0,0,0]and[2].
But if you compare lists according to the rules, [0,0,0] vs [2] should be incorrect order since the right side runs out of items first. But the sample data evaluation we’re told
Compare [2,3,4] vs 4
- Mixed types; convert right to [4] and retry comparison
- Compare [2,3,4] vs [4]
- Compare 2 vs 4
- Left side is smaller, so inputs are in the right order
So the rule for “list vs wrapped integer” is not the same as the rule for “list vs list”. Am I crazy?
Most Liked
lud
I have the same kind of solution, but my compare/2 function returns :lt | :gt | :eq which means that I can call Enum.sort(packets, __MODULE__)
defmodule Aoe.Y22.Day13 do
alias Aoe.Input
def read_file!(file, _part) do
Input.read!(file)
end
def parse_input!(input, _part) do
input
|> String.trim()
|> String.split("\n")
|> Enum.flat_map(&parse_line/1)
end
defp parse_line("") do
[]
end
defp parse_line(text) do
[Jason.decode!(text)]
end
def part_one(packets) do
packets
|> Enum.chunk_every(2)
|> Enum.map(&compare/1)
|> Enum.with_index(1)
|> Enum.filter(fn {order, _} -> order == :lt end)
|> Enum.reduce(0, fn {_, index}, acc -> acc + index end)
end
def part_two(packets) do
[[[2]], [[6]] | packets]
|> Enum.sort(__MODULE__)
|> Enum.with_index(1)
|> Enum.filter(fn {p, _} -> p == [[6]] or p == [[2]] end)
|> case(do: ([{_, a}, {_, b}] -> a * b))
end
def compare([left, right]) do
compare(left, right)
end
def compare([a | as], [b | bs]) do
case compare(a, b) do
:eq -> compare(as, bs)
other -> other
end
end
def compare([], []) do
:eq
end
def compare([], [_ | _]) do
:lt
end
def compare([_ | _], []) do
:gt
end
def compare(a, b) when is_integer(a) and is_integer(b) do
cond do
a < b -> :lt
a > b -> :gt
a == b -> :eq
end
end
def compare(a, b) when is_list(a) and is_integer(b) do
compare(a, [b])
end
def compare(a, b) when is_integer(a) and is_list(b) do
compare([a], b)
end
end
Every year I start doing AoC in Rust now, but after a week I have no time for it since I have to work, so I fallback on Elixir and then it feels like cheating ![]()
reobin
Using &Enum.sort/2 in part 2 with absolutely no modifications to the comparator was something else
https://github.com/reobin/aoc/blob/main/2022/lib/day_13.ex
kwando
Turned out okay, I don’t dare to clean this up more now that it works ![]()
Code.eval_string saved me from some parsing fun.
Popular in Challenges
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #advent-of-code
- #elixirconf-us
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #performance









