[Oc-pm] looking for a bit of of help using "tr" & while loop
Bruce McKenzie
brucem at dynamicrange.com
Mon Aug 25 10:07:08 PDT 2008
And on shuffling, I'd suggest a few minor changes:
foreach (1..7)
{
print "--- Shuffle $_ ---\n";
shuffle( \@deck );
print "$_\n" foreach @deck;
}
sub shuffle
{
my $deck_ref = shift;
my @left_side = splice @$deck_ref, 0, 26;
my @right_side = @$deck_ref;
@$deck_ref = ();
while (@left_side || @right_side)
{
if ( ! @right_side || (@left_side && rand() < 0.5) )
{
push @$deck_ref, shift(@left_side);
}
else
{
push @$deck_ref, shift(@right_side);
}
}
}
Note the escapes for exhausted lists -- otherwise you're spinning
while waiting for a rand of the appropriate side when a list is
exhausted.
A cleaner way (though more lines) is:
if ( ! @right_side )
{
push @$deck_ref, @left_side;
last;
}
elsif ( ! @left_side )
{
push @$deck_ref, @right_side;
last;
}
elsif ( rand() < 0.5) )
{
push @$deck_ref, shift(@left_side);
}
else
{
push @$deck_ref, shift(@right_side);
}
And from card theory -- I seem to remember that 7 shuffles is the max
recommended number :-)
Cheers,
Bruce
On Aug 25, 2008, at 2:09 AM, Raul Ruiz Jr. wrote:
> I made a card shuffling program for a school project. It works! I
> was very happy about that :)
>
> However, I'm trying to figure out a way to convert my abbreviated
> Cards (located in @startingdeck) to actual words using a shortcut.
> I'm trying to use "tr" to convert my letters: For example; H now
> becomes Hearts, or K now is displayed as KING and so on. Here is my
> shuffle code. Can someone help me with how I can approach this in my
> program. I'm trying to use a while loop and "tr" to translate the
> Letters to actual words. I used the following loop thats high
> lighted in blue, and this is not doing what I want:
> Thanks for everyones time.
> while(@startingdeck){
> $list =~ tr/[A-Z]/qw(KING,QUEEN,JACK,ACE,SPADE,CLUB,HEARTS)/;
> this doesn't work in my code and it just hangs. What am I doing wrong?
>
> #!/usr/bin/perl
>
>
>
> my @startingdeck = ("A H","2 H","3 H","4 H","5 H","6 H","7 H","8 H",
>
> "9 H","10 H","J H","Q H","K H",
>
> "A D","2 D","3 D","4 D","5 D","6
> D","7 D","8 D",
>
> "9 D","10 D","J D","Q D","K D",
>
> "A C","2 C","3 C","4 C","5 C","6
> C","7 C","8 C",
>
> "9 C","10 C","J C","Q C","K C",
>
> "A S","2 S","3 S","4 S","5 S","6
> S","7 S","8 S",
>
> "9 S","10 S","J S","Q S","K S");
>
>
>
> my @right;
>
> my @left;
>
> SHUFFLE:
>
> unshift @left, pop @startingdeck for 1..26;
>
> @right = @startingdeck;
>
> @startingdeck = ();
>
> while(@left or @right){
>
> if (rand() < 0.5){
>
> @left and push @startingdeck, shift @left
>
> }else{
>
> @right and push @startingdeck, shift @right
>
> }
>
> };
>
>
>
> rand() < 0.9 and goto SHUFFLE;
>
>
>
> print "the top five cards are @startingdeck[0..4]\n";
>
>
> _______________________________________________
> Oc-pm mailing list
> Oc-pm at pm.org
> http://mail.pm.org/mailman/listinfo/oc-pm
---
Bruce McKenzie
brucem at dynamicrange.com
More information about the Oc-pm
mailing list