From 263693e45cc6665e3c149cdcd4ba05875b8f9004 Mon Sep 17 00:00:00 2001 From: Simon Green Date: Fri, 14 Jan 2022 15:21:19 +1100 Subject: sgreen solutions to challenge 147 --- challenge-147/sgreen/README.md | 4 +-- challenge-147/sgreen/blog.txt | 1 + challenge-147/sgreen/perl/ch-1.pl | 54 +++++++++++++++++++++++++++++++++++++ challenge-147/sgreen/perl/ch-2.pl | 38 ++++++++++++++++++++++++++ challenge-147/sgreen/python/ch-1.py | 50 ++++++++++++++++++++++++++++++++++ challenge-147/sgreen/python/ch-2.py | 32 ++++++++++++++++++++++ 6 files changed, 177 insertions(+), 2 deletions(-) create mode 100644 challenge-147/sgreen/blog.txt create mode 100755 challenge-147/sgreen/perl/ch-1.pl create mode 100755 challenge-147/sgreen/perl/ch-2.pl create mode 100755 challenge-147/sgreen/python/ch-1.py create mode 100755 challenge-147/sgreen/python/ch-2.py diff --git a/challenge-147/sgreen/README.md b/challenge-147/sgreen/README.md index 35c104b123..40c85b3a56 100644 --- a/challenge-147/sgreen/README.md +++ b/challenge-147/sgreen/README.md @@ -1,3 +1,3 @@ -# The Weekly Challenge 146 +# The Weekly Challenge 147 -Solution by Simon Green. [Blog - 2 Fractions and a Prime](https://dev.to/simongreennet/2-fractions-and-a-prime-4fik) +Solution by Simon Green. [Blog - Look mum, no inputs 😛](https://dev.to/simongreennet/look-mum-no-inputs-3lon) diff --git a/challenge-147/sgreen/blog.txt b/challenge-147/sgreen/blog.txt new file mode 100644 index 0000000000..c3f2893760 --- /dev/null +++ b/challenge-147/sgreen/blog.txt @@ -0,0 +1 @@ +https://dev.to/simongreennet/look-mum-no-inputs-3lon diff --git a/challenge-147/sgreen/perl/ch-1.pl b/challenge-147/sgreen/perl/ch-1.pl new file mode 100755 index 0000000000..acf41ea5ed --- /dev/null +++ b/challenge-147/sgreen/perl/ch-1.pl @@ -0,0 +1,54 @@ +#!/usr/bin/env perl + +use strict; +use warnings; +use feature 'say'; + +sub is_prime { + my $number = shift; + + # Return true or false if the number is a prime + return if $number < 2; + + foreach my $i ( 2 .. sqrt($number) ) { + return if $number % $i == 0; + } + + # It's a prime + return 1; +} + +sub is_trunc_prime { + my $number = shift; + + if ( index( $number, '0' ) != -1 ) { + # A left-truncatable prime cannot contain a zero + return; + } + + # Return true or false if the number and all it's left truncated + # parts is a prime. Start with the smallest figure first + foreach my $i ( reverse 1 .. length($number) ) { + return if not is_prime( substr( $number, $i - 1 ) ); + } + + return 1; +} + +sub main { + my @solutions = (); + my $number = 1; + + # Keep increasing number by one until we have twenty truncated prime + # numbers + while ( @solutions < 20 ) { + if ( is_trunc_prime($number) ) { + push @solutions, $number; + } + $number++; + } + + say join ', ', @solutions; +} + +main(); diff --git a/challenge-147/sgreen/perl/ch-2.pl b/challenge-147/sgreen/perl/ch-2.pl new file mode 100755 index 0000000000..44fda65617 --- /dev/null +++ b/challenge-147/sgreen/perl/ch-2.pl @@ -0,0 +1,38 @@ +#!/usr/bin/env perl + +use strict; +use warnings; +use feature 'say'; + +sub pentagon_number { + my $n = shift; + return $n * ( 3 * $n - 1 ) / 2; +} + +sub is_pentagon_number { + my $x = shift; + my $n = sqrt( 24 * $x + 1 ) + 1; + return ( $n == int($n) and $n % 6 == 0 ) ? ( $n / 6 ) : undef; +} + +sub main { + my $n1 = 2; + while (1) { + my $p1 = pentagon_number($n1); + foreach my $n2 ( 1 .. $n1 - 1 ) { + my $p2 = pentagon_number($n2); + + my $s1 = is_pentagon_number( $p1 + $p2 ); + my $s2 = is_pentagon_number( $p1 - $p2 ); + + if ( defined $s1 and defined $s2 ) { + say "P($n1) + P($n2) = $p1 + $p2 = ", $p1 + $p2, " = P($s1)"; + say "P($n1) - P($n2) = $p1 - $p2 = ", $p1 - $p2, " = P($s2)"; + return; + } + } + $n1++; + } +} + +main(); diff --git a/challenge-147/sgreen/python/ch-1.py b/challenge-147/sgreen/python/ch-1.py new file mode 100755 index 0000000000..1b77f58482 --- /dev/null +++ b/challenge-147/sgreen/python/ch-1.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python + +import math + + +def is_prime(number): + # Return true or false if the number is a prime + if number < 2: + return False + + for i in range(2, int(math.sqrt(number)) + 1): + if number % i == 0: + return False + + # It's a prime + return True + + +def is_trunc_prime(number): + # Return true or false if the number and all it's left truncated + # parts is a prime. Start with the smallest figure first + n = str(number) + + if '0' in n: + # A left-truncatable prime cannot contain a zero + return False + + for i in range(len(n), 0, -1): + if not is_prime(int(n[i - 1:])): + return False + + return True + + +def main(): + solutions = [] + number = 1 + + # Keep increasing number by one until we have twenty truncated prime + # numbers + while len(solutions) < 20: + if is_trunc_prime(number): + solutions.append(number) + number += 1 + + print(*solutions, sep=', ') + + +if __name__ == '__main__': + main() diff --git a/challenge-147/sgreen/python/ch-2.py b/challenge-147/sgreen/python/ch-2.py new file mode 100755 index 0000000000..c6424b9617 --- /dev/null +++ b/challenge-147/sgreen/python/ch-2.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python + +import math + + +def pentagon_number(n): + return int(n * (3 * n - 1) / 2) + + +def is_pentagon_number(x): + n = math.sqrt(24 * x + 1) + 1 + return int(n / 6) if n % 6 == 0 else None + + +def main(): + n1 = 2 + while True: + p1 = pentagon_number(n1) + for n2 in range(1, n1): + p2 = pentagon_number(n2) + + s1 = is_pentagon_number(p1 + p2) + s2 = is_pentagon_number(p1 - p2) + + if s1 is not None and s2 is not None: + print(f'P({n1}) + P({n2}) = {p1} + {p2} = { p1 + p2 } = P({s1})') + print(f'P({n1}) - P({n2}) = {p1} - {p2} = { p1 - p2 } = P({s2})') + return + n1 += 1 + + +main() -- cgit