I’ve been doing the Weekly
Challenges. The
latest
involved integer filtering. (Note that this closes today.)
Task 1: Special Integers
You are given a positive integer, $n > 0.
Write a script to print the count of all special integers between 1 and $n.
An integer is special when all of its digits are unique.
Therefore: convert to string, check for uniqueness of characters.
(Could have done it as a repeated mod10, but I felt stringy.)
For the uniqueness test, I incremented hashes where that was easy, or
used sets where they were readily available.
PostScript:
/specialintegers {
4 dict begin
/n exch def
/o 0 def
For each candidate number:
1 1 n {
/f 0 dict def
/s true def
Convert it to a string and iterate over the characters.
dup log cvi 1 add string cvs {
/c exch def
If we've seen it before, mark as non-special and bail out.
f c known {
/s false def
exit
} {
Otherwise record it.
f c true put
} ifelse
} forall
If it's special, increment the output count.
s {
/o o 1 add def
} if
} for
o
end
} bind def
Task 2: Most Frequent Even
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.
Perl:
sub mostfrequenteven($l) {
my %f;
Filter for evenness and build a frequency table.
foreach my $n (@{$l}) {
if ($n % 2 == 0) {
$f{$n}++;
}
}
if (scalar %f > 0) {
Get the maximum frequency, and sort the keys that have that freqency.
The first one is the lowest number.
my $m = max(values %f);
my @l = grep {$f{$_} == $m} keys %f;
@l = sort @l;
return $l[0];
} else {
If there were no even numbers, return -1.
return -1;
}
}
Full code on
github.
Comments on this post are now closed. If you have particular grounds for adding a late comment, comment on a more recent post quoting the URL of this one.