in reply to Re^3: Checking for a special matching
in thread Checking for a special matching

Thanks for encouragement... somehow I did a simple algorithm for matching elements of array... It`s a bit awkward pattern and it`s not 100% matching since it matches only numbers from the string :(

#!/usr/bin/perl -wT use strict; use utf8; my @hand = ('k of hearts', '2 of hearts', '2 of diamonds', '10 of spa +des', 'Q of clubs', 'j of clubs', '10 of diamonds', '3 of hearts'); for ( my $i=0; $i<$#hand+1; $i++) { for ( my $j=$i+1; $j<$#hand+1; $j++) { if ( ($hand[$i] << 1) == ($hand[$j] <<1 ) ) { print $hand[$i], $hand[$j], "\n"; } } }

This matched the pair of 2s and thee pair of 10s but matches and pair of Q and J which is wrong :(, well for now I can`t come with a better solution but I`ll keep improving.

Replies are listed 'Best First'.
Re^5: Checking for a special matching
by aaron_baugher (Curate) on Apr 04, 2012 at 09:15 UTC

    I'm not sure what you think the left bitshift operator << will do when used on a string like this, but if you add this line inside your loops:

    print join(' ;; ', $hand[$i], ($hand[$i] << 1), $hand[$j], ( $hand[$j] << 1 )), "\n";
    You'll see results like this:
    Values: 10 of spades ;; 20 ;; 3 of hearts ;; 6 Values: Q of clubs ;; 0 ;; j of clubs ;; 0 Q of clubsj of clubs

    What's happening is: the bitshift operator expects to work on an integer. So it tries to turn your string into a integer. In the cases where the string does start with an integer, it uses that integer, so '10 of spades' becomes '20', '3 of hearts' becomes '6', and so on. But in the cases where the string does not contain an integer, like 'j of clubs', it uses the value 0, which shifted left is still 0, so those strings all match as 'equal' to each other.

    Aaron B.
    My Woefully Neglected Blog, where I occasionally mention Perl.