Set puzzle: Difference between revisions

4,426 bytes added ,  3 years ago
m (→‎{{header|REXX}}: added/changed whitespace and comments, split some compound clauses, used a template for the output section.)
Line 2,696:
 
Row[{Style[#2, #1], #3, #4}] & @@@ deal[{9, 4}]</lang>
 
=={{header|Nim}}==
<lang Nim>import algorithm, math, random, sequtils, strformat, strutils
 
type
 
# Card features.
Number {.pure.} = enum One, Two, Three
Color {.pure.} = enum Red, Green, Purple
Symbol {.pure.} = enum Oval, Squiggle, Diamond
Shading {.pure.} = enum Solid, Open, Striped
 
# Cards and list of cards.
Card = tuple[number: Number; color: Color; symbol: Symbol; shading: Shading]
Triplet = array[3, Card]
Deck = array[81, Card]
 
# Game level.
Level {.pure.} = enum Basic = "basic", Advanced = "advanced"
 
 
proc `$`(card: Card): string =
## Return the string representation of a card.
toLowerAscii(&"{card.number:<5} {card.color:<6} {card.symbol:<8} {card.shading:<7}")
 
 
proc initDeck(): Deck =
## Create a new deck.
var i = 0
for num in Number.low..Number.high:
for col in Color.low..Color.high:
for sym in Symbol.low..Symbol.high:
for sh in Shading.low..Shading.high:
result[i] = (number: num, color: col, symbol: sym, shading: sh)
inc i
 
 
proc isSet(triplet: Triplet): bool =
## Check if a triplets of cards is a set.
sum(triplet.mapIt(ord(it.number))) mod 3 == 0 and
sum(triplet.mapIt(ord(it.color))) mod 3 == 0 and
sum(triplet.mapIt(ord(it.symbol))) mod 3 == 0 and
sum(triplet.mapIt(ord(it.shading))) mod 3 == 0
 
 
proc playGame(level: Level) =
## Play the game at given level.
 
var deck = initDeck()
let (nCards, nSets) = if level == Basic: (9, 4) else: (12, 6)
var sets: seq[Triplet]
var hand: seq[Card]
echo &"Playing {level} game: {nCards} cards, {nSets} sets."
 
block searchHand:
while true:
sets.setLen(0)
deck.shuffle()
hand = deck[0..<nCards]
block countSets:
for i in 0..(nCards - 3):
for j in (i + 1)..(nCards - 2):
for k in (j + 1)..(nCards - 1):
let triplet = [hand[i], hand[j], hand[k]]
if triplet.isSet():
sets.add triplet
if sets.len > nSets:
break countSets # Too much sets. Try with a new hand.
if sets.len == nSets:
break searchHand # Found: terminate search.
 
# Display the hand and the sets.
echo "\nCards:"
for card in sorted(hand): echo " ", card
echo "\nSets:"
for s in sets:
for card in sorted(s): echo " ", card
echo()
 
 
randomize()
playGame(Basic)
echo()
playGame(Advanced)</lang>
 
{{out}}
<pre>Playing basic game: 9 cards, 4 sets.
 
Cards:
one purple oval solid
one purple diamond open
two red squiggle open
two green diamond open
two green diamond striped
two purple oval open
three red diamond solid
three red diamond open
three purple squiggle open
 
Sets:
one purple diamond open
two purple oval open
three purple squiggle open
 
one purple diamond open
two green diamond striped
three red diamond solid
 
two red squiggle open
two green diamond open
two purple oval open
 
one purple diamond open
two green diamond open
three red diamond open
 
 
Playing advanced game: 12 cards, 6 sets.
 
Cards:
one green diamond striped
one purple diamond striped
two red oval open
two red diamond open
two green oval solid
two green oval striped
three red squiggle striped
three green oval solid
three green squiggle solid
three green squiggle open
three green squiggle striped
three purple diamond open
 
Sets:
one green diamond striped
two green oval striped
three green squiggle striped
 
one purple diamond striped
two green oval striped
three red squiggle striped
 
one green diamond striped
two green oval solid
three green squiggle open
 
one purple diamond striped
two red oval open
three green squiggle solid
 
three green squiggle solid
three green squiggle open
three green squiggle striped
 
three red squiggle striped
three green oval solid
three purple diamond open</pre>
 
=={{header|PARI/GP}}==
Anonymous user