From fast.linux at yahoo.com Mon Aug 25 02:09:49 2008 From: fast.linux at yahoo.com (Raul Ruiz Jr.) Date: Mon, 25 Aug 2008 02:09:49 -0700 (PDT) Subject: [Oc-pm] looking for a bit of of help using "tr" & while loop Message-ID: <982253.88730.qm@web45714.mail.sp1.yahoo.com> 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"; -------------- next part -------------- An HTML attachment was scrubbed... URL: From btilly at gmail.com Mon Aug 25 07:00:38 2008 From: btilly at gmail.com (Ben Tilly) Date: Mon, 25 Aug 2008 07:00:38 -0700 Subject: [Oc-pm] looking for a bit of of help using "tr" & while loo In-Reply-To: <982253.88730.qm@web45714.mail.sp1.yahoo.com> References: <982253.88730.qm@web45714.mail.sp1.yahoo.com> Message-ID: On Mon, 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. Unfortunately tr only substitutes letter for letter, so it cannot change the number of letters. You want to use regular expressions and the s operator. Like this (untested): for my $card (@startingdeck) { $card =~ s/A/Ace/; $card =~ s/K/King/; $card =~ s/Q/Queen/; $card =~ s/J/Jack/; $card =~ s/D/Diamond/; $card =~ s/H/Heart/; $card =~ s/S/Spade/; $card =~ s/C/Club/; } Note that I used mixed case so that, for instance A didn't turn into ACE which would later turn into ACLUBE when the C was substituted. If you wish to change that you can then uc all of the cards or else use the following trick: my %expanded = ( A => "ACE", K => "KING", Q => "QUEEN", J => "JACK" D => "DIAMOND", H => "HEART", S => "SPADE", C => "CLUB", ); # This line assumes no metacharacters, and no key is a piece of another. my $re = join "|", keys %expanded; # If those assumptions are wrong, use this version instead: # my $re = join "|", map quotemeta($_), reverse sort keys %expanded; for my $card (@startingdeck) { $card =~ s/$re/$expanded{$1}/g; } However note that it is simplest to just start the starting deck off with what you want: my @startingdeck; for my $size ("ACE", 2..10, "JACK", "QUEEN", "KING") { for my $suit ("HEART", "DIAMOND", "CLUB", "SPADE") { push @startingdeck, "$size $suit"; } } And while I'm giving general advice, use strict. See http://www.perlmonks.org/index.pl?node=strict.pm for an explanation why. Cheers, Ben From brucem at dynamicrange.com Mon Aug 25 10:07:08 2008 From: brucem at dynamicrange.com (Bruce McKenzie) Date: Mon, 25 Aug 2008 10:07:08 -0700 Subject: [Oc-pm] looking for a bit of of help using "tr" & while loop In-Reply-To: <982253.88730.qm@web45714.mail.sp1.yahoo.com> References: <982253.88730.qm@web45714.mail.sp1.yahoo.com> Message-ID: <3F759BE2-57ED-46DC-9AB7-5EEEF45FDBA5@dynamicrange.com> 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