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 { ])
```