#include int main () { /* Die aktuellen noch nicht ausgegebenen Bits. Neue Bits * werden hinten angehaengt. */ unsigned int current = 0; /* Wieviele Bits in current zaehlen im Moment tatsaechlich. */ unsigned int nrbits = 0; /* Das aktuelle Zeichen */ int ch; /* Zeichenweise einlesen bis zum Dateiende */ while ((ch = getchar ()) != EOF) { /* Die neuen Bits fuer das aktuelle Zeichen */ int new = 0; /* Wieviele Bits zaehlen in new */ int nrnew = 0; switch (ch) { /* Erste Klasse von Faelle: 4 Bits, \n = 7, ' ' = 6, etc. */ case '\n': new++; /* Falltrough */ case ' ': new++; /* Falltrough */ case 'l': new++; /* Falltrough */ case 't': new++; /* Falltrough */ case 's': new++; /* Falltrough */ case 'n': new++; /* Falltrough */ case 'r': new++; /* Falltrough */ case 'e': /* Alle acht Faelle oben landen hier */ nrnew = 4; new |= (1<<3); break; /* Zweite Klasse von Faellen: 7 Bits aber kein * Kleinbuchstabe */ case ')': new++; /* Fallthrough */ case '(': new++; /* Fallthrough */ case ':': new++; /* Fallthrough */ case ';': new++; /* Fallthrough */ case ',': new++; /* Fallthrough */ case '.': /* Alle sechs Faelle landen hier. Der * Wert der letzten 5 Bits ergibts sich * als new + 26 bzw. new + 'z' - 'a' + 1. */ nrnew = 7; new += 1 + ('z' - 'a'); new |= (1<<5); break; /* Die restlichen Faelle. Unterschieden nach Kleinbuchstaben * (7 Bit) oder anderen Zeichen (10 Bit). */ default: if (('a' <= ch) && (ch <= 'z')) { /* Kleinbuchstaben: 7 Bits, die * letzten 5 Bits sind der Index * im Alphabet, also ch - 'a' */ nrnew = 7; new = ch - 'a'; new |= (1<<5); } else { /* Andere Zeichen. */ nrnew = 10; new = ch; } break; } /* Die neuen Bits an die alten anhaengen. */ current = (current << nrnew) | new; nrbits += nrnew; if (nrbits >= 16) { /* Es sind wieder 16 Bits zusammengekommen: * Die ersten sechzehn werden ausgegeben und dann * werden alle bis auf die letzten nrbits-16 Bits * auf 0 gesetzt. */ nrbits -= 16; printf ("%d\n", current >>nrbits); current &= (1 << nrbits) - 1; } } /* Dateiende erreicht, restliche Bits ausgeben. */ if (nrbits > 0) { current <<= (16 - nrbits); current |= (1<<(16-nrbits))-1; printf ("%d", current); } printf ("\n"); return 0; }