diff options
Diffstat (limited to 'challenge-200/paulo-custodio/cpp/ch-2.cpp')
| -rw-r--r-- | challenge-200/paulo-custodio/cpp/ch-2.cpp | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/challenge-200/paulo-custodio/cpp/ch-2.cpp b/challenge-200/paulo-custodio/cpp/ch-2.cpp new file mode 100644 index 0000000000..d7ae53b788 --- /dev/null +++ b/challenge-200/paulo-custodio/cpp/ch-2.cpp @@ -0,0 +1,113 @@ +/* +Challenge 200 + +Task 2: Seven Segment 200 +Submitted by: Ryan J Thompson +A seven segment display is an electronic component, usually used to display +digits. The segments are labeled 'a' through 'g' as shown: + + +Seven Segment + + +The encoding of each digit can thus be represented compactly as a truth table: + +my @truth = qw<abcdef bc abdeg abcdg bcfg acdfg acdefg abc abcdefg abcfg>; +For example, $truth[1] = ‘bc’. The digit 1 would have segments ‘b’ and ‘c’ enabled. + +Write a program that accepts any decimal number and draws that number as a +horizontal sequence of ASCII seven segment displays, similar to the following: + + +------- ------- ------- + | | | | | + | | | | | +------- +| | | | | +| | | | | +------- ------- ------- +To qualify as a seven segment display, each segment must be drawn (or not drawn) +according to your @truth table. + +The number "200" was of course chosen to celebrate our 200th week! +*/ + +#include <iostream> +#include <string> + +#define A 1 +#define B 2 +#define C 4 +#define D 8 +#define E 16 +#define F 32 +#define G 64 + +int truth[10] = { + A|B|C|D|E|F, B|C, A|B|D|E|G, A|B|C|D|G, B|C|F|G, + A|C|D|F|G, A|C|D|E|F|G, A|B|C, A|B|C|D|E|F|G, A|B|C|F|G +}; + +void draw_number(int n) { + std::string s = std::to_string(n); + + // draw a + for (size_t i = 0; i < s.size(); i++) { + int digit = s[i] - '0'; + if ((truth[digit] & A)==A) + std::cout << " #### "; + else + std::cout << " "; + } + std::cout << std::endl; + // draw f, b + for (int j = 0; j < 2; j++) { + for (size_t i = 0; i < s.size(); i++) { + int digit = s[i] - '0'; + if ((truth[digit] & F)==F) std::cout << "#"; else std::cout << " "; + std::cout << " "; + if ((truth[digit] & B)==B) std::cout << "#"; else std::cout << " "; + std::cout << " "; + } + std::cout << std::endl; + } + // draw g + for (size_t i = 0; i < s.size(); i++) { + int digit = s[i] - '0'; + if ((truth[digit] & G)==G) + std::cout << " #### "; + else + std::cout << " "; + } + std::cout << std::endl; + // draw e, c + for (int j = 0; j < 2; j++) { + for (size_t i = 0; i < s.size(); i++) { + int digit = s[i] - '0'; + if ((truth[digit] & E)==E) std::cout << "#"; else std::cout << " "; + std::cout << " "; + if ((truth[digit] & C)==C) std::cout << "#"; else std::cout << " "; + std::cout << " "; + } + std::cout << std::endl; + } + // draw d + for (size_t i = 0; i < s.size(); i++) { + int digit = s[i] - '0'; + if ((truth[digit] & D)==D) + std::cout << " #### "; + else + std::cout << " "; + } + std::cout << std::endl; +} + +int main(int argc, char* argv[]) { + argv++; argc--; + if (argc == 0) { + std::cerr << "usage: ch-2 num" << std::endl; + exit(EXIT_FAILURE); + } + + draw_number(atoi(argv[0])); +} |
