Skip to content

Instantly share code, notes, and snippets.

@andreicek
Created November 25, 2024 15:50
Show Gist options
  • Save andreicek/6c21cc22aad1201ba319ff11b590e2b8 to your computer and use it in GitHub Desktop.
Save andreicek/6c21cc22aad1201ba319ff11b590e2b8 to your computer and use it in GitHub Desktop.
defmodule SecretSanta do
@participants [:andrei, :dave, :john, :mary, :jane, :anna]
def get_random, do: generate_pairs() |> Enum.random()
defp generate_pairs(givers \\ @participants, receivers \\ @participants, existing_pairs \\ [])
defp generate_pairs([giver | givers], receivers, existing_pairs) do
for receiver <- receivers,
valid_pair?(giver, receiver, existing_pairs),
remaining_receivers = List.delete(receivers, receiver),
pairs <- generate_pairs(givers, remaining_receivers, [{giver, receiver} | existing_pairs]) do
[{giver, receiver} | pairs]
end
end
defp generate_pairs([], [], _existing_pairs), do: [[]]
defp valid_pair?(giver, receiver, existing_pairs) do
cond do
giver == receiver -> false
{giver, receiver} == {:andrei, :dave} -> false
{giver, receiver} == {:dave, :andrei} -> false
{giver, receiver} == {:john, :mary} -> false
{giver, receiver} == {:mary, :john} -> false
Enum.member?(existing_pairs, {receiver, giver}) -> false
true -> true
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment