diff options
| author | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2022-06-05 12:31:41 +0100 |
|---|---|---|
| committer | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2022-06-05 12:31:41 +0100 |
| commit | e1e7c2515eba807b2f12e2e27ee54e47c0701541 (patch) | |
| tree | 0d9eb138f3c6873f9738fc82ce131d0bae0fdb9b /challenge-167 | |
| parent | 18a163895ca6d1cc72f209a9a9ba6a4713ab8ebc (diff) | |
| download | perlweeklychallenge-club-e1e7c2515eba807b2f12e2e27ee54e47c0701541.tar.gz perlweeklychallenge-club-e1e7c2515eba807b2f12e2e27ee54e47c0701541.tar.bz2 perlweeklychallenge-club-e1e7c2515eba807b2f12e2e27ee54e47c0701541.zip | |
- Added Perl solution to the task "Circular Primes".
Diffstat (limited to 'challenge-167')
| -rw-r--r-- | challenge-167/mohammad-anwar/perl/ch-1.pl | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/challenge-167/mohammad-anwar/perl/ch-1.pl b/challenge-167/mohammad-anwar/perl/ch-1.pl new file mode 100644 index 0000000000..ff540ac071 --- /dev/null +++ b/challenge-167/mohammad-anwar/perl/ch-1.pl @@ -0,0 +1,71 @@ +#!/usr/bin/perl + +=head1 + +Week 167: + + https://theweeklychallenge.org/blog/perl-weekly-challenge-167 + +Task #1: Circular Prime + + Write a script to find out first 10 circular primes having at + least 3 digits (base 10). + +=cut + +use v5.36; +use Test::More; +use experimental qw(builtin); +use builtin qw(true false); + +is_deeply( + circular_primes(10), + [ 113, 197, 199, 337, 1193, 3779, 11939, 19937, 193939, 199933 ], + 'Example' +); + +done_testing; + +# +# +# METHODS + +sub circular_primes($count) { + my $cp = []; + my $i = 111; + while (@$cp < $count) { + push @$cp, $i if is_circular_prime($i, $cp); + $i++; + } + + return $cp; +} + +sub is_circular_prime($n, $cp) { + return false if $n =~ /[024568]$/; + return false unless is_prime($n); + + foreach my $i (possible_circulars($n)) { + return false if grep /$i/, @$cp; + return false unless is_prime($i); + } + + return true; +} + +sub possible_circulars($n) { + my @pc = (); + my $l = length($n); + for (1 .. $l-1) { + $n = substr($n, 1) . substr($n, 0, 1); + push @pc, $n; + } + + return @pc; +} + +sub is_prime($n) { + return false if ($n == 1); + do { return false unless $n % $_ } for (2 .. sqrt $n); + return true; +} |
