On Wed, 25 May 2005, Rob Kinyon wrote:
(This post references the discussion at
http://www.perlmonks.org/?node_id=458728, particularly dragonchild's
response at the bottom.)
For those who don't know, cribbage is a game where each player has
access to 4 cards, plus a community card. Various card combinations
score points. The one in question is when cards add up to 15. If you
have a group of cards that add up to 15, you receive 2 points. This is
for every group, so if you have a ten and 2 fives, you get 4 points.
Two tens and two fives is 8 points. Face cards are worth 10 and aces
are 1, for these purposes.
I proposed the following:
# Fifteens
$score += 2 * all( 15 == [EMAIL PROTECTED] any( 0 .. 4 ) } );
* Is this syntax legal?
I think so.
* Does it do what I want it to do?
Definitely not. It looks like you are thinking of junctions in terms of
arrays, instead of scalar quantum superpositions.
any( 0 .. 4 )
This returns a scalar junction of the five values (0,1,2,3,4).
What you want is clearly all possible subsets of 0..4. You probably
should write a coroutine to generate a lazy list of them.
@hand{ $junction }
returns a scalar junction of the five cards in the hand. Junctions
auto-thread through operators, including postcircumfixes.
[+] $junction
returns $junction, since [+] $scalar == $scalar. The individual values
auto-thread through.
15 == $junction
This returns a junction of booleans. Knowing the possible values of
@hand, all of them are false.
all( $junction )
I'm not real good with nested junctions...
2 * $junction
This returns another junction, with all elements doubled. (still zeros)
You obviously want 2 * junction.elems, but I'm not sure if junctions
support that method.
$score += $junction
Again this will make $score a junction of values. It will not add each of
the junction values to $score. You probably want something like
C $score += $junction.values but that is another indication
that you should be using arrays instead of junctions. And I'm not sure
about the object interface to junctions anyway.
* Is there another way?
Assuming you write the subset coroutine above, how about
$score +=
( subsets(0..4) == map { 2 * (15 == [+] @[EMAIL PROTECTED]) } == [+] )
~ John Williams