diff options
Diffstat (limited to 'perl')
-rwxr-xr-x | perl/p2.pl | 6 | ||||
-rwxr-xr-x | perl/p4.pl | 18 | ||||
-rwxr-xr-x | perl/p5.pl | 48 |
3 files changed, 68 insertions, 4 deletions
@@ -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"; |