#!/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";