diff options
author | the lemons <citrons@mondecitronne.com> | 2022-03-08 14:09:56 -0600 |
---|---|---|
committer | the lemons <citrons@mondecitronne.com> | 2022-03-08 14:09:56 -0600 |
commit | 8e6fdfef016d523454da121fbf236db52d53f211 (patch) | |
tree | a3876a8233eda228b0b0ce3f5cf1143afbc38a3e |
markov program
-rw-r--r-- | markov.c | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/markov.c b/markov.c new file mode 100644 index 0000000..39dbc92 --- /dev/null +++ b/markov.c @@ -0,0 +1,50 @@ +#include <stdio.h> +#include <stdlib.h> +#include <time.h> +#include <stdint.h> +#include <sysexits.h> + +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; +} |