Essays/Set Game
The Game
Set is a game marketed by Set Enterprises Inc. In each round, 12 cards are dealt from a deck of 81 distinct cards. Each card is imprinted with one or more repetitions of a symbol with the following four features:
- repetition: 1, 2, or 3
- shape: diamond, oval, or squiggle
- color: red, green, or blue
- texture: solid, outline, or shaded
A "set" consists of three cards wherein each feature is either the same in all three cards or different in all three cards.
For example, the three cards marked by an X form a set (repetitions are different; colors are different; textures are different; shapes are different):
2 repetitions red outline diamond 3 repetitions purple shaded oval 1 repetition green solid squiggle
And the three cards marked by a Y form a set (repetitions are different; colors are different; textures are different; shapes are the same):
2 repetitions red outline squiggle 1 repetition purple shaded squiggle 3 repetitions green sold squiggle
The first player to identify a set wins the round.
Write a set of programs to simulate the playing of a round: deal 12 cards and identify all the sets contained therein.
A Solution
A card can be represented by a 4-element vector of the integers 0 1 2, and the deck of cards can be represented by:
cards=: (#: i.@(*/)) 3 3 3 3
$ cards
81 4
8 {. cards
0 0 0 0
0 0 0 1
0 0 0 2
0 0 1 0
0 0 1 1
0 0 1 2
0 0 2 0
0 0 2 1
_4 {. cards
2 2 1 2
2 2 2 0
2 2 2 1
2 2 2 2
(12?#cards){cards deals 12 cards, codified as a verb thus:
deal=: cards {~ 12 ? (#cards)"_
] d=: deal ''
2 1 2 1
0 2 0 1
1 1 2 0
1 1 0 0
2 0 2 0
2 2 0 0
0 2 2 0
0 2 1 2
0 0 1 1
1 1 2 2
1 0 2 1
0 1 0 2
$ d
12 4
Three cards form a "set" if each feature is the same in all 3 cards or different in all 3 cards. Thus each feature must be one of 0 0 0, 1 1 1, or 2 2 2 (the same in all 3 cards) or a permutation of 0 1 2 (different in all 3 cards). That is, if 3 cards are represented by a 3 4 integer matrix, then:
univ=: (3 $"0 i.3) , (i.!3) A. i.3
test=: *./"1 @: (e.&univ) @: (|:"2)
univ
0 0 0
1 1 1
2 2 2
0 1 2
0 2 1
1 0 2
1 2 0
2 0 1
2 1 0
$ univ
9 3
3 {. d
2 1 2 1
0 2 0 1
1 1 2 0
test 3 {. d
0
test 3 4 $ 0 0 0 0 0 0 0 1 0 0 0 2
1
It remains to form all size 3 combinations of the 12 cards and select those combinations that pass the test. A verb that generates all size x combinations of i.y can be found in the Combinations essay:
comb=: 4 : 0
k=. i.>:d=.y-x
z=. (d$<i.0 0),<i.1 0
for. i.x do. z=. k ,.&.> ,&.>/\. >:&.> z end.
; z
)
ci =: 3 comb 12
sets=: (test # ]) @ (ci { ])
$ ci
220 3
3!12
220
sets d
0 2 0 1
0 2 2 0
0 2 1 2
1 1 2 0
2 0 2 0
0 2 2 0
2 2 0 0
0 0 1 1
1 1 2 2
0 2 2 0
0 0 1 1
0 1 0 2
$ sets d
4 3 4
Collected definitions:
comb=: 4 : 0
k=. i.>:d=.y-x
z=. (d$<i.0 0),<i.1 0
for. i.x do. z=. k ,.&.> ,&.>/\. >:&.> z end.
; z
)
cards=: (#: i.@(*/)) 3 3 3 3
deal =: cards {~ 12 ? (#cards)"_
univ =: (3 $"0 i.3) , (i.!3) A. i.3
test =: *./"1 @: (e.&univ) @: (|:"2)
ci =: 3 comb 12
sets =: (test # ]) @ (ci { ])
See also
Contributed by Roger Hui. A version of this text previously appeared as a thread in the newsgroup comp.lang.apl on 1996-04-08.
