My solution today seems a little different from the others I’ve seen. I made use of String.myers_difference/2 for the second part:
def common(addresses) do
pairings = for add_a <- addresses, add_b <- addresses, add_a != add_b, do: {add_a, add_b}
Enum.reduce_while(pairings, nil, fn {add_a, add_b}, _ ->
case String.myers_difference(add_a, add_b) do
[eq: _, del: << char :: size(8) >>, ins: _, eq: _] ->
{:halt, String.replace(add_a, IO.chardata_to_string([char]), "")}
_ -> {:cont, nil}
end
end)
end
There are two other possible edit scripts that could have matched (first character or last character being the difference), but this worked for my inputs.
I’m pretty happy with my solutions so far, especially for Day 2 Part 2 I felt I was able to take advantage of a few things, especially a comprehension to structure it nicely:
I like how this one turned out — reasonably small and clean.
I’ve learned that finding the right functional operation (Enum.find_value in this case) really helps keep the code small (and easy to reason about). (String.myers_difference helped, of course. I wrote my first version with MapSet (and set difference and intersections), which interestingly worked for the example case, but did not work with the large input file, so I ended up using String.myers_difference)