here's a way to not re-test a,b == b,a

squish(sort flat map {$_..31 X[&({$^a**$^b+$b**$a})] $_},2..31)

I'm not completely happy with it, but it does work and is about 30% faster

squish(sort [X[&({$^a**$^b+$b**$a})]] 2..31,2..31) eqv squish(sort flat map
{$_..31 X[&({$^a**$^b+$b**$a})] $_},2..31)
True

say (grep {$_ < 1e11}, squish(sort flat map {$_..31 X[&({$^a**$^b+$b**$a})]
$_},2..31)) ~ ' took ' ~ (now - BEGIN now)
...took 0.0161237 vs
say (grep {$_ < 1e11}, squish(sort [X[&({$^a**$^b+$b**$a})]] 2..31,2..31))
~ ' took ' ~ (now - BEGIN now)
...took 0.0240974



-y


On Sun, Oct 11, 2020 at 8:32 PM yary <not....@gmail.com> wrote:

> Since this is a golf exercize, reducing number of characters, why use the
> reduction form when infix is shorter?
>
> squish(sort [X[&({$^a**$^b+$b**$a})]] 2..31,2..31) # from original
> squish(sort 2..31 X[&({$^a**$^b+$b**$a})] 2..31) # infix is 2-chars
> shorter
>
> Also I am trying to do a little un-golf speed-optimizing, the Wiki page
> for the sequence notes that requiring a<=b removes trivial duplicates.
> Let's see what I can figure out in the near future...
>
> -y
>
>
> On Sun, Oct 11, 2020 at 5:55 PM Cezmi Pastirma <cezmisi...@yandex.com>
> wrote:
>
>> Wow, that's a very comprehensive explanation. I've just found out that I
>> couldn't even comprehend the first reduction operator. I was thinking it
>> was doing some magic operations. All it did was enable the cross op to act
>> on the 2 lists without having to be  between   them. As simple as that. And
>> surely I mis-took the second bracket as a second reduction. Now it's clear
>> that it's for Nesting of metaoperators
>> <https://docs.raku.org/language/operators#___top>  Actually I was
>> guessing this fine detail must have been documented in the Raku docs but I
>> hadn't the faintest idea how to search for it in the huge docs of Raku :)
>>
>> The custom operator definition to separate the Cross from the Op is very
>> welcome too. I haven't written any custom op in Raku so far and it's good
>> to see it in action.
>>
>> Thank you for your time. Very much appreciated.
>>
>>
>> 11.10.2020, 21:31, "Bruce Gray" <robertbrucegr...@gmail.com>:
>>
>> NOTE: 30 minutes from now is the start of the Raku Study Group of the San
>> Francisco Perl Mongers.
>> We can offer a "deep dive" into how the Leyland code works, if that would
>> be helpful.
>> Zoom details here:
>> https://mail.pm.org/pipermail/sanfrancisco-pm/2020-October/004726.html
>>
>>
>>  On Oct 11, 2020, at 10:39 AM, Cezmi Pastirma <cezmisi...@yandex.com>
>> wrote:
>>
>>  I've got a question about a Leyland-numbers-listing Raku code which I
>> saw at codegolf.stackexchange.com at
>> https://codegolf.stackexchange.com/a/83013/98132
>>
>>  I've slightly rearranged the code to make it print Leyland numbers up to
>> 1 Billion:
>>  .say for grep {$_ < 1E11}, squish(sort [X[&({$^a**$^b+$b**$a})]]
>> 2..32,2..32)
>>
>>  The question in short is:
>>
>>  How does the cross reduce work there?
>>
>>
>> The reduction is a red herring to our understanding here.
>> Note that, when you are only [reducing] on two lists, `[any_op_here] @a,
>> @b` is the same as `@a any_op_here @b`.
>> These are equivalent:
>>         say [X+] 2..4, 1..5;
>>         say 2..4 X+ 1..5;
>> The operator need not be a meta-operator:
>>         say [*] 3, 5;
>>         say 3 * 5;
>>
>>  Extra info:
>>
>>  That cross reduce section surely does what this half-pseudo code tries
>> to do:
>>  map { $^a ** $^b + $b ** $a }, 2..32,32…2
>>
>>
>> If @c has 20 elements, and @d has 30 elements, then `@c X+ @d` has 600
>> elements.
>> You cannot produce the equivalent with a simple `map`.
>> (You could with a flattened map-within-a-map)
>>
>>
>> Simplifying your "slightly rearranged” code:
>>         .say for grep {$_ < 1E11}, squish(sort [X[&({$^a**$^b+$b**$a})]]
>> 2..32,2..32)
>>
>> ...to just the part you are curious about, we get:
>>         say [X[&({$^a**$^b+$b**$a})]] 2..4,2..4;
>>                 (8 17 32 17 54 145 32 145 512)
>>
>> We are only [reducing] on two lists, so we can remove the reduction, and
>> just use the Xop:
>>         say 2..4 X[&({$^a**$^b+$b**$a})] 2..4;
>>                 (8 17 32 17 54 145 32 145 512)
>>
>>
>>  The tricky part here is the use of reduce operators two times in a row,
>> once before the cross operator, once before the & operator, which I guess
>> donates a closure. How to interpret this usage of operators?
>>
>>
>>
>> The square brackets after the X, I think you mis-took as a second
>> reduction.
>>
>> Those brackets are just there to disambiguate the `op` that the `X` is
>> crossing on.
>>     See:
>> https://docs.raku.org/language/operators#Nesting_of_metaoperators
>>
>> These are equivalent:
>>     .say for ^2 X+ ^2;
>>     .say for ^2 X[+] ^2;
>>
>>
>> We can create our own operator, to further separate the Cross from the Op:
>>         multi infix:<⨁> ($a, $b) {
>>                    $a ** $b
>>                 + $b ** $a
>>         };
>>         say 2 ⨁ 3;
>>         say 2..4 X⨁ 2..4;
>>                 17
>>                 (8 17 32 17 54 145 32 145 512)
>>
>> The `X` itself is the operator-form of the `cross` routine,
>> well-documented here:
>>         https://docs.raku.org/routine/cross
>>
>> https://docs.raku.org/language/operators#index-entry-X_(cross_metaoperator)
>>
>> https://docs.raku.org/language/operators#index-entry-cross_product_operator
>>
>> If any part of this was lacking in clarity, please let me know where to
>> focus, and I will be glad to expound.
>>
>> --
>> Hope this helps,
>> Bruce Gray (Util of Perlmonks)
>>
>>

Reply via email to