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 <[email protected]> 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 <[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.
--
"Didn't work" is an error.
--
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
http://learn.perl.org/