#include #include #include #include #include static struct { int n; int *cs; } patterns[256] = {0}; static uint32_t hash(char *s) { unsigned int h = 0x811c9dc5; for (size_t i = 0; s[i] != '\0'; i++) { h *= 0x01000193; h = h ^ s[i]; } return h; } int main(int argc, char *argv[]) { if (argc > 1) { if (argc > 2) { fprintf(stderr, "usage: %s [seed]\n", argv[0]); return EX_USAGE; } srand(hash(argv[1])); } else srand(time(NULL)); int c; int prev = getchar(); int p = prev; while (prev != EOF) { c = getchar(); prev = (unsigned char) prev; patterns[prev].n++; patterns[prev].cs = realloc(patterns[prev].cs, patterns[prev].n * sizeof(int)); if (!patterns[prev].cs) perror(argv[0]); patterns[prev].cs[patterns[prev].n - 1] = c; prev = c; } while (p != EOF && patterns[p].n != 0) { p = (unsigned char) p; putchar(p); p = patterns[p].cs[rand() % patterns[p].n]; } return 0; }