attr$[][] &= [ "one " "two " "three" ] attr$[][] &= [ "solid " "striped" "open " ] attr$[][] &= [ "red " "green " "purple" ] attr$[][] &= [ "diamond" "oval" "squiggle" ] # subr init for card = 0 to 80 : pack[] &= card . proc card2attr card &attr[] . attr[] = [ ] for i to 4 attr[] &= card mod 3 + 1 card = card div 3 . . proc printcards cards[] . for card in cards[] card2attr card attr[] write " " for i to 4 : write attr$[i][attr[i]] & " " print "" . print "" . proc getsets &cards[] &set[] . set[] = [ ] for i to len cards[] card2attr cards[i] a[] for j = i + 1 to len cards[] card2attr cards[j] b[] for k = j + 1 to len cards[] card2attr cards[k] c[] ok = 1 for at to 4 s = a[at] + b[at] + c[at] if s <> 3 and s <> 6 and s <> 9 : ok = 0 . if ok = 1 set[] &= cards[i] set[] &= cards[j] set[] &= cards[k] . . . . . proc run ncards nsets . repeat init cards[] = [ ] for i to ncards ind = random 1 len pack[] cards[] &= pack[ind] pack[ind] = pack[len pack[]] len pack[] -1 . getsets cards[] set[] until len set[] = 3 * nsets . print "Cards:" printcards cards[] print "Sets:" for i = 1 step 3 to 3 * nsets - 2 printcards [ set[i] set[i + 1] set[i + 2] ] . . run 9 4