I’ve been doing the Weekly
Challenges. The
latest
involved string and integer list manipulation. (Note that this ends
today.)
Task 1: Divisible Average
You are given an array of positive integers.
Write a script to return the closest integer to the mean value of
all even integers that are divisible by 3. If none is divisible,
return 0.
Quite straightforward. In Perl:
sub divisibleaverage($a) {
First, "even integers that are divisible by 3" is "integers divisible
by 6." We don't care about anything else.
my @b = grep { $_ % 6 == 0 } @{$a};
If there are none left, bail out here.
if (scalar @b == 0) {
return 0;
}
Otherwise, divide sum by list length and round to nearest integer.
int(sum(@b) / (scalar @b) + 0.5);
}
Task 2: String Difference
You are given an array of equal length strings.
Write a script to find the difference integer array of each word in
the given array. There will be one word with a different array;
return that word.
Each words[i] can be converted into a difference integer array
difference[i] of length n - 1 where difference[i][j] =
words[i][j+1] - words[i][j]
In Rust.
fn stringdifference(a: Vec<&str>) -> String {
First I'll build the list of difference arrays.
let mut da = Vec::new();
For each input string,
for s in &a {
let mut p = Vec::new();
walk across pairs of values and take their differences.
for d in s.chars().collect::<Vec<_>>().windows(2) {
p.push((d[1] as i32) - (d[0] as i32));
}
da.push(p);
}
Now we'll look for the odd one out. Walk over all entries except the first.
let mut dx = 0;
for b in 1..a.len() {
If this one isn't the same as the first,
if da[0] != da[b] {
If we've seen a different entry already,
if dx > 0 {
Then it's the first that's the different one.
dx = 0;
break;
} else {
Otherwise this is probably the different one (but keep looking).
dx = b;
}
}
}
Return the value of the different entry.
a[dx].to_string()
}
Full code in all tagged languages is on
codeberg.