diff options
| author | Andinus <andinus@nand.sh> | 2020-08-31 18:20:18 -0400 |
|---|---|---|
| committer | Andinus <andinus@nand.sh> | 2020-08-31 18:20:18 -0400 |
| commit | a938467ef000783ee6246d57c1003fc497ed7cdc (patch) | |
| tree | 7eccaebee7217440d75030b174cde5fa07fb74c8 | |
| parent | 3a72fd92e038021ef0f62e62e99e13902328d374 (diff) | |
| download | perlweeklychallenge-club-a938467ef000783ee6246d57c1003fc497ed7cdc.tar.gz perlweeklychallenge-club-a938467ef000783ee6246d57c1003fc497ed7cdc.tar.bz2 perlweeklychallenge-club-a938467ef000783ee6246d57c1003fc497ed7cdc.zip | |
Move explanation to README, add webpage reference
| -rw-r--r-- | challenge-076/andinus/README | 103 | ||||
| -rw-r--r-- | challenge-076/andinus/blog-1.txt | 1 | ||||
| -rwxr-xr-x | challenge-076/andinus/perl/ch-1.pl | 16 |
3 files changed, 103 insertions, 17 deletions
diff --git a/challenge-076/andinus/README b/challenge-076/andinus/README index 5c0544600b..1653e8e915 100644 --- a/challenge-076/andinus/README +++ b/challenge-076/andinus/README @@ -1 +1,102 @@ -Solutions by Andinus. + ━━━━━━━━━━━━━━━ + CHALLENGE 076 + ━━━━━━━━━━━━━━━ + + +Table of Contents +───────────────── + +1 Task 1 - Prime Sum +.. 1.1 Perl + + + + + +1 Task 1 - Prime Sum +════════════════════ + + You are given a number `$N'. Write a script to find the minimum number + of prime numbers required, whose summation gives you `$N'. + + • For the sake of this task, please assume 1 is not a prime number. + + +1.1 Perl +──────── + + • Program: [file:perl/ch-1.pl] + • Help taken from: [https://stackoverflow.com/a/35756072]. + + User input is stored in `$input'. + ┌──── + │ my $input = shift @ARGV; + │ chomp $input; + └──── + + 1 is assumed not to be a prime number so we reject numbers less than + or equal to 1. + ┌──── + │ die "Invalid input, enter numbers greater than 1.\n" if $input <= 1; + └──── + + If it's a prime number then the minimum sum is the number itself so we + just return it & exit. + ┌──── + │ say $input and exit 0 if is_prime($input) == 1; + └──── + + If `$input' is even then we loop from 2 to `$input / 2' & check if + both `$i' & `$diff' are primes. If both are primes then we have our + numbers. + + Eventually we'll find 2 primes to be a sum of even numbers. From + WikiPedia, [Goldbach's conjecture] has been shown to hold for all + integers less than `4 × 10^18'. + ┌──── + │ if ($input % 2 == 0) { + │ foreach my $i (2 ... $input / 2) { + │ my $diff = $input - $i; + │ say "$i + $diff" + │ if is_prime($i) and is_prime($diff); + │ } + │ } + └──── + + If the input is odd then we first check if `$input - 2' is a prime, if + it is then input is the sum of two primes, 2 & `$input - 2'. + ┌──── + │ elsif (is_prime($input - 2)) { + │ say "2 + $input"; + │ } + └──── + + If even that doesn't match then the minimum sum will have three + numbers. 3 & then we use the same function as for even numbers to find + the other two primes. + ┌──── + │ else { + │ foreach my $i (2 ... ($input - 3) / 2) { + │ my $diff = $input - 3 - $i; + │ say "3 + $i + $diff" + │ if is_prime($i) and is_prime($diff); + │ } + │ } + └──── + + If $num is divisible by any number between 2 & `sqrt($num)' then it's + not prime. + ┌──── + │ sub is_prime { + │ my $num = shift @_; + │ + │ foreach my $i (2 ... sqrt($num)) { + │ return 0 if $num % $i == 0; + │ } + │ return 1; + │ } + └──── + + +[Goldbach's conjecture] +https://en.wikipedia.org/wiki/Goldbach%2527s_conjecture diff --git a/challenge-076/andinus/blog-1.txt b/challenge-076/andinus/blog-1.txt new file mode 100644 index 0000000000..47b79d332a --- /dev/null +++ b/challenge-076/andinus/blog-1.txt @@ -0,0 +1 @@ +https://andinus.tilde.institute/pwc/challenge-076/ diff --git a/challenge-076/andinus/perl/ch-1.pl b/challenge-076/andinus/perl/ch-1.pl index c7660ff559..1e4947c562 100755 --- a/challenge-076/andinus/perl/ch-1.pl +++ b/challenge-076/andinus/perl/ch-1.pl @@ -7,33 +7,19 @@ use feature 'say'; my $input = shift @ARGV; chomp $input; -# Reject invalid inputs. die "Invalid input, enter numbers greater than 1.\n" if $input <= 1; -# If it's a prime number then the minimum sum is the number itself. say $input and exit 0 if is_prime($input) == 1; if ($input % 2 == 0) { - # If $input is even then we loop from 2 to `$input / 2' & check if - # both $i & $diff are primes. If both are primes then we found our - # numbers! - - # Eventually we'll find 2 primes to be a sum of even numbers. From - # WikiPedia, https://en.wikipedia.org/wiki/Goldbach%27s_conjecture - # has been shown to hold for all integers less than `4 × 10^18'. foreach my $i (2 ... $input / 2) { my $diff = $input - $i; say "$i + $diff" if is_prime($i) and is_prime($diff); } } elsif (is_prime($input - 2)) { - # If $input is odd & `$input - 2' is a prime then $input is sum of - # two primes, 2 & `$input -2'. say "2 + $input"; } else { - # If even that doesn't match then the minimum sum will have three - # numbers. 3 & then we use the same function as for even numbers - # to find the other two primes. foreach my $i (2 ... ($input - 3) / 2) { my $diff = $input - 3 - $i; say "3 + $i + $diff" @@ -43,8 +29,6 @@ if ($input % 2 == 0) { sub is_prime { my $num = shift @_; - # If $num is divisible by any number between 2 & sqrt($num) then - # it's not prime. Checking only till foreach my $i (2 ... sqrt($num)) { return 0 if $num % $i == 0; } |
