I’ve been doing the Weekly
Challenges. The
latest
involved letter sorting and an array calculation. (Note that this
closes today.)
Task 1: Keyboard Word
You are given an array of words.
Write a script to print all the words in the given array that can be
types using alphabet on only one row of the keyboard.
Perl:
sub keyboardword($wl) {
return [grep /^([qwertyuiop]+|[asdfghjkl]+|[zxcvbnm]+)$/i, @{$wl}];
}
Languages with less-embedded regexps are a little more faff, such as
JavaScript:
function keyboardword(wl) {
let re = /^([qwertyuiop]+|[asdfghjkl]+|[zxcvbnm]+)$/i;
let out = []
for (let w of wl) {
if (w.search(re) > -1) {
out.push(w);
}
}
return out;
}
Lua has regex-like patterns but without alternation, so I just check
each one separately.
PostScript doesn't have a pattern engine at all, so I build a dict
with a row number for each letter, build another dict with all the row
numbers I find, and pass on the word if there's just one row.
Task 2: H-Index
You are given an array of integers containing citations a researcher
has received for each paper.
Write a script to compute the researcher’s H-Index. For more
information please checkout the wikipedia
page.
One of the few occasions on which a 1-based index is actually useful. Lua:
function h_index(c0)
local c = c0
table.sort(c, function(a, b) return b < a end)
local h = 0
for i, x in ipairs(c) do
if i <= x then
h = i
else
break
end
end
return h
end
And in PostScript, made much easier by library functions:
/h_index {
2 dict begin
0 exch
quicksort reverse enumerate.array {
aload pop
/x exch def
1 add /i1 exch def
i1 x le {
pop i1
} {
exit
} ifelse
} forall
} bind def
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.