aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Anderson <mark@frontrangerunner.com>2020-03-31 06:22:50 -0600
committerMark Anderson <mark@frontrangerunner.com>2020-03-31 06:22:50 -0600
commit2e0e8c9eb6f3011bd0320d9da19708ad701fa78f (patch)
treeaa81c2d897725cc53e689e4bb50578d9769dff58
parent2e67891ac9591bc9307b6a956bdd9939816a166b (diff)
downloadperlweeklychallenge-club-2e0e8c9eb6f3011bd0320d9da19708ad701fa78f.tar.gz
perlweeklychallenge-club-2e0e8c9eb6f3011bd0320d9da19708ad701fa78f.tar.bz2
perlweeklychallenge-club-2e0e8c9eb6f3011bd0320d9da19708ad701fa78f.zip
Challenge 54 Solutions
-rw-r--r--challenge-054/mark-anderson/raku/ch-1.p65
-rw-r--r--challenge-054/mark-anderson/raku/ch-2.p6103
2 files changed, 108 insertions, 0 deletions
diff --git a/challenge-054/mark-anderson/raku/ch-1.p6 b/challenge-054/mark-anderson/raku/ch-1.p6
new file mode 100644
index 0000000000..995b3058bc
--- /dev/null
+++ b/challenge-054/mark-anderson/raku/ch-1.p6
@@ -0,0 +1,5 @@
+#!/usr/bin/env raku
+
+sub MAIN(UInt $length, UInt $which) {
+ say ((1..$length).permutations)[$which-1];
+}
diff --git a/challenge-054/mark-anderson/raku/ch-2.p6 b/challenge-054/mark-anderson/raku/ch-2.p6
new file mode 100644
index 0000000000..5d2272776d
--- /dev/null
+++ b/challenge-054/mark-anderson/raku/ch-2.p6
@@ -0,0 +1,103 @@
+#!/usr/bin/env raku
+
+# Usage: ch-2.p6
+# Output: The length of the 20 longest Collatz sequences from 1 to 1e6.
+
+# 10971 => 268
+# 13255 => 276
+# 17647 => 279
+# 17673 => 279
+# 23529 => 282
+# 26623 => 308
+# 34239 => 311
+# 35497 => 311
+# 35655 => 324
+# 52527 => 340
+# 77031 => 351
+# 106239 => 354
+# 142587 => 375
+# 156159 => 383
+# 216367 => 386
+# 230631 => 443
+# 410011 => 449
+# 511935 => 470
+# 626331 => 509
+# 837799 => 525
+
+# I implemented my own "memoize" with the seen hash.
+# With memoize this program takes about about 90 seconds to run on my pc.
+# Without memoize it takes about 9 and 1/2 minutes.
+
+multi sub MAIN {
+ my $elems;
+ my @twenty = (1 => 1) xx 20;
+ state %seen;
+
+ for (1 .. 1e6) -> $start {
+ $elems = 0;
+ my $c = collatz_elems($start);
+ %seen{$start} = $c;
+
+ if (@twenty[0].value <= @twenty[19].value <= $c+1) {
+ @twenty.shift;
+ @twenty.push($start => $c+1);
+ @twenty = @twenty.sort({$^a.value <=> $^b.value});
+ }
+ }
+
+ for @twenty -> $pair {
+ say $pair.fmt("%-6s => %s");
+ }
+
+ sub collatz_elems($n is copy --> UInt) {
+ if (%seen{$n}) {
+ return (%seen{$n} + $elems);
+ }
+
+ if ($n == 1) {
+ return $elems;
+ }
+
+ if $n %% 2 {
+ $n = $n / 2;
+ }
+
+ else {
+ $n = 3 * $n + 1;
+ }
+
+ $elems++;
+ collatz_elems($n);
+ }
+}
+
+# Usage: ch-2.p6 23
+# Output: The length of the Collatz sequence followed by the sequence.
+# length = 16
+# 23 -> 70 -> 35 -> 106 -> 53 -> 160 -> 80 -> 40 -> 20 -> 10 -> 5 -> 16 -> 8 -> 4 -> 2 -> 1
+
+multi sub MAIN(UInt $num where $num > 0) {
+ my @arr = collatz_array($num);
+ say "length = {@arr.elems}";
+ say @arr.join(" -> ");
+
+ sub collatz_array($n is copy --> Array) {
+ my @collatz;
+
+ loop {
+ @collatz.push($n);
+
+ if ($n == 1) {
+ return @collatz;
+ }
+
+ if $n %% 2 {
+ $n = $n / 2;
+ }
+
+ else {
+ $n = 3 * $n + 1;
+ }
+ }
+ }
+}