Shlomi Fish avatar Shlomi Fish committed f851a4b

Optimisation.

Comments (0)

Files changed (1)

project-euler/148/calc-num-Y-in-row.pl

 use strict;
 use warnings;
 
-use Math::BigInt lib => 'GMP', ':constant';
-
-sub fact
-{
-    return shift->copy->bfac;
-}
-
-sub nCr
-{
-    my ($n, $k) = @_;
-    $n += 0;
-    $k += 0;
-    return fact($n) / (fact($n-$k) * fact($k));
-}
+use integer;
+# use Math::BigInt lib => 'GMP', ':constant';
 
 my $BASE = 7;
 
     my $n_proto = shift;
     my $n = $n_proto - 1;
 
-    my $recurse;
-
-    $recurse = sub {
-        my ($digits_aref) = @_;
-
-        my @digits = @$digits_aref;
-
-        if (@digits <= 1)
-        {
-            return 0;
-        }
-        else
-        {
-            my $big_Y_num = ($digits[-1]->{power}-1-$digits[-2]->{total_mod});
-            my $big_Y_total = $big_Y_num * $digits[-1]->{d};
-            # my $remaining_n = $digits[-1]->{total_mod} - $big_Y_total;
-
-            return $big_Y_total + ($digits[-1]->{d}+1) * $recurse->([@digits[0 .. $#digits-1]]);
-        }
-    };
-
     my @digits;
 
-    my $digit_n = $n->copy();
+    # my $digit_n = $n->copy();
+    my $digit_n = $n;
     my $power = 1;
     my $total_mod = 0;
     while ($digit_n)
         $power *= $BASE;
     }
 
-    return $recurse->([@digits]);
+    my $recurse;
+
+    $recurse = sub {
+        my ($d_len) = @_;
+
+        if ($d_len <= 1)
+        {
+            return 0;
+        }
+        else
+        {
+            my $big_Y_num = ($digits[$d_len-1]->{power}-1-$digits[$d_len-2]->{total_mod});
+            my $big_Y_total = $big_Y_num * $digits[$d_len-1]->{d};
+
+            return $big_Y_total + ($digits[$d_len-1]->{d}+1) * $recurse->($d_len-1);      }
+    };
+
+    return $recurse->(scalar( @digits ));
 }
 
 foreach my $n (@ARGV)
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.