Set puzzle: Difference between revisions
Content added Content deleted
(Added Elixir) |
(Added EchoLisp) |
||
Line 925: | Line 925: | ||
purple one squiggle striped |
purple one squiggle striped |
||
green three diamond striped</pre> |
green three diamond striped</pre> |
||
=={{header|EchoLisp}}== |
|||
<lang scheme> |
|||
(require 'list) |
|||
;; a card is a vector [id color number symb shading], 0 <= id < 81 |
|||
(define (make-deck (id -1)) |
|||
(for*/vector( |
|||
[ color '(red green purple)] |
|||
[ number '(one two three)] |
|||
[ symb '( oval squiggle diamond)] |
|||
[ shading '(solid open striped)]) (++ id) (vector id color number symb shading))) |
|||
(define DECK (make-deck)) |
|||
;; pre-generate 531441 ordered triples, among which 6561 are winners |
|||
(define TRIPLES (make-vector (* 81 81 81))) |
|||
(define (make-triples ) |
|||
(for* ((i 81)(j 81)(k 81)) |
|||
(vector-set! TRIPLES (+ i (* 81 j) (* 6561 k)) |
|||
(check-set [DECK i] [DECK j] [DECK k])))) |
|||
;; a deal is a list of cards id's. |
|||
(define (show-deal deal) |
|||
(for ((card deal)) (writeln [DECK card])) |
|||
(for ((set (combinations deal 3))) |
|||
(when |
|||
(check-set [DECK (first set)] [DECK (second set)][DECK (third set)]) |
|||
(writeln 'winner set)))) |
|||
;; rules of game here |
|||
(define (check-set cards: a b c) |
|||
(for ((i (in-range 1 5))) ;; each feature |
|||
#:continue (and (= [a i] [b i]) (= [a i] [c i])) |
|||
#:continue (and (!= [a i] [b i]) (!= [a i] [c i]) (!= [b i][c i])) |
|||
#:break #t => #f )) |
|||
;; sets = list of triples (card-id card-id card-id) |
|||
(define (count-sets sets ) |
|||
(for/sum ((s sets)) |
|||
(if [TRIPLES ( + (first s) (* 81 (second s)) (* 6561 (third s)))] |
|||
1 0))) |
|||
;; task |
|||
(make-triples) |
|||
(define (play (n 9) (cmax 4) (sets) (deal)) |
|||
(while #t |
|||
(set! deal (take (shuffle (iota 81)) n)) |
|||
(set! sets (combinations deal 3)) |
|||
#:break (= (count-sets sets) cmax) => (show-deal deal) |
|||
)) |
|||
</lang> |
|||
{{out}} |
|||
<pre> |
|||
(play) ;; The 9-4 game by default |
|||
#( 13 red two squiggle open) |
|||
#( 54 purple one oval solid) |
|||
#( 2 red one oval striped) |
|||
#( 15 red two diamond solid) |
|||
#( 53 green three diamond striped) |
|||
#( 48 green three squiggle solid) |
|||
#( 41 green two squiggle striped) |
|||
#( 66 purple two squiggle solid) |
|||
#( 64 purple two oval open) |
|||
winner (13 54 53) |
|||
winner (13 41 66) |
|||
winner (54 15 48) |
|||
winner (15 41 64) |
|||
;; 10 deals |
|||
(play 12 6) |
|||
#( 43 green two diamond open) |
|||
#( 16 red two diamond open) |
|||
#( 79 purple three diamond open) |
|||
#( 63 purple two oval solid) |
|||
#( 60 purple one diamond solid) |
|||
#( 75 purple three squiggle solid) |
|||
#( 64 purple two oval open) |
|||
#( 71 purple two diamond striped) |
|||
#( 67 purple two squiggle open) |
|||
#( 34 green one diamond open) |
|||
#( 59 purple one squiggle striped) |
|||
#( 54 purple one oval solid) |
|||
winner (16 79 34) |
|||
winner (79 63 59) |
|||
winner (79 60 71) |
|||
winner (63 60 75) |
|||
winner (63 71 67) |
|||
winner (75 67 59) |
|||
;; 31 deals |
|||
;; the (9 6) game is more difficult |
|||
#( 11 red two oval striped) |
|||
#( 9 red two oval solid) |
|||
#( 26 red three diamond striped) |
|||
#( 5 red one squiggle striped) |
|||
#( 60 purple one diamond solid) |
|||
#( 43 green two diamond open) |
|||
#( 10 red two oval open) |
|||
#( 67 purple two squiggle open) |
|||
#( 48 green three squiggle solid) |
|||
winner (11 9 10) |
|||
winner (11 26 5) |
|||
winner (9 60 48) |
|||
winner (26 60 43) |
|||
winner (5 67 48) |
|||
winner (43 10 67) |
|||
;; 17200 deals |
|||
</pre> |
|||
=={{header|Elixir}}== |
=={{header|Elixir}}== |