Skip to content

Instantly share code, notes, and snippets.

@ylegall
Created June 6, 2017 20:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ylegall/3e33cce8d3e278ac2fb4269b00196507 to your computer and use it in GitHub Desktop.
Save ylegall/3e33cce8d3e278ac2fb4269b00196507 to your computer and use it in GitHub Desktop.
console 7 segment display
import std.algorithm;
import std.array;
import std.conv;
import std.exception;
import std.stdio;
import std.string;
import std.traits;
alias Digit = bool[7];
template set(alias D, Args...) {
static if (Args.length) {
enum set = D.stringof ~ "[" ~ text(Args[0]) ~ "] = true;" ~ set!(D, Args[1 .. $]);
} else {
enum set = "";
}
}
auto setDigit(ref Digit d, uint x) {
assert(x >= 0 && x <= 10);
d[] = false;
final switch (x) {
case 0: d[] = true; d[3] = false; break;
case 1: mixin(set!(d, 2, 5)); break;
case 2: mixin(set!(d, 0, 2, 3, 4, 6)); break;
case 3: mixin(set!(d, 0, 2, 3, 5, 6)); break;
case 4: mixin(set!(d, 1, 2, 3, 5)); break;
case 5: mixin(set!(d, 0, 1, 3, 5, 6)); break;
case 6: mixin(set!(d, 0, 1, 3, 4, 5, 6)); break;
case 7: mixin(set!(d, 0, 2, 5)); break;
case 8: d[] = true; break;
case 9: mixin(set!(d, 0, 1, 2, 3, 5, 6)); break;
}
}
auto loadDigits(string str)
{
auto len = str.length;
uint val = 0;
try {
val = to!uint(str);
} catch (Exception e) {
writefln("not able to parse %s as an unsigned integer");
return;
}
auto digits = new Digit[len];
foreach (i; 0 .. len) {
setDigit(digits[i], str[i] - '0');
}
display(digits);
}
auto times(ulong n, lazy void fn)
{
while (n--) fn();
}
auto display(Digit[] digits)
{
auto len = to!int(digits.length);
auto d = digits[$ - 1];
(digits.length - 1).times(write(" "));
write(d[0]? "/" : " ");
writeln(d[2]? `\ ` : " ");
(digits.length - 1).times(write(" "));
write(d[1]? `\` : " ");
write(d[3]? `/` : " ");
writeln(d[5]? `\` : " ");
for (int i = len - 2; i >= 0; --i) {
d = digits[i];
i.times(write(" "));
write(d[0]? "/" : " ");
write(d[2]? `\` : " ");
auto p = digits[i+1];
write(p[4]? `\` : " ");
writeln(p[6]? `/` : " ");
i.times(write(" "));
write(d[1]? `\` : " ");
write(d[3]? `/` : " ");
writeln(d[5]? `\` : " ");
}
d = digits[0];
write(" ");
write(d[4]? `\` : " ");
writeln(d[6]? `/` : " ");
}
auto displayLeveled(Digit[] digits)
{
// top row
foreach (d; digits) {
write((d[0])? " _ ": " ");
}
writeln();
foreach (d; digits) {
write((d[1])? "|": " ");
write((d[3])? "_": " ");
write((d[2])? "|": " ");
}
writeln();
foreach (d; digits) {
write((d[4])? "|": " ");
write((d[6])? "_": " ");
write((d[5])? "|": " ");
}
writeln();
writeln();
}
void main(string[] args) {
string str;
if (args.length >= 2) {
str = args[1];
} else {
write("enter a positive integer: ");
str = readln.strip;
}
loadDigits(str);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment