[your code here]
Era Scarecrow
rtcvb32 at yahoo.com
Sun Feb 5 21:17:09 PST 2012
>> The optional third parameter of `indexOf' can be called with
>> `CaseSensitive.no'. But that parameter is left untouched.
>> Instead a check with `toUpper( c)' is used, thereby risking a
>> further visitation of the whole string .
>
> Using CaseSensitive.no is a lot slower
Hmmm then perhaps a whole re-write. I've gotten this done,
although I'll need someone to tell me how well it does. Far as I
can tell it's O(n). It's based loosely on the ascii version,
except templatized. Hope it's not too ugly...
import std.stdio, std.string, std.traits, std.uni, std.conv;
string T_isPangram(string name, string set, string uset = "") {
string x = "bool " ~ name ~ "(S)(S s) if (isSomeString!S) {\n";
if(set.length > 32) {
x ~= "\tulong bitset;\n";
} else {
x ~= "\tuint bitset;\n";
}
x ~= "\tforeach(dchar c; s) {\n\t\tswitch(toLower(c)) {\n";
foreach(i, c; set) {
x ~= "\t\t\tcase '" ~ c ~ "':";
x ~= "\tbitset |= 1 << " ~ to!string(i) ~ "; break;\n";
}
int i = set.length;
while(uset.length >= 6) {
x ~= "\t\t\tcase '" ~ uset[0 .. 6] ~ "':";
x ~= "\tbitset |= 1 << " ~ to!string(i) ~ "; break;\n";
uset = uset[6 .. $];
i++;
}
x ~= "\t\t\tdefault:\n\t\t}\n\t}\n\treturn bitset == (1 << " ~
to!string(i) ~ ") - 1;\n}";
return x;
}
mixin(T_isPangram("EN_isPangram", "abcdefghijklmnopqrstuvwxyz"));
mixin(T_isPangram("DE_isPangram", "abcdefghijklmnopqrstuvwxyz",
"\\u00DF\\u00e4\\u00f6\\u00dc"));
mixin(T_isPangram("SV_isPangram", "abcdefghijklmnopqrstuvwxyz",
"\\u00e5\\u00e4\\u00f6"));
unittest {
writeln(T_isPangram("TEST_isPangram", "ab",
"\\u00DF\\u00e4")); //example output below
assert(!EN_isPangram("this doesn't cover everything"));
assert(EN_isPangram("the quick brown fox jumps over the LAZY
dog")); //to-lower check along with english
assert(DE_isPangram("Falsches Üben von Xylophonmusik quält
jeden größeren Zwerg"));
assert(SV_isPangram("Yxskaftbud, ge vår wczonmö iqhjälp"w));
}
/*
bool TEST_isPangram(S)(S s) if (isSomeString!S) {
uint bitset;
foreach(dchar c; s) {
switch(toLower(c)) {
case 'a': bitset |= 1 << 0; break;
case 'b': bitset |= 1 << 1; break;
case '\u00DF': bitset |= 1 << 2; break;
case '\u00e4': bitset |= 1 << 3; break;
default:
}
}
return bitset == (1 << 4) - 1;
}
*/
More information about the Digitalmars-d
mailing list