Peter
Peter Campbell Smith

All about the way
numbers are written

Weekly challenge 258 — 26 February 2024

Week 258 - 26 Feb 2024

Task 1

Task — Count even digits number

You are given a array of positive integers, @ints. Write a script to find out how many integers have an even number of digits.

Examples


Example 1
Input: @ints = (10, 1, 111, 24, 1000)
Output: 3

There are 3 integers having even digits i.e. 10, 24 and 1000.

Example 2
Input: @ints = (111, 1, 11111)
Output: 0

Example 3
Input: @ints = (2, 8, 1024, 256)
Output: 1

Analysis

This is a pretty easy one-liner, thanks to Perl's willingness to treat integers as numeric values or strings of digits depending on context. The one line is:

$count +=  1 - (length($_) % 2) for @_;

The length call returns the numbers of digits in each of @ints, the
% 2 returns the remainder on diving that by 2, which will be 0 or 1, and the 1 - swaps those to 1 or 0, which is what we are asked to count.

As we are treating @ints purely as a string of digits this works even if any of the numbers strays into BigInt territory, but sadly Perl won't (easily) print a number with more than 15 digits other than in floating point format.

Try it 

Try running the script with any input:



example: 10, 1, 111, 24, 1000

Script


#!/usr/bin/perl

# Blog: http://ccgi.campbellsmiths.force9.co.uk/challenge

use v5.26;    # The Weekly Challenge - 2024-02-26
use utf8;     # Week 258 - task 1 - Count even digits number
use warnings; # Peter Campbell Smith
binmode STDOUT, ':utf8';

count_even_digits_number (10, 1, 111, 24, 1000);
count_even_digits_number (111, 1, 11111);
count_even_digits_number (2, 8, 1024, 256);
count_even_digits_number (1234567890123456789901234567890,
    12345678901234567890, 123456789);

sub count_even_digits_number {
    
    # count @ints with even length
    my $count = 0;
    $count +=  1 - (length($_) % 2) for @_;
    
    say qq[\nInput: (] . join(', ', @_) . ')';
    say qq[Output: $count];
}

Output


Input: (10, 1, 111, 24, 1000)
Output: 3

Input: (111, 1, 11111)
Output: 0

Input: (2, 8, 1024, 256)
Output: 1

Input: (1.23456789012346e+30, 12345678901234567890, 123456789)
Output: 2