Set puzzle: Difference between revisions

Go solution
(Go solution)
Line 445:
{card,2,squiggle,solid,purple},
{card,3,oval,open,purple}}
</pre>
 
=={{header|Go}}==
<lang go>package main
 
import (
"fmt"
"math/rand"
"time"
)
 
var (
number = []string{"1", "2", "3"}
color = []string{"red", "green", "purple"}
shade = []string{"solid", "open", "striped"}
shape = []string{"oval", "squiggle", "diamond"}
)
 
type card int
 
func (c card) String() string {
return fmt.Sprintf("%s %s %s %s",
number[c/27],
color[c/9%3],
shade[c/3%3],
shape[c%3])
}
 
func main() {
rand.Seed(time.Now().Unix())
basic()
advanced()
}
 
func basic() {
game("Basic", 9, 4)
}
 
func advanced() {
game("Advanced", 12, 6)
}
 
func game(level string, cards, sets int) {
// create deck
d := make([]card, 81)
for i := range d {
d[i] = card(i)
}
var found [][3]card
for len(found) != sets {
found = found[:0]
// deal
for i := 0; i < cards; i++ {
j := rand.Intn(81 - i)
d[i], d[j] = d[j], d[i]
}
// consider all triplets
for i := 2; i < cards; i++ {
c1 := d[i]
for j := 1; j < i; j++ {
c2 := d[j]
l3:
for _, c3 := range d[:j] {
for f := card(1); f < 81; f *= 3 {
if (c1/f%3+c2/f%3+c3/f%3)%3 != 0 {
continue l3 // not a set
}
}
// it's a set
found = append(found, [3]card{c1, c2, c3})
}
}
}
}
// found the right number
fmt.Printf("%s game. %d cards, %d sets.\n", level, cards, sets)
fmt.Println("Cards:")
for _, c := range d[:cards] {
fmt.Println(" ", c)
}
fmt.Println("Sets:")
for _, s := range found {
fmt.Println(" ", s[0])
fmt.Println(" ", s[1])
fmt.Println(" ", s[2])
fmt.Println()
}
}</lang>
{{out}}
<pre>
Basic game. 9 cards, 4 sets.
Cards:
3 red solid oval
3 red open oval
3 purple striped oval
2 green striped oval
2 red solid oval
1 purple open diamond
2 purple solid squiggle
1 green striped diamond
3 green striped squiggle
Sets:
2 purple solid squiggle
1 purple open diamond
3 purple striped oval
 
1 green striped diamond
2 purple solid squiggle
3 red open oval
 
3 green striped squiggle
1 purple open diamond
2 red solid oval
 
3 green striped squiggle
1 green striped diamond
2 green striped oval
 
Advanced game. 12 cards, 6 sets.
Cards:
2 green solid squiggle
3 red solid oval
3 purple open oval
2 purple open squiggle
3 red striped oval
1 red open oval
1 purple open diamond
1 green striped squiggle
3 red open oval
3 red striped squiggle
2 red striped oval
1 purple solid diamond
Sets:
1 purple open diamond
2 purple open squiggle
3 purple open oval
 
1 purple open diamond
3 red striped oval
2 green solid squiggle
 
3 red open oval
3 red striped oval
3 red solid oval
 
2 red striped oval
1 red open oval
3 red solid oval
 
1 purple solid diamond
3 red solid oval
2 green solid squiggle
 
1 purple solid diamond
1 green striped squiggle
1 red open oval
</pre>
 
1,707

edits