Set puzzle: Difference between revisions
→{{header|Ruby}}: Added Ruby sample.
(→{{header|Ruby}}: Added Ruby sample.) |
|||
Line 705:
(deal 12 6)
</lang>
=={{header|Ruby}}==
Brute force.
<lang ruby>COLORS = %i(red green purple) #use [:red, :green, :purple] in Ruby < 2.0
SYMBOLS = %i(oval squiggle diamond)
NUMBERS = %i(one two three)
SHADINGS = %i(solid open striped)
FEATURES = [COLORS, SYMBOLS, NUMBERS, SHADINGS]
@hand_size = 9
@num_sets_goal = 4
#create an enumerator which deals all combinations of @hand_size cards
@dealer = FEATURES[0].product(*FEATURES[1..-1]).shuffle.combination(@hand_size)
def get_all_sets(hand)
hand.combination(3).select do |candidate|
grouped_features = candidate.flatten.group_by{|f| f}
grouped_features.values.none?{|v| v.size == 2}
end
end
def get_puzzle_and_answer
sets = []
until sets.size == @num_sets_goal do
hand = @dealer.next
sets = get_all_sets(hand)
end
[hand, sets]
end
def print_cards(cards)
cards.each{|card| puts card.join(", ")}
puts
end
puzzle, sets = get_puzzle_and_answer
puts "Dealt #{puzzle.size} cards:"
print_cards(puzzle)
puts "Containing #{sets.size} sets:"
sets.each{|set| print_cards(set)}</lang>
{{output}}<pre>purple, diamond, one, open
red, oval, two, striped
purple, oval, two, open
purple, oval, one, striped
purple, diamond, two, open
green, squiggle, two, open
red, squiggle, three, striped
purple, squiggle, one, solid
green, oval, two, solid
Containing 4 sets:
purple, diamond, one, open
purple, oval, one, striped
purple, squiggle, one, solid
purple, diamond, one, open
red, squiggle, three, striped
green, oval, two, solid
red, oval, two, striped
purple, oval, two, open
green, oval, two, solid
green, squiggle, two, open
red, squiggle, three, striped
purple, squiggle, one, solid
siep@siep-desktop:~$ '/home/siep/.rvm/rubies/ruby-2.0.0-p247/bin/ruby' test1.rb
Dealt 9 cards:
green, oval, three, solid
green, diamond, one, open
purple, squiggle, three, striped
red, diamond, three, striped
purple, oval, one, solid
green, oval, three, open
purple, diamond, three, striped
green, squiggle, two, open
green, oval, three, striped
Containing 4 sets:
green, oval, three, solid
green, oval, three, open
green, oval, three, striped
green, diamond, one, open
green, oval, three, open
green, squiggle, two, open
purple, squiggle, three, striped
red, diamond, three, striped
green, oval, three, striped
red, diamond, three, striped
purple, oval, one, solid
green, squiggle, two, open
</pre>
=={{header|Tcl}}==
|