in reply to Tri state string compare? (Solved! see update2)

There's something missing in that solution, or I don't understand it. I'd have expected something like:

use strict; use warnings; my $abc = 'AABCBAABCCCCAB'; my $yes = 'AABABAABABABAB'; my $no1 = 'ABBABAABABABAB'; my $no2 = 'ABBABAABABAB'; $abc =~ tr/AB/\0/c; print +(($abc & $_) eq $abc) ? "$_: yes\n" : "$_: no\n" for $yes, $no1 +, $no2;

Prints:

AABABAABABABAB: yes ABBABAABABABAB: no ABBABAABABAB: no

The test fails if you change all the Bs to Es of course.

Premature optimization is the root of all job security

Replies are listed 'Best First'.
Re^2: Tri state string compare? (Solved! see update2)
by BrowserUk (Patriarch) on Dec 13, 2015 at 21:19 UTC
    There's something missing in that solution, or I don't understand it

    Does the fact that I know all my strings will be equal length explain things?

    Here's my test code:

    #! perl -slw use strict; my $pat = 'AAAAAAABCCCCCCCCABAAAAAAA'; my @set = ( 'AAAAAAABAAABABBBABAAAAAAA', 'AAAAAAABAAABBABBABAAAAAAA', 'AAAAAAABAAABBBABABAAAAAAA', 'AAAAAAABBAAABABBABAAAAAAA', 'AAAAAAABBAAABBABABAAAAAAA', 'AAAAAAABBBAAABABABAAAAAAA', 'ABAAAAABAAABABBBABAAAAAAA', 'AAAAAAAAAAABBABBABAAAAAAA', 'AAAAAAABAAABBBABAABAAAAAA', 'AAAAAAABBAAABABBABAAAAAAA', 'AAAAABABBAAABBABAAAAAAAAA', 'AAAAAAABBBAAABABAAAAAAAAA', ); for my $test ( @set ) { printf "$pat\n$test\n%s %s\n\n", $pat & $test, ( $pat & $test ) eq + $test ? 'OK' : 'NO'; } __END__ C:\test>junk77 AAAAAAABCCCCCCCCABAAAAAAA AAAAAAABAAABABBBABAAAAAAA AAAAAAABAAABABBBABAAAAAAA OK AAAAAAABCCCCCCCCABAAAAAAA AAAAAAABAAABBABBABAAAAAAA AAAAAAABAAABBABBABAAAAAAA OK AAAAAAABCCCCCCCCABAAAAAAA AAAAAAABAAABBBABABAAAAAAA AAAAAAABAAABBBABABAAAAAAA OK AAAAAAABCCCCCCCCABAAAAAAA AAAAAAABBAAABABBABAAAAAAA AAAAAAABBAAABABBABAAAAAAA OK AAAAAAABCCCCCCCCABAAAAAAA AAAAAAABBAAABBABABAAAAAAA AAAAAAABBAAABBABABAAAAAAA OK AAAAAAABCCCCCCCCABAAAAAAA AAAAAAABBBAAABABABAAAAAAA AAAAAAABBBAAABABABAAAAAAA OK AAAAAAABCCCCCCCCABAAAAAAA ABAAAAABAAABABBBABAAAAAAA A@AAAAABAAABABBBABAAAAAAA NO AAAAAAABCCCCCCCCABAAAAAAA AAAAAAAAAAABBABBABAAAAAAA AAAAAAA@AAABBABBABAAAAAAA NO AAAAAAABCCCCCCCCABAAAAAAA AAAAAAABAAABBBABAABAAAAAA AAAAAAABAAABBBABA@@AAAAAA NO AAAAAAABCCCCCCCCABAAAAAAA AAAAAAABBAAABABBABAAAAAAA AAAAAAABBAAABABBABAAAAAAA OK AAAAAAABCCCCCCCCABAAAAAAA AAAAABABBAAABBABAAAAAAAAA AAAAA@ABBAAABBABA@AAAAAAA NO AAAAAAABCCCCCCCCABAAAAAAA AAAAAAABBBAAABABAAAAAAAAA AAAAAAABBBAAABABA@AAAAAAA NO

    With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority". I knew I was on the right track :)
    In the absence of evidence, opinion is indistinguishable from prejudice.
Re^2: Tri state string compare? (Solved! see update2)
by Anonymous Monk on Dec 13, 2015 at 22:25 UTC
    A bit more digestible explanation (imo):
    $ perl -e 'printf "$_ => %b\n", ord($_) for qw( A B C @ )' A => 1000001 B => 1000010 C => 1000011 @ => 1000000
    so, "A" & "B" (0b1000001 & 0b1000010) yields "@" (0b1000000), "A" & "C" (0b1000001 & 0b1000011) yields "A" (0b1000001), "B" & "C" yields "B".

    So, for example:

    "ABC" & "ABA" => "ABA" "ABB" & "ABA" => "AB@" "ABC" & "AB" => "AB" # perlop: "the & op acts as though the longer operand # were truncated to the length of the shorter" # so the strings don't have to be equal length # for that to work

      Yes, I was being thick. The penny dropped 30s after seeing BUK's reply.

      Premature optimization is the root of all job security
        Yeah, I thought you probably didn't need explanations, but decided to write anyway, because someone else might find it useful :)
      A bit more digestible explanation (imo):

      IMO also :)


      With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      "Science is about questioning the status quo. Questioning authority". I knew I was on the right track :)
      In the absence of evidence, opinion is indistinguishable from prejudice.
      so the strings don't have to be equal length for that to work
      oops! of course, that would work only if the test string shorter that the tested string