summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorthe lemons <citrons@mondecitronne.com>2022-03-08 14:09:56 -0600
committerthe lemons <citrons@mondecitronne.com>2022-03-08 14:09:56 -0600
commit8e6fdfef016d523454da121fbf236db52d53f211 (patch)
treea3876a8233eda228b0b0ce3f5cf1143afbc38a3e
markov program
-rw-r--r--markov.c50
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;
+}