public static class Pangram
{
public static bool IsPangram(string input) {
int phrasemask = 0;
foreach (char letter in input)
{
// a-z
if (letter > 96 && letter < 123)
phrasemask |= 1 << (letter - 'a');
// A - Z
else if (letter > 64 && letter < 91)
phrasemask |= 1 << (letter - 'A');
}
//26 binary 1s
return phrasemask == 67108863;
}
}
This solution uses the ASCII value of the letter to set the corresponding bit position.
The string
loops through its characters and looks for a character being a
through z
or A
through Z
.
The ASCII value for a
is 97
, and for z
is 122
.
The ASCII value for A
is 65
, and for Z
is 90
.
- If the lower-cased letter is subtracted by
a
, thena
will result in0
, because97
minus97
equals0
.z
would result in25
, because122
minus97
equals25
. Soa
would have1
shifted left 0 places (so not shifted at all) andz
would have1
shifted left 25 places. - If the upper-cased letter is subtracted by
A
, thenA
will result in0
, because65
minus65
equals0
.Z
would result in25
, because90
minus65
equals25
. SoA
would have1
shifted left 0 places (so not shifted at all) andZ
would have1
shifted left 25 places.
In that way, both a lower-cased z
and an upper-cased Z
can share the same position in the bit field.
So, for an unsigned thirty-two bit integer, if the values for a
and Z
were both set, the bits would look like
zyxwvutsrqponmlkjihgfedcba
00000010000000000000000000000001
We can use the bitwise OR operator to set the bit.
After the loop completes, the function returns if the phrasemask
value is the same value as when all 26
bits are set, which is 67108863
.
This approach is fast, but it may be considered to be more idiomatic of the C language than C#.