aboutsummaryrefslogtreecommitdiff
path: root/challenge-167
diff options
context:
space:
mode:
authorMohammad S Anwar <mohammad.anwar@yahoo.com>2022-06-05 12:31:41 +0100
committerMohammad S Anwar <mohammad.anwar@yahoo.com>2022-06-05 12:31:41 +0100
commite1e7c2515eba807b2f12e2e27ee54e47c0701541 (patch)
tree0d9eb138f3c6873f9738fc82ce131d0bae0fdb9b /challenge-167
parent18a163895ca6d1cc72f209a9a9ba6a4713ab8ebc (diff)
downloadperlweeklychallenge-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.pl71
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;
+}