aboutsummaryrefslogtreecommitdiff
path: root/challenge-156
diff options
context:
space:
mode:
authorMohammad S Anwar <mohammad.anwar@yahoo.com>2022-03-20 13:14:41 +0000
committerMohammad S Anwar <mohammad.anwar@yahoo.com>2022-03-20 13:14:41 +0000
commitd107bb7bca1ee3dea1ed319ed17f4192ff0fa40e (patch)
tree587b35319e6cb6932ed2f83b871fd2ff3077c01e /challenge-156
parentd449ff613daf907d794703eb11b093e570ddfaa1 (diff)
downloadperlweeklychallenge-club-d107bb7bca1ee3dea1ed319ed17f4192ff0fa40e.tar.gz
perlweeklychallenge-club-d107bb7bca1ee3dea1ed319ed17f4192ff0fa40e.tar.bz2
perlweeklychallenge-club-d107bb7bca1ee3dea1ed319ed17f4192ff0fa40e.zip
- Added solutions by Kueppo Wesley.
Diffstat (limited to 'challenge-156')
-rw-r--r--challenge-156/kueppo-wesley/README1
-rw-r--r--challenge-156/kueppo-wesley/blog.txt1
-rw-r--r--challenge-156/kueppo-wesley/blog1.txt1
-rw-r--r--challenge-156/kueppo-wesley/perl/ch-1.pl54
-rw-r--r--challenge-156/kueppo-wesley/perl/ch-2.pl77
5 files changed, 134 insertions, 0 deletions
diff --git a/challenge-156/kueppo-wesley/README b/challenge-156/kueppo-wesley/README
new file mode 100644
index 0000000000..739e669907
--- /dev/null
+++ b/challenge-156/kueppo-wesley/README
@@ -0,0 +1 @@
+Solutions by Kueppo Wesley.
diff --git a/challenge-156/kueppo-wesley/blog.txt b/challenge-156/kueppo-wesley/blog.txt
new file mode 100644
index 0000000000..3e8adc3c1a
--- /dev/null
+++ b/challenge-156/kueppo-wesley/blog.txt
@@ -0,0 +1 @@
+https://wesleykueppo-new.bearblog.dev/perniciouspl/
diff --git a/challenge-156/kueppo-wesley/blog1.txt b/challenge-156/kueppo-wesley/blog1.txt
new file mode 100644
index 0000000000..73f81e45df
--- /dev/null
+++ b/challenge-156/kueppo-wesley/blog1.txt
@@ -0,0 +1 @@
+https://wesleykueppo-new.bearblog.dev/weird-number/
diff --git a/challenge-156/kueppo-wesley/perl/ch-1.pl b/challenge-156/kueppo-wesley/perl/ch-1.pl
new file mode 100644
index 0000000000..e6c2add0c5
--- /dev/null
+++ b/challenge-156/kueppo-wesley/perl/ch-1.pl
@@ -0,0 +1,54 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+### HELPER
+# Find log of $n base 2.
+sub log_base2 {
+ my $n = shift;
+ log($n) / log(2)
+}
+
+### HELPER
+# Check if $number is prime (1: success, 0: failure).
+sub is_prime {
+ my ($number, $prime) = (shift, 1);
+
+ $prime = 0 if ($number == 1);
+ if ($number > 3) {
+ foreach my $i (2..sqrt $number) {
+ if ($number % $i == 0) {
+ $prime = 0;
+ last;
+ }
+ }
+ }
+ return $prime;
+}
+
+### MAIN
+# List the first $limit penicious numbers.
+sub penicious {
+ my ($v, $limit) = (3, shift);
+ my @found = ();
+
+ while (@found != $limit) {
+ my ($fpower, $spower) = (log_base2($v + 1), log_base2($v - 1));
+ if ($spower =~ /^\d+$/) {
+ push @found, $v;
+ } elsif ($fpower =~ /^\d+$/ and is_prime $fpower) {
+ push @found, $v;
+ } else {
+ my ($ones, $val) = (0, sprintf '%b', $v);
+ foreach (split '', $val) {
+ $ones++ if ($_ eq '1');
+ }
+ push @found, $v if (is_prime $ones);
+ }
+ $v++;
+ }
+ print join ', ', @found, "\n";
+}
+
+penicious 10;
diff --git a/challenge-156/kueppo-wesley/perl/ch-2.pl b/challenge-156/kueppo-wesley/perl/ch-2.pl
new file mode 100644
index 0000000000..daed76c662
--- /dev/null
+++ b/challenge-156/kueppo-wesley/perl/ch-2.pl
@@ -0,0 +1,77 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+### HELPER
+# Find all divisors of $n
+sub get_divisors {
+ my($number, @fdiv, @sdiv) = (shift);
+
+ if ($number > 3) {
+ foreach (2..sqrt $number) {
+ if ($number % $_ == 0) {
+ push @sdiv, $number / $_;
+ push @fdiv, $_ if ($number / $_ != $_);
+ }
+ }
+ }
+
+ (1, @fdiv, reverse @sdiv)
+}
+
+### MAIN
+sub is_weird {
+ my(@track, @subset) = ();
+ my($number, $sum) = (shift, 0);
+ my @divisors = get_divisors $number;
+
+ $sum += $_ foreach (@divisors);
+ if ($sum > $number) {
+ my $now = 0;
+ LOOP: {
+ foreach (@divisors) {
+ if ($now + $_ == $number) {
+ $now += $_;
+ push @subset, $_;
+ last;
+ } elsif ($now + $_ < $number) {
+ $now += $_;
+ push @subset, $_;
+ push @track, $_;
+ } else {
+ # Backtracking
+ $now = $_;
+ @subset = ($_);
+ foreach (reverse @track) {
+ if ($now + $_ < $number) {
+ $now += $_;
+ push @subset, $_;
+ } elsif ($now + $_ == $number) {
+ $now += $_;
+ push @subset, $_;
+ last LOOP;
+ }
+ }
+ @track = ($_);
+ }
+ }
+ }
+ if ($now == $number) {
+ print "Output: 1\n";
+ print "proper divisors: @divisors\n";
+ print "subset: @subset => sum = $number\n";
+ } else {
+ print "Output: 0\n";
+ print "proper divisors: @divisors\n";
+ print "No subset of these sums to $number\n";
+ }
+ } else {
+ print "Output: 1\n";
+ print "Total sum of the divisors = $sum < $number\n";
+ }
+}
+
+print "Input: ";
+my $input = <STDIN>;
+is_weird $input;