I’ve been doing the Weekly
Challenges. The
latest
involved case swapping and character grouping. (Note that this ends
today.)
Task 1: Upper Lower
You are given a string consists of english letters only.
Write a script to convert lower case to upper and upper case to
lower in the given string.
There's an obvious logic to this:
if char.is_upper() {
lowercase char
} else {
uppercase char
}
but instead I can take advantage of ASCII's encoding, such that
flipping bit 5 (0x10) of a letter swaps its case.
Raku:
sub upperlower($a) {
my $out = '';
for $a.comb -> $c {
$out ~= chr(ord($c) +^ 32);
}
$out;
}
And I rather like clarity of the PostScript version, though it does
rely on some of my library functions (converting string to array and
back, and map
to apply its function to all elements in an array).
/upperlower {
s2a
{ 32 xor } map
a2s
} bind def
Task 2: Group Digit Sum
You are given a string, $str
, made up of digits, and an integer,
$int
, which is less than the length of the given string.
Write a script to divide the given string into consecutive groups of
size $int
(plus one for leftovers if any). Then sum the digits of
each group, and concatenate all group sums to create a new string.
If the length of the new string is less than or equal to the given
integer then return the new string, otherwise continue the process.
Stating the problem clearly pretty much lays out the route to the
solution. In Crystal:
def groupdigitsum(a, sz)
Make a working copy of the string, and initialise the accumulator.
s = a
n = 0
Infinitely loop.
while true
Initialise output string.
t = ""
Iterate over characters of input string, with an index value.
s.chars.each_with_index do |c, i|
Add the digit value to the accumulator.
n += c.to_i
If we've hit the end of the string or a group boundary, flush the
accumulator to the output string and zero it.
if i == s.size - 1 || (i + 1) % sz == 0
t += n.to_s
n = 0
end
end
Copy output string to next input.
s = t
If it's short enough, break out of the lopo and return it.
if s.size <= sz
break
end
end
s
end
Full code on
github.