Write all possible Braille characters
GolfScript, 34 32 chars
44,{84+2base(;{'-#'=}/@\n.}%2/n*
Turns out that there are shorter solutions than simply generating all 64 patterns and filtering out the bad ones. In fact, by suitably mapping bits to grid positions, it's possible to map all valid (non-empty) patterns to a consecutive range of numbers, as this program does.
Specifically, the mapping I use is:
5 4
3 1
2 0
where the numbers denote the bit position (starting from the least significant bit 0
) mapped to that position in the grid. With this mapping, the valid grids correspond to the numbers 20 to 63 inclusive.
This is almost the same as the obvious mapping obtained by writing out the 6-bit number in binary and adding line breaks between every second bit, except that the bits 1
and 2
are swapped — and indeed, that's exactly how my program computes it. (I also add 64 to the numbers before converting them to binary, and then strip the extra high bit off; that's just to zero-pad the numbers to 6 bits, since GolfScript's base
would otherwise not return any leading zeros.)
Ps. Online demo here. (Server seems overloaded lately; if you get a timeout, try again or download the interpreter and test it locally.)
Edit: Managed to save two chars by avoiding unnecessary array building and dumping. Phew!
Mathematica 97
Grid /@ Cases[(#~Partition~2 & /@ Tuples[{"#", "-"}, 6]), x_ /;
x[[All, 1]] != {"-", "-", "-"} && x[[1]] != {"-", "-"}]
Blank is not included:
Length[%]
44
N.B. != is a single character in Mathematica.
C# – 205
class C{static void Main(){var s="---##-##";Action<int,int>W=(i,m)=>{Console.WriteLine(s.Substring((i>>m&3)*2,2));};for(int i=0;i<64;++i){if((i&3)>0&&(i&42)>0){W(i,0);W(i,2);W(i,4);Console.WriteLine();}}}}
Readable version:
class C
{
static void Main()
{
var s = "---##-##"; // all two-bit combinations
// a function to write one two-bit pattern (one line of a Braille character)
Action<int,int> W = (i,m) => { Console.WriteLine(s.Substring(((i >> m) & 3) * 2, 2)); };
// for all possible 6-bit combinations (all possible Braille characters)
for(int i = 0; i < 64; ++i)
{
// filter out forbidden (non-unique) characters
if ((i & 3) > 0 && (i & 42) > 0)
{
// write three rows of the Braille character and an empty line
W(i,0);
W(i,2);
W(i,4);
Console.WriteLine();
}
}
}
}