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/