Perl Weekly Challenge 223: Count Primes

These are some answers to the Week 223, task 1, of the Perl Weekly Challenge organized by Mohammad S. Anwar.

Spoiler Alert: This weekly challenge deadline is due in a few days from now (on July 2, 2023 at 23:59). This blog post offers some solutions to this challenge. Please don’t read on if you intend to complete the challenge on your own.

Task 1: Count Primes

You are given a positive integer, $n.

Write a script to find the total count of primes less than or equal to the given integer.

Example 1

Input: $n = 10
Output: 4

Since there are 4 primes (2,3,5,7) less than or equal to 10.

Example 2

Input: $n = 1
Output: 0

Example 3

Input: $n = 20
Output: 8

Since there are 8 primes (2,3,5,7,11,13,17,19) less than or equal to 20.

Count Primes in Raku

Raku has the build-in is-prime routine, implementing the very fast probabilistic Miller-Rabin test for primality. So we just need to test each integer in the 1..$n range and count those that are prime.

sub count-primes ($n) {
    return ((1..$n).grep({.is-prime})).elems;
}
for 10, 1, 20 -> $test {
    say $test.fmt("%-3d => "), count-primes $test;
}

This program displays the following output:

$ raku ./count-primes.raku
10  => 4
1   => 0
20  => 8

Count Primes in Perl

This is a port to Perl of the Raku program above. Since Perl doesn't have an is-prime built-in routine, we implement our own is_prime subroutine.

use strict;
use warnings;
use feature 'say';

sub is_prime {
    my $in = shift;
    for my $i (2..sqrt $in) {
        return 0 if $in % $i == 0;
    }
    return 1;
}
sub count_primes {
    my $n = shift;
    return scalar grep {is_prime $_} 2..$n;
}

for my $test (10, 1, 20) {
    printf "%-3d => %d\n", $test, count_primes $test;
}

This program displays the following output:

$ perl ./count-primes.pl
10  => 4
1   => 0
20  => 8

Wrapping up

The next week Perl Weekly Challenge will start soon. If you want to participate in this challenge, please check https://perlweeklychallenge.org/ and make sure you answer the challenge before 23:59 BST (British summer time) on July 9, 2023. And, please, also spread the word about the Perl Weekly Challenge if you can.

Leave a comment

About laurent_r

user-pic I am the author of the "Think Perl 6" book (O'Reilly, 2017) and I blog about the Perl 5 and Raku programming languages.