002
03.04.2011, 14:59 Uhr
0xdeadbeef
Gott (Operator)
|
Ich hab hier noch so was rumliegen. Wenn ich mich nicht irre, ist das aus Code gewachsen, den virtual vor langer Zeit zum Lösen eines Rätsels benutzt hatte - ich hab im Wesentlichen die Schrift auf mehr als nur Großbuchstaben erweitert.
Wie dem auch sei:
C++: |
#include <ctype.h> #include <stddef.h> #include <stdio.h> #include <stdlib.h>
#ifdef _WIN32 # define NOMINMAX # include <windows.h> #else # include <fcntl.h> # include <sys/ioctl.h> # include <unistd.h> #endif
static size_t get_term_columns(void) { size_t cols = 80;
#ifdef _WIN32 HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_SCREEN_BUFFER_INFO info;
if(GetConsoleScreenBufferInfo(h, &info)) { cols = info.dwSize.X; } #else char const *col_env = getenv("COLUMNS");
if(!col_env || sscanf(col_env, "%lu", &cols) != 1) { struct winsize wsz; if(!ioctl(STDOUT_FILENO, TIOCGWINSZ, &wsz)) { cols = wsz.ws_col; } } #endif
return cols; }
static size_t size_t_max(size_t x, size_t y) { return x > y ? x : y; }
static void print_phrase(char const *s) { static char const font[][97] = { /* !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~*/ "@DJ@DSBDHB@@@@@PNDNNH_L_NN@@H@BNNNONO__NQDPQAQQNONON_QQQQQ_NAND@D@A@P@L@ADPAF@@@@@@@D@@@@@@HDB@", "@DJJNSEDDDJD@@@PQFQQLABPQQ@@D@DQQQQQQAAQQDPIA[QQQQQQDQQQQQPBAHJ@H@A@P@B@A@@AD@@@@@@@D@@@@@@DDD@", "@D@_AHE@DDND@@@HYDPPJAAHQQDDB_HPYQQAQAAAQDPEAUSQQQQADQQQJJHBBHQ@@NON^NB^OFXIDKGNO^MNNQQQQQ_DDDV", "@D@JNDB@DD__@_@DUDHLIOODN^@@A@PHU_OAQOOA_DPCAQUQOQONDQQQDDDBDH@@@PQQQQOQQDPEDUIQQQRADQQQJQHBDHM", "@D@JPBU@DDND@@@BSDDP_PQDQPDDB_HD]QQAQAAYQDPEAQYQAUQPDQQUJDBBHH@@@^QAQOBQQDPCDUIQQQBNDQQUDQDDDD@", "@@@_NYI@DDJD@@@AQDBQHQQDQH@BD@D@AQQQQAAQQDPIAQQQAIQQDQJ[QDABPH@@@QQQQAB^QDPEDUIQO^BPDYJUJ^BDDD@", "@D@JDYV@HB@@D@DANN_NHNNDNF@@H@BDNQONO_ANQDQQ_QQNAVQNDNDQQD_NPN@_@^ON^NBPQNRINUINAPGNLVDJQP_HDB@", "@@@@@@@@@@@@B@@@@@@@@@@@@@@@@@@@@@@@@@@@@@N@@@@@@@@@@@@@@@@@@@@@@@@@@@@N@@L@@@@@AP@@@@@@@N@@@@@" }; static size_t const font_x = 6; static size_t const font_y = 8;
/* lpl == letters per line. Zeilenumbrüche werden sehr rudimentär forciert; * vernünftige Silbentrennung wäre mir viel zu viel Aufwand. */ size_t i, j, lpl = size_t_max(get_term_columns() / 6, 1); /* "line" hier im Sinne von nach lpl umgebrochenen Zeilen des Eingabetextes */ char const *pos_line; char const *pos_letter;
for(pos_letter = pos_line = s; *pos_letter; pos_line += lpl) { for(i = 0; i < font_y; ++i) { for(pos_letter = pos_line; *pos_letter && (pos_letter - pos_line) < lpl; ++pos_letter) { char c = isprint(*pos_letter) ? *pos_letter : '?';
for(j = 0; j < font_x; ++j) { putchar((font[i][c - ' '] >> j & 1) ? *pos_letter : ' '); } } putchar('\n'); } } }
int main(int argc, char *argv[]) { char text[] = " !\"#$%&'()*+,-./0123456789:;<=>?@" "ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`" "abcdefghijklmnopqrstuvwxyz{|}~";
if(argc == 1) { print_phrase(text); } else { size_t i; for(i = 1; i < argc; ++i) { print_phrase(argv[i]); } }
return 0; }
|
-- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra |