diff options
| author | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2022-03-20 13:14:41 +0000 |
|---|---|---|
| committer | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2022-03-20 13:14:41 +0000 |
| commit | d107bb7bca1ee3dea1ed319ed17f4192ff0fa40e (patch) | |
| tree | 587b35319e6cb6932ed2f83b871fd2ff3077c01e /challenge-156 | |
| parent | d449ff613daf907d794703eb11b093e570ddfaa1 (diff) | |
| download | perlweeklychallenge-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/README | 1 | ||||
| -rw-r--r-- | challenge-156/kueppo-wesley/blog.txt | 1 | ||||
| -rw-r--r-- | challenge-156/kueppo-wesley/blog1.txt | 1 | ||||
| -rw-r--r-- | challenge-156/kueppo-wesley/perl/ch-1.pl | 54 | ||||
| -rw-r--r-- | challenge-156/kueppo-wesley/perl/ch-2.pl | 77 |
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; |
