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/