Set puzzle: Difference between revisions

Added Elixir
(Added Elixir)
Line 925:
purple one squiggle striped
green three diamond striped</pre>
 
=={{header|Elixir}}==
{{trans|Ruby}}
<lang elixir>defmodule RC do
def set_puzzle(deal, goal) do
{puzzle, sets} = get_puzzle_and_answer(deal, goal, produce_deck)
IO.puts "Dealt #{length(puzzle)} cards:"
print_cards(puzzle)
IO.puts "Containing #{length(sets)} sets:"
Enum.each(sets, fn set -> print_cards(set) end)
end
defp get_puzzle_and_answer(hand_size, num_sets_goal, deck) do
hand = Enum.take_random(deck, hand_size)
sets = get_all_sets(hand)
if length(sets) == num_sets_goal do
{hand, sets}
else
get_puzzle_and_answer(hand_size, num_sets_goal, deck)
end
end
defp get_all_sets(hand) do
Enum.filter(comb(hand, 3), fn candidate ->
List.flatten(candidate)
|> Enum.group_by(&(&1))
|> Map.values
|> Enum.all?(fn v -> length(v) != 2 end)
end)
end
defp print_cards(cards) do
Enum.each(cards, fn card ->
:io.format " ~-8s ~-8s ~-8s ~-8s~n", card
end)
IO.puts ""
end
@colors ~w(red green purple)a
@symbols ~w(oval squiggle diamond)a
@numbers ~w(one two three)a
@shadings ~w(solid open striped)a
defp produce_deck do
Enum.reduce(@colors, [], fn color,acc ->
Enum.reduce(@symbols, acc, fn symbol,a1 ->
Enum.reduce(@numbers, a1, fn number,a2 ->
Enum.reduce(@shadings, a2, fn shading,a3 ->
[[color, symbol, number, shading] | a3]
end)
end)
end)
end)
end
defp comb(_, 0), do: [[]]
defp comb([], _), do: []
defp comb([h|t], m) do
(for l <- comb(t, m-1), do: [h|l]) ++ comb(t, m)
end
end
 
RC.set_puzzle(9, 4)
RC.set_puzzle(12, 6)</lang>
 
{{out}}
<pre>
Dealt 9 cards:
green oval one open
red oval one open
red oval two open
green diamond two striped
green diamond three open
green diamond one open
purple squiggle one open
red oval three solid
red oval three open
 
Containing 4 sets:
red oval one open
red oval two open
red oval three open
 
red oval one open
green diamond one open
purple squiggle one open
 
red oval two open
green diamond three open
purple squiggle one open
 
green diamond two striped
purple squiggle one open
red oval three solid
 
Dealt 12 cards:
purple oval one open
purple diamond two open
red oval three striped
purple diamond three striped
purple oval one solid
red oval two open
green diamond three open
green squiggle one solid
green oval three striped
red diamond two solid
red diamond one solid
green squiggle three striped
 
Containing 6 sets:
purple oval one open
red diamond two solid
green squiggle three striped
 
purple diamond two open
red oval three striped
green squiggle one solid
 
red oval three striped
purple diamond three striped
green squiggle three striped
 
purple diamond three striped
red oval two open
green squiggle one solid
 
purple oval one solid
red oval two open
green oval three striped
 
purple oval one solid
green squiggle one solid
red diamond one solid
</pre>
 
=={{header|Erlang}}==
Anonymous user