40 lines
1.2 KiB
D
40 lines
1.2 KiB
D
import std.ascii, core.stdc.stdlib;
|
|
|
|
bool canMakeWord(in string word, in string[] blocks) nothrow @nogc
|
|
in {
|
|
foreach (immutable char ch; word)
|
|
assert(ch.isASCII);
|
|
foreach (const block; blocks)
|
|
assert(block.length == 2 && block[0].isASCII && block[1].isASCII);
|
|
} body {
|
|
auto ptr = cast(string*)alloca(blocks.length * string.sizeof);
|
|
if (ptr == null)
|
|
exit(1);
|
|
auto blocks2 = ptr[0 .. blocks.length];
|
|
blocks2[] = blocks[];
|
|
|
|
outer: foreach (immutable i; 0 .. word.length) {
|
|
immutable ch = word[i].toUpper;
|
|
foreach (immutable j; 0 .. blocks2.length) {
|
|
if (blocks2[j][0] == ch || blocks2[j][1] == ch) {
|
|
if (blocks2.length > 1)
|
|
blocks2[j] = blocks2[$ - 1];
|
|
blocks2 = blocks2[0 .. $ - 1];
|
|
continue outer;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
void main() {
|
|
import std.stdio, std.string;
|
|
|
|
immutable blocks = "BO XK DQ CP NA GT RE TG QD FS JW HU VI
|
|
AN OB ER FS LY PC ZM".split;
|
|
|
|
foreach (word; "" ~ "A BARK BoOK TrEAT COmMoN SQUAD conFUsE".split)
|
|
writefln(`"%s" %s`, word, canMakeWord(word, blocks));
|
|
}
|