I’ve been doing the Weekly
Challenges. The
latest
involved string replacement and character searching. (Note that this
ends today.)
Task 1: Defrang IP Address
You are given a valid IPv4
address.
Write a script to return the defranged version of the given IP
address.
A defranged IP address replaces every period "." with "[.]".
I have no idea why you'd want to do this, but fair enough. There are
two basic approaches depending on the language: either a global
substitution (with regular expressions where ndeeded, though they
don't make this particular problem any easier) or digging a little
deeper with a character-by-character processing loop.
Raku, global substitution:
sub defrangip($a) {
(my $b = $a) ~~ s:g/\./[.]/;
return $b;
}
Rust, a processing loop (also PostScript):
(There is in fact a replace()
method for String
types in Rust, I
had just already written this before I thought of looking for it.)
fn defrangip(a: &str) -> String {
let mut out = String::new();
for c in a.chars() {
if c == '.' {
out.push_str("[.]");
} else {
out.push(c);
}
}
out
}
Task 2: String Score
You are given a string, $str
.
Write a script to return the score of the given string.
The score of a string is defined as the sum of the absolute difference between the ASCII values of adjacent characters.
Also pretty straightforward. Perl doesn't have an "overlapping chunks
of an array" function, so I do it with indices (Ditto Lua.).
sub stringscore($a) {
my $out = 0;
my @c = split '',$a;
foreach my $i (0 .. $#c - 1) {
$out += abs(ord($c[$i]) - ord($c[$i+1]));
}
return $out;
}
Everything else does, or can have it added, even PostScript now that
I've written a rotor
method inspired by Raku's.
/stringscore {
0 exch
s2a
2 -1 rotor
{
aload pop sub abs add
} 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.