Shlomi Fish avatar Shlomi Fish committed c831263

Add the real orig.

Comments (0)

Files changed (1)

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

+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use integer;
+# use Math::BigInt lib => 'GMP', ':constant';
+
+my $BASE = 7;
+
+sub calc_num_Y_in_row_n
+{
+    my $n_proto = shift;
+    my $n = $n_proto - 1;
+
+    my @digits;
+
+    # my $digit_n = $n->copy();
+    my $digit_n = $n;
+    my $power = 1;
+    my $total_mod = 0;
+    while ($digit_n)
+    {
+        my $digit = ($digit_n % $BASE);
+        $total_mod = $total_mod + $digit * $power;
+        push @digits, { d => $digit, power => $power, total_mod => $total_mod };
+        $digit_n /= $BASE;
+        $power *= $BASE;
+    }
+
+    my $recurse;
+
+    $recurse = sub {
+        my ($d_len) = @_;
+
+        if ($d_len <= 0)
+        {
+            return 0;
+        }
+        else
+        {
+            my $big_Y_num = ($digits[$d_len]->{power}-1-$digits[$d_len-1]->{total_mod});
+            my $big_Y_total = $big_Y_num * $digits[$d_len]->{d};
+
+            return $big_Y_total + ($digits[$d_len]->{d}+1) * $recurse->($d_len-1);
+        }
+    };
+
+    return $recurse->($#digits);
+}
+
+my $n = 1_000_000_000;
+
+my $sum = 0;
+
+for (; $n >= 6; $n--)
+{
+    $sum += calc_num_Y_in_row_n($n);
+
+    if ($n % 10_000 == 0)
+    {
+        print "Reached $n [Sum == $sum]\n";
+    }
+}
+# foreach my $n (@ARGV)
+# {
+#     print "${n}: ", calc_num_Y_in_row_n($n), "\n";
+# }
+print "Final Sum == $sum\n";
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.