Commits

Shlomi Fish committed d2d1421

some bug fixes

Comments (0)

Files changed (1)

project-euler/147/euler-147.pl

         {
             foreach my $rect_x (1 .. ($xx<<1))
             {
+                RECT_Y:
                 foreach my $rect_y (1 .. ($yy<<1))
                 {
                     my $x_even_start = $rect_x;
                     my $x_even_end = (($xx<<1) - $rect_y);
 
+                    if ($x_even_end < 0)
+                    {
+                        last RECT_Y;
+                    }
+
                     my $y_even_end = (($yy<<1) - ($rect_x+$rect_y));
 
+                    my $x_even_end_norm = ($x_even_end & (~0x1));
+                    my $x_even_start_norm = round_two_up($x_even_start);
+
                     # For the even diagonals.
-                    if ($x_even_end > $x_even_start and $y_even_end > 0)
+                    if ($x_even_end_norm >= $x_even_start_norm and $y_even_end >= 0)
                     {
-                        $diag_sum +=
-                        (((($x_even_end&(~0x1)) - round_two_up($x_even_start)
-                        ) * ($y_even_end)) <<
-                            ($rect_x == $rect_y ? 0 : 1)
+                        my $count =
+                        (
+                         ($x_even_end_norm - $x_even_start_norm + 1)
+                            * ($y_even_end + 1)
                         );
+                        $diag_sum += ($count << ($rect_x == $rect_y ? 0 : 1));
                     }
 
-                    my $x_odd_end = (($x_even_end&0x1)?$x_even_end:$x_even_end-1);
+                    my $x_odd_end =
+                        (($x_even_end&0x1)?$x_even_end:($x_even_end-1));
                     my $x_odd_start = ($x_even_start|0x1);
-                    my $y_odd_end = ($y_even_end - 1);
+                    my $y_odd_end = ($y_even_end - 2);
 
-                    if ($x_odd_end > $x_odd_start and $y_odd_end > 0)
+                    if ($x_odd_end >= $x_odd_start and $y_odd_end >= 0)
                     {
                         $diag_sum +=
                         ((
-                                ( ($x_odd_end - $x_odd_start) >> 0 )
-                           * ($y_odd_end >> 0)
+                                ( ($x_odd_end - $x_odd_start + 1))
+                           * (($y_odd_end+1) >> 0)
                          ) <<
                             ($rect_x == $rect_y ? 0 : 1)
                         );
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.