Ok, here's one more:

[...]
      unless($ad) {
        print " * $ad = 0\n";
        $start = $digit;
        next DIGITS;
      }
[...]


You can skip right away to behind the 0 which has already been found
within the current range of adjacency.


lee <l...@yagibdah.de> writes:

> Sorry, I was too fast and I got it all wrong.  It goes like this:
>
>
> [...]
> my $adjacency = 13;
> my $maxprod = 0;
>
> my $start = 0;
> my $exceed = length($data);
> my $end = $exceed - $adjacency;
>
> DIGITS:
> while($start < $end) {
>   my $prod = substr($data, $start, 1);
>   print $prod;
>
>   if($prod) {
>     my $adjunct = 1;
>     my $digit = $start + $adjunct;
>
>     while(($adjunct < $adjacency) && ($digit < $exceed)) {
>       my $ad = substr($data, $digit, 1);
>       unless($ad) {
>       print " * $ad = 0\n";
>       next DIGITS;
>       }
>
>       print " * $ad";
>       $prod *= $ad;
>
>       $adjunct++;
>       $digit = $start + $adjunct;
>     }
>
>     print " = $prod\n";
>     $maxprod = $prod if($maxprod < $prod);
>   } else {
>     print " skipping\n";
>   }
> } continue {
>   $start++;
> }
>
> print "The largest product of $adjacency adjacent numbers is $maxprod.\n";
>
> exit 0;
>
>
> What is more expensive:  Using if() statements or letting it go trough
> on zeroes?  Using an array or substr()?
>
>
>
> lee <l...@yagibdah.de> writes:
>
>> Shlomi Fish <shlo...@shlomifish.org> writes:
>>
>>> Hi all!
>>>
>>> Resending because the original message does not appear to have arrived at 
>>> the
>>> list.
>>>
>>> =====
>>>
>>> Hi Derrick,
>>>
>>> On Tue, 16 May 2017 14:01:34 +0800
>>> derr...@thecopes.me wrote:
>>>
>>>> Hi All,
>>>> 
>>>> I am working on problem #8 of the euler project. see below.
>>>> 
>>>> 
>>>> I have the below solution below for this which works fine but gives me the
>>>> wrong answer. I checked shlomifish's solution on github and his is similar 
>>>> to
>>>> mine, more elegant since he uses "map", but he gets a different answer. I
>>>> feel like I have some basic misunderstanding about how something should 
>>>> work.
>>>> Or maybe I am misunderstanding the problem. Thanks in advance for any push 
>>>> in
>>>> the right direction. see my solution below.
>>>> 
>>>> Derrick
>>>> 
>>>> #! /usr/bin/env perl
>>>> 
>>>> use strict;
>>>> use warnings;
>>>> use 5.024;
>>>> use List::Util qw(max product);
>>>> 
>>>> my $totalmax = 0;
>>>> 
>>>> while ( my $numbline = <DATA> ) {
>>>>     chomp $numbline;
>>>>     my @numbline = split //, $numbline;
>>>
>>> You're processing the input number line-by-line, but it's one whole number 
>>> and
>>> the products may span across more than one line. You need to slurp it and
>>> prepare an array of digits.
>>
>> Isn't it more efficient to put all the digits into a string rather than
>> into an array and use substr()?
>>
>>
>> With a bit extra ado you could omit, for the sake of verifyability (It
>> doesn't matter in which order you do the multiplications of the adjacent
>> digits as long as they are adjacent.):
>>
>>
>> #!/usr/bin/perl
>>
>> use strict;
>> use warnings;
>>
>>
>> my $data = "
>> 73167176531330624919225119674426574742355349194934
>> 96983520312774506326239578318016984801869478851843
>> 85861560789112949495459501737958331952853208805511
>> 12540698747158523863050715693290963295227443043557
>> 66896648950445244523161731856403098711121722383113
>> 62229893423380308135336276614282806444486645238749
>> 30358907296290491560440772390713810515859307960866
>> 70172427121883998797908792274921901699720888093776
>> 65727333001053367881220235421809751254540594752243
>> 52584907711670556013604839586446706324415722155397
>> 53697817977846174064955149290862569321978468622482
>> 83972241375657056057490261407972968652414535100474
>> 82166370484403199890008895243450658541227588666881
>> 16427171479924442928230863465674813919123162824586
>> 17866458359124566529476545682848912883142607690042
>> 24219022671055626321111109370544217506941658960408
>> 07198403850962455444362981230987879927244284909188
>> 84580156166097919133875499200524063689912560717606
>> 05886116467109405077541002256983155200055935729725
>> 71636269561882670428252483600823257530420752963450
>> ";
>>
>> $data =~ s/\n//g;
>>
>> my $adjacency = 13;
>> my $maxprod = 0;
>>
>> my $start = 0;
>> my $end = length($data) - $adjacency;
>>
>> while($start < $end) {
>>   my $adjunct = 1;
>>   my $prod = substr($data, $start, 1);
>>   print "$prod";
>>   while($adjunct < $adjacency) {
>>     my $ad = substr($data, $start + $adjunct, 1);
>>     print " * $ad";
>>     $prod *= $ad;
>>     $adjunct++;
>>   }
>>   print " = $prod\n";
>>   $maxprod = $prod if($maxprod < $prod);
>>
>>   $start++;
>> }
>>
>> print "The largest product of $adjacency adjacent numbers is $maxprod.\n";
>>
>> exit 0;
>>
>>
>> Is this supposed to be a programming exercise?  It's a purely
>> mathematical one to me.
>>
>>
>>>
>>>>     say "@numbline ";
>>>>    my @product = (); 
>>>>     for (0..$#numbline - 13) {
>>>
>>> This should be "@numbline - 13" - an off-by-one error.
>>>
>>> Regards,
>>>
>>>     Shlomi Fish
>>
>> -- 
>> "Didn't work" is an error.
>
> -- 
> "Didn't work" is an error.

-- 
"Didn't work" is an error.

-- 
To unsubscribe, e-mail: beginners-unsubscr...@perl.org
For additional commands, e-mail: beginners-h...@perl.org
http://learn.perl.org/


Reply via email to