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 <l...@yagibdah.de> 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 <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. -- "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/