Thanks Simon, good point. I ran into the same trouble as others trying
to get the answer via regex, and switched over to sets as an
alternative. I'll confess I completely missed that Yary's Perl5 code
returned the substring "8420" present in his test "19584203" string,
and that was the answer he was going for.

Simon and Eirik, I still think there might be some value in calling
the .unique method on $chars.comb as in "$chars.comb.unique". But I
haven't had the opportunity to check code efficiency  +/-  the
".unique" method call.

For those interested in using Sets as a solution, you can stringifying
the 'return' line (below). Still working on using "join()" to
concatenate!

sub matching_chars(Str $a, Str $b) {
   my @c = $a.comb.unique;
   my @d = $b.comb.unique;
   #return (~[@c (&) @d]).^name;
   return ~[@c (&) @d];
}

say matching_chars("24680", "19584203"); # says 2 0 8 4
say matching_chars('+\/\]\[', 'Apple ][+//e'); # says [ + ] /
say matching_chars("Lorem ipsum dolor sit amet, consectetuer
adipiscing elit.", "abcdef"); # says c a d e


HTH, Bill.

PS. Simon, thanks for all the great Youtube videos you've done from LondonPM!

https://youtu.be/yt8SrZ_V_50
https://youtu.be/9M1xZQ0_Skw








On Sun, Sep 1, 2019 at 9:59 AM Simon Proctor <simon.proc...@gmail.com> wrote:
>
> Using a set would be good but it doesn't give you the matching string from 
> the original (which is what I thought was required) otherwise Sets would be 
> my first thought.
>
> On Sun, 1 Sep 2019, 17:57 William Michels, <w...@caa.columbia.edu> wrote:
>>
>> Hi Yary and Paul and Simon,
>>
>> I ran into the same difficulties as Yary with repeated characters, so
>> I tried the .unique method. Then after a while, I realized that
>> problems like this might best be treated as "Set" problems in Perl6.
>> Note the Set Intersection operator "(&)" below:
>>
>> sub matching_chars(Str $a, Str $b) {
>>    my @c = $a.comb.unique;
>>    my @d = $b.comb.unique;
>>    #say @c; say @d;
>>    return @c (&) @d;
>> }
>>
>> say matching_chars("24680", "19584203"); #RETURNS set(0 2 4 8)
>> say matching_chars('+\/\]\[', 'Apple ][+//e'); #RETURNS set(+ / [ ])
>>
>>
>> https://docs.perl6.org/routine/Set
>> https://docs.perl6.org/language/operators#infix_(&),_infix_∩
>>
>> HTH, Bill.
>>
>>
>> On Sat, Aug 31, 2019 at 8:59 PM Paul Procacci <pproca...@gmail.com> wrote:
>> >
>> > I'm not entirely sure if this is the correct answer, but if you define 
>> > your own custom character class
>> > with a 'regex' object, you can use that in the grouping.
>> >
>> > sub matching_chars(Str $chars_to_match, Str $_) {
>> >     my regex x { $chars_to_match ** 1 };
>> >     m/<[<x>]>/;
>> > }
>> >
>> > The above worked for me in the very small testing I did.
>> >
>> > ~Paul
>> >
>> > On Sat, Aug 31, 2019 at 9:54 PM yary <not....@gmail.com> wrote:
>> >>
>> >> I found something easy in Perl 5 that's puzzling me in Perl 6- specifying 
>> >> a character class via a variable.
>> >>
>> >> Perl 5:
>> >> sub matching_chars {
>> >>   (my $chars_to_match, local $_) = @_;
>> >>   /([$chars_to_match]+)/
>> >> }
>> >>
>> >> say matching_chars('24680', '19584203'); # says 8420
>> >> say matching_chars('+\/\]\[', 'Apple ][+//e'); # says ][+//
>> >>
>> >> Perl 6:
>> >> sub matching_chars(Str $chars_to_match, Str $_) {
>> >>     # warnings, treats as string not variable
>> >>     m/<[$chars_to_match]>/;
>> >> }
>> >>
>> >> How do I get Perl 6 to interpret a variable in the contents of a 
>> >> character class?
>> >> From http://docs.perl6.org/language/regexes#Regex_interpolation I'd think 
>> >> that  Rakudo would use the literal contents of $chars_to_match, instead 
>> >> it's using the literal chars "$ c h a r s _ t o _ m a t c h" and warning 
>> >> about repeated c, underscore, etc.
>> >>
>> >> -y
>> >
>> >
>> >
>> > --
>> > __________________
>> >
>> > :(){ :|:& };:

Reply via email to