[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