aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Van Dam <rvandam00@gmail.com>2019-06-23 23:58:24 -0600
committerRob Van Dam <rvandam00@gmail.com>2019-06-23 23:58:24 -0600
commitb667026725ada5be8421b2f74f3846ed77debd62 (patch)
tree5af11fbb05bfc37211ba8ac1a854cf0bf5022862
parentc405cef34bfe76ceb30d3bcddf875970aec1e51b (diff)
downloadperlweeklychallenge-club-b667026725ada5be8421b2f74f3846ed77debd62.tar.gz
perlweeklychallenge-club-b667026725ada5be8421b2f74f3846ed77debd62.tar.bz2
perlweeklychallenge-club-b667026725ada5be8421b2f74f3846ed77debd62.zip
Solution to Challenge #1, Week 014
-rw-r--r--challenge-014/rob-van-dam/perl5/ch-1.pl40
1 files changed, 40 insertions, 0 deletions
diff --git a/challenge-014/rob-van-dam/perl5/ch-1.pl b/challenge-014/rob-van-dam/perl5/ch-1.pl
new file mode 100644
index 0000000000..613c1250a3
--- /dev/null
+++ b/challenge-014/rob-van-dam/perl5/ch-1.pl
@@ -0,0 +1,40 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+use v5.10;
+
+my $M = shift @ARGV || 10;
+
+#slow();
+fast();
+
+# this works but is very slow for large $M
+# as its roughly O(n**2)
+sub slow {
+ my @a = (0);
+ for my $n (0..$M) {
+ my $r = 0;
+ foreach my $m (0..($n-1)) {
+ last if ! defined $a[$n];
+ $r = $n - $m if $a[$m] == $a[$n];
+ }
+ $a[$n + 1] = $r;
+ say $a[$n];
+ }
+}
+
+# this is much faster for large $M
+# by caching the last time we say a given number
+# so its roughly O(n**2) but requires roughly O(2n) space
+sub fast {
+ my @a = (0);
+ my @last = ();
+ for my $n (0..$M) {
+ my $m = $last[ $a[$n] ];
+ my $r = defined $m ? $n - $m : 0;
+ $last[$a[$n]] = $n;
+ $a[$n + 1] = $r;
+ say $a[$n];
+ }
+}