TL;DR

On with TASK #2 from The Weekly Challenge #195. Enjoy!

# The challenge

You are given a list of numbers, @list.

Write a script to find most frequent even numbers in the list. In case you get more than one even numbers then return the smallest even integer. For all other case, return -1.

Example 1

Input: @list = (1,1,2,6,2)
Output: 2 as there are only 2 even numbers 2 and 6 and of those 2
appears the most.


Example 2

Input: @list = (1,3,5,7)
Output: -1 since no even numbers found in the list


Example 3

Input: @list = (6,4,4,6,1)
Output: 4 since there are only two even numbers 4 and 6. They both
appears the equal number of times, so pick the smallest.


# The questions

Should we only consider positive integers? By the way, are integers the only suitable numbers?

# The solution

The algorithm in this case will be very basic: iterate through the provided list, keeping track of the best candidate as the list goes on.

We can track the amount of each even number with a slot in a hash, so that we can land on the most frequent.

Perl goes first this time:

#!/usr/bin/env perl
use v5.24;
use warnings;
use experimental 'signatures';
no warnings 'experimental::signatures';

my @list = @ARGV ? @ARGV : qw< 1 1 2 6 2 >;

my $result = -1; my$result_count = 0;
my %count_for = (-1 => 0);
for my $item (@list) { next if$item % 2;
my $current =$count_for{$item}++; ($result, $result_count) = ($item, $current) if$current > $result_count || ($current == $result_count &&$item < $result); } say$result;


The translation into Raku is pretty straightforward:

#!/usr/bin/env raku
use v6;
sub MAIN (*@args) {
my @list = @args ?? @args !! < 1 1 2 6 2 >».Int;
my $result = -1; my$result_count = 0;
my %count_for = -1 => 0;
for @list -> $item { next if$item % 2;
my $current = %count_for{$item}++;
($result,$result_count) = $item,$current
if $current >$result_count
|| ($current ==$result_count && $item <$result);
}
put \$result;
}


Enough for today… stay safe!

Comments? Octodon, , GitHub, Reddit, or drop me a line!