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}}== |