summaryrefslogtreecommitdiff
path: root/perl
diff options
context:
space:
mode:
Diffstat (limited to 'perl')
-rwxr-xr-xperl/p2.pl6
-rwxr-xr-xperl/p4.pl18
-rwxr-xr-xperl/p5.pl48
3 files changed, 68 insertions, 4 deletions
diff --git a/perl/p2.pl b/perl/p2.pl
index ec85ec1..6a226e1 100755
--- a/perl/p2.pl
+++ b/perl/p2.pl
@@ -13,8 +13,7 @@ sub iter1 {
iter1([$b, $a+$b], $a & 1 ? $acc : $acc + $a);
}
}
-print iter1([1, 2], 0);
-print "\n";
+print iter1([1, 2], 0), "\n";
# Functional (tail recursive)
sub iter2 {
@@ -27,8 +26,7 @@ sub iter2 {
goto &iter2;
}
}
-print iter2([1, 2], 0);
-print "\n";
+print iter2([1, 2], 0), "\n";
# Imperative
my ($a, $b) = (1, 2);
diff --git a/perl/p4.pl b/perl/p4.pl
new file mode 100755
index 0000000..9982fa5
--- /dev/null
+++ b/perl/p4.pl
@@ -0,0 +1,18 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use List::Util qw(max);
+
+# Functional
+
+# Imperative
+my $resp;
+for my $x (100 .. 999) {
+ for my $y ($x .. 999) {
+ my $cand = $x*$y;
+ $resp = max($resp, $cand) if $cand eq reverse($cand);
+ }
+}
+print "$resp\n";
diff --git a/perl/p5.pl b/perl/p5.pl
new file mode 100755
index 0000000..f63ca34
--- /dev/null
+++ b/perl/p5.pl
@@ -0,0 +1,48 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use List::Util qw(reduce max all);
+
+# Functional
+
+# Imperative
+my @primes = (2);
+sub factorize {
+ my $n = shift;
+ for my $i ($primes[-1] .. $n) {
+ push @primes, $i if all { $i % $_ != 0 } @primes;
+ }
+ my $factors;
+ for my $prime (@primes) {
+ if ($n % $prime == 0) {
+ $factors->{$prime}++;
+ $n /= $prime;
+ redo;
+ }
+ }
+ return $factors;
+}
+
+sub merge_factors {
+ my $fst = shift;
+ my $snd = shift;
+ my $res;
+ foreach my $k (keys %$fst) {
+ $res->{$k} = max($res->{$k} || 0, $fst->{$k});
+ }
+ foreach my $k (keys %$snd) {
+ $res->{$k} = max($res->{$k} || 0, $snd->{$k});
+ }
+ return $res;
+}
+
+my @factors = map { factorize $_ } (2..20);
+my $mcm = reduce { merge_factors($a, $b) } @factors;
+
+my $res = 1;
+foreach my $k (keys %$mcm) {
+ $res *= $k ** $mcm->{$k};
+}
+print $res, "\n";