diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2022-01-25 19:32:46 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-01-25 19:32:46 +0000 |
| commit | 7571524259b3b44232b656e026c203f276464d73 (patch) | |
| tree | a2f63f8a21400a7236d84b31a3aa5f519d7d590e /challenge-149 | |
| parent | 3f5014ee2b0e1f08c88e23456e1719d2a7d3a54d (diff) | |
| parent | c5fac983469aecb0cf82aef8b9d8d62dabb80e37 (diff) | |
| download | perlweeklychallenge-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.txt | 1 | ||||
| -rwxr-xr-x | challenge-149/peter-campbell-smith/perl/ch-1.pl | 50 | ||||
| -rw-r--r-- | challenge-149/peter-campbell-smith/perl/ch-2.pl | 79 |
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; +} + + |
