Set puzzle: Difference between revisions

Content added Content deleted
m (→‎{{header|Wren}}: Minor tidy)
Line 2,760: Line 2,760:
[Card: RED, THREE, OVAL, STRIPED]
[Card: RED, THREE, OVAL, STRIPED]
[Card: PURPLE, TWO, SQUIGGLE, SOLID]</pre>
[Card: PURPLE, TWO, SQUIGGLE, SOLID]</pre>

=={{header|jq}}==
'''Adapted from [[#Wren|Wren]]'''

'''Works with jq, the C implementation of jq'''

'''Works with gojq, the Go implementation of jq'''

The following solution for the most part allows for $k attributes each
of which has the same number, $j, of values. The attribute values are
represented abstractly as integers in the range from 0 up to but
excluding $j.

The two functions which would need to be modified for the generalized Set
game are marked as such.

Since jq does not have a built-in PRNG, the
[[:Category:Jq/MRG32k3a.jq|MRG32k3a module]] is used for convenience.
<syntaxhighlight lang="jq">
# Source of entropy
include "MRG32k3a" {search: "."}; # see above

### General utilities

def lpad($len): tostring | ($len - length) as $l | (" " * $l) + .;

def array_swap($i; $j):
if $i < $j then array_swap($j;$i)
elif $i == $j then .
else .[$i] as $t
| .[:$j] + [$t] + .[$j:$i] + .[$i + 1:]
end ;

# input: array of length $n
def shuffle:
length as $n
| ($n | prn($n)) as $prn
# First cut the deck
| .[$prn[0]:] + .[:$prn[0]]
| reduce range(0; $n - 1) as $i (.;
array_swap($prn[$i]; $prn[$i+1]) ) ;


### The Set Game

# For the standard Set game:
def attributes: ["Color", "Symbol", "Number", "Shading"];

# a single card
def toString:
[attributes, .] | transpose
| map(join(": ")|lpad(7))
| join(" ");

# Create a deck for which each attribute defined by `attributes` has $j possible values:
def createDeck($j):
(attributes|length) as $k
| [range(0;$j)]
| [combinations($k)];

def isSet:
. as $trio
| all( range(0; attributes|length);
. as $i | $trio | map(.[$i]) | unique | length | IN(1,3));

# For the standard Set game
# For "advanced" play, set $advanced == true
def playGame( $advanced ):
(if $advanced then 12 else 9 end) as $nCards
| (($nCards/2)|floor) as $nSets
| {sets: [], deck: createDeck(3) }
| label $out
| foreach range(0; infinite) as $_ (.;
.deck |= shuffle
| .count = 0
| foreach range(0; $nCards-2) as $i (.;
foreach range($i+1; $nCards-1) as $j (.;
foreach range($j+1; $nCards) as $k (.;
[.deck[$i], .deck[$j], .deck[$k]] as $trio
| if $trio | isSet
then .sets += [$trio]
| if (.sets|length) >= $nSets
then .emit = true, break $out
end
end ) ) ) )
| select(.emit)
| (.deck[0:$nCards] | sort) as $hand
| "DEALT \($nCards) CARDS:",
($hand[]|toString),
"\nCONTAINING \($nSets) SETS:",
(.sets
| sort[]
| ((.[] | toString),"") ), "" ;

playGame(false, true)
</syntaxhighlight>
{{output}}
<pre>
DEALT 9 CARDS:
Color: 0 Symbol: 0 Number: 0 Shading: 2
Color: 0 Symbol: 1 Number: 2 Shading: 2
Color: 0 Symbol: 2 Number: 1 Shading: 1
Color: 1 Symbol: 2 Number: 2 Shading: 1
Color: 2 Symbol: 0 Number: 0 Shading: 2
Color: 2 Symbol: 0 Number: 2 Shading: 0
Color: 2 Symbol: 1 Number: 1 Shading: 0
Color: 2 Symbol: 1 Number: 1 Shading: 2
Color: 2 Symbol: 2 Number: 1 Shading: 1

CONTAINING 4 SETS:
Color: 0 Symbol: 0 Number: 0 Shading: 2
Color: 1 Symbol: 2 Number: 2 Shading: 1
Color: 2 Symbol: 1 Number: 1 Shading: 0

Color: 0 Symbol: 2 Number: 2 Shading: 1
Color: 2 Symbol: 2 Number: 2 Shading: 0
Color: 1 Symbol: 2 Number: 2 Shading: 2

Color: 1 Symbol: 1 Number: 0 Shading: 2
Color: 0 Symbol: 2 Number: 0 Shading: 1
Color: 2 Symbol: 0 Number: 0 Shading: 0

Color: 2 Symbol: 0 Number: 2 Shading: 2
Color: 2 Symbol: 1 Number: 2 Shading: 2
Color: 2 Symbol: 2 Number: 2 Shading: 2


DEALT 12 CARDS:
Color: 0 Symbol: 0 Number: 0 Shading: 2
Color: 0 Symbol: 1 Number: 0 Shading: 2
Color: 0 Symbol: 1 Number: 1 Shading: 1
Color: 0 Symbol: 1 Number: 2 Shading: 0
Color: 0 Symbol: 2 Number: 1 Shading: 0
Color: 1 Symbol: 0 Number: 0 Shading: 1
Color: 1 Symbol: 2 Number: 1 Shading: 0
Color: 2 Symbol: 0 Number: 1 Shading: 1
Color: 2 Symbol: 2 Number: 0 Shading: 0
Color: 2 Symbol: 2 Number: 0 Shading: 1
Color: 2 Symbol: 2 Number: 1 Shading: 0
Color: 2 Symbol: 2 Number: 1 Shading: 1

CONTAINING 6 SETS:
Color: 0 Symbol: 2 Number: 1 Shading: 0
Color: 1 Symbol: 2 Number: 1 Shading: 0
Color: 2 Symbol: 2 Number: 1 Shading: 0

Color: 1 Symbol: 1 Number: 2 Shading: 1
Color: 1 Symbol: 1 Number: 1 Shading: 2
Color: 1 Symbol: 1 Number: 0 Shading: 0

Color: 2 Symbol: 2 Number: 1 Shading: 0
Color: 2 Symbol: 2 Number: 1 Shading: 1
Color: 2 Symbol: 2 Number: 1 Shading: 2

Color: 2 Symbol: 2 Number: 1 Shading: 1
Color: 2 Symbol: 2 Number: 2 Shading: 0
Color: 2 Symbol: 2 Number: 0 Shading: 2

Color: 2 Symbol: 2 Number: 1 Shading: 2
Color: 2 Symbol: 2 Number: 0 Shading: 2
Color: 2 Symbol: 2 Number: 2 Shading: 2

Color: 2 Symbol: 2 Number: 2 Shading: 0
Color: 0 Symbol: 1 Number: 1 Shading: 0
Color: 1 Symbol: 0 Number: 0 Shading: 0
</pre>


=={{header|Julia}}==
=={{header|Julia}}==