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.

-- 
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