September 2017 Update
This commit is contained in:
parent
bba7bfd280
commit
ba8067c3b7
14570 changed files with 153136 additions and 63871 deletions
66
Task/Set-puzzle/Phix/set-puzzle.phix
Normal file
66
Task/Set-puzzle/Phix/set-puzzle.phix
Normal file
|
|
@ -0,0 +1,66 @@
|
|||
function comb(sequence pool, integer needed, sequence res={}, integer done=0, sequence chosen={})
|
||||
if needed=0 then -- got a full set
|
||||
sequence {a,b,c} = chosen
|
||||
if not find_any({3,5,6},flatten(sq_or_bits(sq_or_bits(a,b),c))) then
|
||||
res = append(res,chosen)
|
||||
end if
|
||||
elsif done+needed<=length(pool) then
|
||||
-- get all combinations with and without the next item:
|
||||
done += 1
|
||||
res = comb(pool,needed-1,res,done,append(chosen,pool[done]))
|
||||
res = comb(pool,needed,res,done,chosen)
|
||||
end if
|
||||
return res
|
||||
end function
|
||||
|
||||
constant m124 = {1,2,4}
|
||||
|
||||
function card(integer n)
|
||||
--returns the nth card (n is 1..81, res is length 4 of 1/2/4)
|
||||
n -= 1
|
||||
sequence res = repeat(0,4)
|
||||
for i=1 to 4 do
|
||||
res[i] = m124[remainder(n,3)+1]
|
||||
n = floor(n/3)
|
||||
end for
|
||||
return res
|
||||
end function
|
||||
|
||||
constant colours = {"red", "green", 0, "purple"},
|
||||
symbols = {"oval", "squiggle", 0, "diamond"},
|
||||
numbers = {"one", "two", 0, "three"},
|
||||
shades = {"solid", "open", 0, "striped"}
|
||||
|
||||
procedure print_cards(sequence hand, sequence cards)
|
||||
for i=1 to length(cards) do
|
||||
integer {c,m,n,g} = cards[i],
|
||||
id = find(cards[i],hand)
|
||||
printf(1,"%3d: %-7s %-9s %-6s %s\n",{id,colours[c],symbols[m],numbers[n],shades[g]})
|
||||
end for
|
||||
printf(1,"\n")
|
||||
end procedure
|
||||
|
||||
procedure play(integer cards=9, integer sets=4)
|
||||
integer deals = 1
|
||||
while 1 do
|
||||
sequence deck = shuffle(tagset(81))
|
||||
sequence hand = deck[1..cards]
|
||||
for i=1 to length(hand) do
|
||||
hand[i] = card(hand[i])
|
||||
end for
|
||||
sequence res = comb(hand,3)
|
||||
if length(res)=sets then
|
||||
printf(1,"dealt %d cards (%d deals)\n",{cards,deals})
|
||||
print_cards(hand,hand)
|
||||
printf(1,"with %d sets\n",{sets})
|
||||
for i=1 to sets do
|
||||
print_cards(hand,res[i])
|
||||
end for
|
||||
exit
|
||||
end if
|
||||
deals += 1
|
||||
end while
|
||||
end procedure
|
||||
play()
|
||||
--play(12,6)
|
||||
--play(9,6)
|
||||
Loading…
Add table
Add a link
Reference in a new issue