From 8e6fdfef016d523454da121fbf236db52d53f211 Mon Sep 17 00:00:00 2001 From: the lemons Date: Tue, 8 Mar 2022 14:09:56 -0600 Subject: markov program --- markov.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 markov.c 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 +#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; +} -- cgit v1.2.3