On Thursday, 9 February 2017 at 17:36:11 UTC, Nestor wrote:
Hi,
I was trying to port C code from the article in Wikiversity [1]
to D, but I'm not sure this implementation is the most
efficient way to do it in D, so suggestions to optimize it are
welcome:
import std.stdio;
static immutable char[] QG10Matrix =
"03175986427092154863420687135917509834266123045978" ~
"36742095815869720134894536201794386172052581436790";
char checkDigit(string str) {
char tmpdigit = '0';
foreach(chr; str) tmpdigit = QG10Matrix[(chr - '0') +
(tmpdigit - '0') * 10];
return tmpdigit;
}
enum {
EXIT_SUCCESS = 0,
EXIT_FAILURE = 1,
}
int main(string[] args) {
scope(failure) {
writeln("Invalid arguments. You must pass a number.");
return EXIT_FAILURE;
}
assert(args.length == 2);
char digit = checkDigit(args[1]);
if(digit == '0') writefln("%s is a valid number.", args[1]);
else {
writefln("%s is not a valid number (but it would be,
appending digit %s).",
args[1], digit);
}
return EXIT_SUCCESS;
}
[1] https://en.wikiversity.org/wiki/Damm_algorithm
I can't see how to make it more efficient than it is (aside from
finding a better algorithm which isn't a language concern). You
are using C style and will get the same machine code as if you'd
written it with C. The only difference would be boundchecking
that you can disable by using the -boundscheck=off compiler
switch.
By the way note that you can use the -profile switch to see where
the bottlenecks are, in your case writting the result to stdout
is *by far* what takes the most time (and I'm quite certain the
bottleneck is the same in the C version for it's a fact that I/O
is slow).