Because sets are unordered collections of items. And the (&) operator
returns a set.



Le dim. 8 sept. 2019 à 00:18, Aureliano Guedes <guedes.aureli...@gmail.com>
a écrit :

> Why does it dont return ordered for neither of those lists?
> I mean:
>
> my $u = "24680";
> my @s = $u.comb.unique;
> say @s ; # [2 4 6 8 0]
>
> sub matching_chars(Str $a, Str $b) {
>    my @c = $a.comb.unique;
>    my @d = $b.comb.unique;
>    return ~[@c (&) @d];
> }
>
> say matching_chars("24680", "1234567890"); # says 2 0 8 4
>
> On Mon, Sep 2, 2019 at 1:20 AM William Michels via perl6-users <
> perl6-users@perl.org> wrote:
>
>> 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
>> >> >
>> >> >
>> >> >
>> >> > --
>> >> > __________________
>> >> >
>> >> > :(){ :|:& };:
>>
>
>
> --
> Aureliano Guedes
> skype: aureliano.guedes
> contato:  (11) 94292-6110
> whatsapp +5511942926110
>

Reply via email to