I’ve been doing the Weekly
Challenges. The
latest
involved array evaluation and anagrams. (Note that this ends today.)
Task 1: Check Order
You are given an array of integers, @ints
.
Write a script to re-arrange the given array in an increasing order
and return the indices where it differs from the original array.
Algorithmically, this is straightforward: copy the list, sort the
copy, compare the two and return the indices of differences. Raku:
sub checkorder(@a) {
Build the sorted list.
my @b = @a.sort({$^a <=> $^b});
my @out;
Compare each index.
for @b.kv -> $i, $c {
if (@a[$i] != $c) {
@out.push($i);
}
}
@out;
}
Task 2: Find Anagrams
You are given a list of words, @words
.
Write a script to find any two consecutive words and if they are
anagrams, drop the first word and keep the second. You continue this
until there is no more anagrams in the given list and return the
count of final list.
For the anagram test, I chose to sort the characters o each word and
test that list for string equality.
Therefore "drop the first word and keep the second" becomes a
meaningless constraint, since they're identical. All I need to do is
examine each consecutive pair of words and add one to the count if
they're different. (A more usual formulation of this kind of problem
would ask for the number of different words overall, in which case I'd
stuff them in a set and return the length.) Kotlin:
fun findanagrams(a: List<String>): Int {
Populate the working list with sorted strings.
var b = ArrayList<String>()
for (s in a) {
b.add(s.toList().sorted().joinToString(""))
}
Count the number of times an adjacent pair of words differs (adding 1
because we don't compare the first word with a notional empty string
at the start of the list).
var out = 1
for (s in b.windowed(size = 2)) {
if (s[0] != s[1]) {
out += 1
}
}
return out
}
fun main() {
if (findanagrams(listOf("acca", "dog", "god", "perl", "repl")) == 3) {
print("Pass")
} else {
print("Fail")
}
print(" ")
if (findanagrams(listOf("abba", "baba", "aabb", "ab", "ab")) == 2) {
print("Pass")
} else {
print("Fail")
}
println("")
}
Full code on
github.