diff options
| author | Rob Van Dam <rvandam00@gmail.com> | 2019-06-23 23:58:24 -0600 |
|---|---|---|
| committer | Rob Van Dam <rvandam00@gmail.com> | 2019-06-23 23:58:24 -0600 |
| commit | b667026725ada5be8421b2f74f3846ed77debd62 (patch) | |
| tree | 5af11fbb05bfc37211ba8ac1a854cf0bf5022862 | |
| parent | c405cef34bfe76ceb30d3bcddf875970aec1e51b (diff) | |
| download | perlweeklychallenge-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.pl | 40 |
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]; + } +} |
