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 <[email protected]> writes:
> Shlomi Fish <[email protected]> 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
>> [email protected] 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: [email protected]
For additional commands, e-mail: [email protected]
http://learn.perl.org/