Swapping nibbles range style
bearophile
bearophileHUGS at lycos.com
Tue Dec 10 15:39:02 PST 2013
A nibble is 4 bits. Working with strings like this is not so
efficient.
Two more versions of the OP code, the second is a little more
efficient:
import std.stdio, std.algorithm, std.range, std.string;
string swapAdjacent(in string s) pure
in {
assert(s.length % 2 == 0);
assert(s.all!(c => c < 128));
} out(result) {
assert(result.length == s.length);
} body {
return s
.chunks(2)
.map!(c => [cast(char)c.dropOne.front,
cast(char)c.front])
.join;
}
string swapAdjacent2(in string s) pure
in {
assert(s.length % 2 == 0);
assert(s.all!(c => c < 128));
} out(result) {
assert(result.length == s.length);
} body {
auto result = new char[s.length];
foreach (immutable i, ref c; result)
c = s[i + (i & 1 ? -1 : 1)];
return result;
}
void main() {
"0123456789ABCDEF".swapAdjacent.writeln;
"0123456789ABCDEF".swapAdjacent2.writeln;
}
Bye,
bearophile
More information about the Digitalmars-d-learn
mailing list