aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorE7-87-83 <fungcheokyin@gmail.com>2021-10-04 20:46:43 +0800
committerE7-87-83 <fungcheokyin@gmail.com>2021-10-04 20:46:43 +0800
commitd5fd0df979ac23043f9e35117241b68b0bc4914b (patch)
treef7071b7f2ff4dfa5f75e8629b0449d43ee3e53f1
parent3e0ef063102fd8d25be76ac2dc036a035d9d7f13 (diff)
downloadperlweeklychallenge-club-d5fd0df979ac23043f9e35117241b68b0bc4914b.tar.gz
perlweeklychallenge-club-d5fd0df979ac23043f9e35117241b68b0bc4914b.tar.bz2
perlweeklychallenge-club-d5fd0df979ac23043f9e35117241b68b0bc4914b.zip
Week 133 - Task 2
-rw-r--r--challenge-133/cheok-yin-fung/perl/ch-2.pl93
1 files changed, 93 insertions, 0 deletions
diff --git a/challenge-133/cheok-yin-fung/perl/ch-2.pl b/challenge-133/cheok-yin-fung/perl/ch-2.pl
new file mode 100644
index 0000000000..5d6a07ac8b
--- /dev/null
+++ b/challenge-133/cheok-yin-fung/perl/ch-2.pl
@@ -0,0 +1,93 @@
+#!/usr/bin/perl
+# The Weekly Challenge 133
+# Task 2: Find the first 10 base-10 Smith number
+# an example from Wikipedia: 4937775 = 3^1 5^2 658371
+use v5.12.0;
+use warnings;
+use List::Util qw/sum/;
+
+my $max_search = $ARGV[0] || 999;
+my $num_of_smiths = $ARGV[1] || 10;
+
+my @smiths = ();
+
+my @primes = (2, 3, 5, 7);
+my $num_of_primes = scalar @primes;
+
+my %primedigitsum = ( 2 => 2, 3 => 3, 5=>5 , 7=>7 );
+
+generate_primes();
+generate_smiths();
+
+if (scalar @smiths >= $num_of_smiths) {
+ say "done";
+ say join "\n", @smiths[0..$num_of_smiths-1];
+}
+else {
+ say join "\n", @smiths;
+}
+
+
+
+sub arr_digitsum {
+ my @arr = $_[0]->@*;
+ return sum(
+ map { $primedigitsum{$_} || digitsum($_) } @arr
+ );
+}
+
+
+
+sub digitsum {
+ return sum split //, $_[0]
+}
+
+
+
+sub generate_primes {
+ my $i = 7;
+ LOOP: while ($i <= $max_search-2 ) {
+ $i += 2;
+ my $k = 1;
+ while ($k < $num_of_primes) {
+ next LOOP if $i % $primes[$k] == 0;
+ $k++;
+ }
+ push @primes, $i;
+ $primedigitsum{$i} = digitsum $i;
+ $num_of_primes++;
+ }
+}
+
+
+
+sub factorize {
+ my $n = $_[0];
+ my @pf = ();
+ my $k = 0;
+ while ($n != 1) {
+ if ($n % $primes[$k] == 0) {
+ push @pf, $primes[$k];
+ $n /= $primes[$k];
+ }
+ else {
+ $k++;
+ }
+ }
+ return [@pf];
+}
+
+
+
+sub generate_smiths {
+ my $i = 4;
+ while ($i <= $max_search) {
+ if ( !defined($primedigitsum{$i})
+ && digitsum($i) == arr_digitsum(factorize($i))
+ ) {
+ push @smiths, $i;
+ }
+ $i++;
+ }
+}
+