Hi lee!

On Thu, 25 May 2017 02:24:05 +0100
lee <l...@yagibdah.de> wrote:

> 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()?
> 

I believe it should be more space efficient, but perl shouldn't have a problem
managing an array of a 1,000 digits on most machines. See
https://duckduckgo.com/?q=premature+optimization+evil+quote&ia=web - we should
worry about optimising when we need to - not before. Using arrays allows us to
use convenient operators and functions that are less native to strings.

Also note that using http://perldoc.perl.org/functions/vec.html should allow to
store a digit within 4 bits in a binary buffer, which is even better than using
a string.

Some comments about your code:

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

Please use here-documents for multi-line strings - see
http://perl-begin.org/tutorials/bad-elements/#string-notation .

> $data =~ s/\n//g;
> 

Nice! Perhaps use \s or [^0-9] instead though.
> my $adjacency = 13;
> my $maxprod = 0;
> 
> my $start = 0;
> my $end = length($data) - $adjacency;
> 
> while($start < $end) {

This should be a «for my $idx ($start .. $end-1)» loop.
>   my $adjunct = 1;
>   my $prod = substr($data, $start, 1);
>   print "$prod";
>   while($adjunct < $adjacency) {

Again.

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

No need for the exit statement here.

> 
> Is this supposed to be a programming exercise?  It's a purely
> mathematical one to me.
> 

See https://en.wikipedia.org/wiki/Project_Euler for the Project Euler mission
and motivation.

Regards,

        Shlomi Fish

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