aboutsummaryrefslogtreecommitdiff
path: root/challenge-149
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2022-01-25 19:32:46 +0000
committerGitHub <noreply@github.com>2022-01-25 19:32:46 +0000
commit7571524259b3b44232b656e026c203f276464d73 (patch)
treea2f63f8a21400a7236d84b31a3aa5f519d7d590e /challenge-149
parent3f5014ee2b0e1f08c88e23456e1719d2a7d3a54d (diff)
parentc5fac983469aecb0cf82aef8b9d8d62dabb80e37 (diff)
downloadperlweeklychallenge-club-7571524259b3b44232b656e026c203f276464d73.tar.gz
perlweeklychallenge-club-7571524259b3b44232b656e026c203f276464d73.tar.bz2
perlweeklychallenge-club-7571524259b3b44232b656e026c203f276464d73.zip
Merge pull request #5564 from pjcs00/wk149
My solutions for week 149
Diffstat (limited to 'challenge-149')
-rw-r--r--challenge-149/peter-campbell-smith/blog.txt1
-rwxr-xr-xchallenge-149/peter-campbell-smith/perl/ch-1.pl50
-rw-r--r--challenge-149/peter-campbell-smith/perl/ch-2.pl79
3 files changed, 130 insertions, 0 deletions
diff --git a/challenge-149/peter-campbell-smith/blog.txt b/challenge-149/peter-campbell-smith/blog.txt
new file mode 100644
index 0000000000..bd6c08d788
--- /dev/null
+++ b/challenge-149/peter-campbell-smith/blog.txt
@@ -0,0 +1 @@
+https://www.blogger.com/blog/post/edit/6451878819927982087/2815995642365863231
diff --git a/challenge-149/peter-campbell-smith/perl/ch-1.pl b/challenge-149/peter-campbell-smith/perl/ch-1.pl
new file mode 100755
index 0000000000..feb0eefdbf
--- /dev/null
+++ b/challenge-149/peter-campbell-smith/perl/ch-1.pl
@@ -0,0 +1,50 @@
+#!/usr/bin/perl
+
+# Peter Campbell Smith - 2022-01-24
+# PWC 149 task 2
+
+use v5.28;
+use strict;
+use warnings;
+use utf8;
+
+# Given an input $n, generate the first $n numbers for which the sum of their digits is a Fibonacci number.
+
+# Note: eval(join('+', split(//, $i))) splits $i into individual digits, joins them with '+' signs and
+# evaluates the resulting sum of the digits.
+
+my ($n, $i, @fibs, @results);
+
+$n = 20;
+
+@fibs = (0, 1); # initial fibonacci series
+@results = ();
+
+# count up until we have the required quantity of results
+for ($i = 0; $#results < $n - 1; $i++) {
+ push(@results, $i) if is_a_fib(eval(join('+', split(//, $i)))); # see note above
+}
+
+say qq[f($n) = (] . join(', ', @results) . ')';
+
+sub is_a_fib {
+
+ # returns true if the argument is a fibonacci number
+
+ my ($arg, $i);
+ $arg = $_[0];
+
+ # make sure @fibs is long enough
+ while ($arg > $fibs[$#fibs]) {
+ $fibs[$#fibs + 1] = $fibs[$#fibs] + $fibs[$#fibs - 1]; # add one fib to @fibs
+ }
+
+ # check if $arg is in @fibs (binary chop would be faster but why bother?)
+ for ($i = $#fibs; $i >= 0; $i--) {
+ return 1 if $arg == $fibs[$i];
+ }
+ return 0;
+}
+
+
+
diff --git a/challenge-149/peter-campbell-smith/perl/ch-2.pl b/challenge-149/peter-campbell-smith/perl/ch-2.pl
new file mode 100644
index 0000000000..aed8c959b4
--- /dev/null
+++ b/challenge-149/peter-campbell-smith/perl/ch-2.pl
@@ -0,0 +1,79 @@
+#!/usr/bin/perl
+
+# Peter Campbell Smith - 2022-01-24
+# PWC 149 task 2
+
+use v5.28;
+use strict;
+use warnings;
+use utf8;
+
+# Given a number base, derive the largest perfect square with no repeated digits and return
+# it as a string.
+
+# The largest non-repeating number in eg base 4 is: 3210 = (3 * 4**3) + (2 * 4**2) + 1 * (4**1) + (0 * 4**0)
+# So the largest non-repeating number in base n is: sum (j = 1 .. n-1) of j * n**j
+
+my ($i, $square, $string, $test, @tests, $largest, $start);
+
+# bases to try
+@tests = (2, 4, 10, 12, 16, 17);
+
+for $test (@tests) {
+
+ # get largest possible number in base $test with no repeating digits (see above)
+ $largest = 0;
+ for $i (1 .. $test - 1) {
+ $largest += $i * $test ** $i;
+ }
+
+ # can't do this if $largest can't be represented as an integer
+ if ($largest > ~1 + 1) {
+ say qq[$test is too large];
+ next;
+ }
+
+ # find the largest square <= $largest
+ $start = int(sqrt($largest));
+
+ # generate squares down from there
+ for ($i = $start; $i > 0; $i--) {
+ $square = $i * $i;
+ $string = basify($square, $test); # convert to required format (eg 123AB)
+ last if no_repeats($string); # the answer!
+ }
+ say qq[f($test) = $string]
+}
+
+sub basify { # ($integer, $base)
+
+ my ($base, $digit, $digits, $integer, $result);
+
+ # converts $integer to 123AB representation in base $base
+
+ ($integer, $base) = @_;
+ $digits = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
+ $result = '';
+
+ # strip digits 1 at a time
+ while ($integer) {
+ $digit = $integer % $base;
+ $integer = ($integer - $digit) / $base;
+ $result = substr($digits, $digit, 1) . $result;
+ }
+ return $result;
+}
+
+sub no_repeats { # ($string)
+
+ my ($string, %seen);
+ $string = $_[0];
+
+ while ($string =~ m|(.)|g) {
+ return 0 if $seen{$1};
+ $seen{$1} = 1;
+ }
+ return 1;
+}
+
+