Set puzzle: Difference between revisions

Add Factor example
(Add Factor example)
Line 1,603:
Two Red Oval Open
Three Red Oval Solid</pre>
 
=={{header|Factor}}==
<lang factor>USING: arrays backtrack combinators.short-circuit formatting
fry grouping io kernel literals math.combinatorics math.matrices
prettyprint qw random sequences sets ;
IN: rosetta-code.set-puzzle
 
CONSTANT: deck $[
[
qw{ red green purple } amb-lazy
qw{ one two three } amb-lazy
qw{ oval squiggle diamond } amb-lazy
qw{ solid open striped } amb-lazy 4array
] bag-of
]
 
: valid-category? ( seq -- ? )
{ [ all-equal? ] [ all-unique? ] } 1|| ;
 
: valid-set? ( seq -- ? )
[ valid-category? ] column-map t [ and ] reduce ;
 
: find-sets ( seq -- seq )
3 <combinations> [ valid-set? ] filter ;
 
: deal-hand ( m n -- seq valid? )
[ deck swap sample ] dip over find-sets length = ;
 
: find-valid-hand ( m n -- seq )
[ f ] 2dip '[ drop _ _ deal-hand not ] loop ;
 
: set-puzzle ( m n -- )
[ find-valid-hand ] 2keep
[ "Dealt %d cards:\n" printf simple-table. nl ]
[
"Containing %d sets:\n" printf find-sets
{ { " " " " " " " " } } join simple-table. nl
] bi-curry* bi ;
 
: main ( -- )
9 4 set-puzzle
12 6 set-puzzle ;
 
MAIN: main</lang>
{{out}}
<pre style="height:65ex">
Dealt 9 cards:
purple one diamond striped
purple three squiggle open
purple one oval solid
green two squiggle striped
red one oval striped
green three oval solid
purple three diamond striped
red two oval striped
purple two diamond striped
 
Containing 4 sets:
purple one diamond striped
purple three diamond striped
purple two diamond striped
purple three squiggle open
purple one oval solid
purple two diamond striped
green two squiggle striped
red one oval striped
purple three diamond striped
green two squiggle striped
red two oval striped
purple two diamond striped
 
Dealt 12 cards:
green one oval striped
red two squiggle striped
red two diamond open
purple two oval solid
green three squiggle open
purple one squiggle striped
purple two squiggle open
red two squiggle solid
red three oval open
purple one oval solid
red one diamond striped
red two oval striped
 
Containing 6 sets:
green one oval striped
purple two oval solid
red three oval open
green one oval striped
purple one squiggle striped
red one diamond striped
red two diamond open
red two squiggle solid
red two oval striped
purple two oval solid
green three squiggle open
red one diamond striped
green three squiggle open
purple one squiggle striped
red two squiggle solid
red two squiggle solid
red three oval open
red one diamond striped
</pre>
 
=={{header|Go}}==
1,808

edits