Peter’s blog ✴ Week 258 ✴ 26 February 2024
THE WEEKLY CHALLENGE
All about the way numbers are written
You are given a array of positive integers, @ints. Write a script to find out how many integers have an even number of digits.
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
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.
This is what you get when you use all the magic from the Perl book. You get handy interface to play with it.
#!/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]; }
5 lines of code
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
Any content of this website which has been created by Peter Campbell Smith is in the public domain