diff --git a/20220428/hash-map-1.c b/20220428/hash-map-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..ac4e69a997c9bb334c51726867d81972363b5ac6
--- /dev/null
+++ b/20220428/hash-map-1.c
@@ -0,0 +1,23 @@
+#include <stdio.h>
+#include <string.h>
+
+int get_number (const char *name)  /* geschummelt, aber trotzdem schlechter als die */
+{                                  /* richtige Lösung: O(n) statt O(1)              */
+  if (!strcmp (name, "eins"))
+    return 1;
+  else if (!strcmp (name, "zwei"))
+    return 2;
+  else if (!strcmp (name, "drei"))
+    return 3;
+  else
+    return 0;
+}
+
+int main (void)
+{
+  int eins = get_number ("eins");
+  int zwei = get_number ("zwei");
+  int drei = get_number ("drei");
+  printf ("%d %d %d\n", eins, zwei, drei);
+  return 0;
+}
diff --git a/20220428/hash-map-2.c b/20220428/hash-map-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..ad282b0476fc916d70459f9884f1e99e41edbf0a
--- /dev/null
+++ b/20220428/hash-map-2.c
@@ -0,0 +1,20 @@
+#include <stdio.h>
+#include <string.h>
+
+int get_number (const char *name)  /* geschummelt, aber trotzdem schlechter als die */
+{                                  /* richtige Lösung: O(n) statt O(1)              */
+  static const char *n[] = { "null", "eins", "zwei", "drei", "vier", NULL };
+  for (int i = 0; n[i]; i++)
+    if (!strcmp (name, n[i]))
+      return i;
+  return -1;
+}
+
+int main (void)
+{
+  int eins = get_number ("eins");
+  int zwei = get_number ("zwei");
+  int drei = get_number ("drei");
+  printf ("%d %d %d\n", eins, zwei, drei);
+  return 0;
+}
diff --git a/20220428/hash-map-3.c b/20220428/hash-map-3.c
new file mode 100644
index 0000000000000000000000000000000000000000..bf0c603a0170e45aa422e5c2b1594da94de4b248
--- /dev/null
+++ b/20220428/hash-map-3.c
@@ -0,0 +1,49 @@
+#include <stdio.h>
+#include <string.h>
+
+int get_number (const char *name)  /* nicht mehr geschummelt, O(1), aber: */
+{                                  /*  - Speicher-ineffizient             */
+  static const int n[26] =         /*  - unvollständig: "sechs", "sieben" */
+    {                              /*  - unzuverlässig: "egon" = "eins"   */
+       8, /* a */
+      -1, /* b */
+      -1, /* c */
+       3, /* d */
+       1, /* e */
+       5, /* f */
+      -1, /* g */
+      -1, /* h */
+      -1, /* i */
+      -1, /* j */
+      -1, /* k */
+      -1, /* l */
+      -1, /* m */
+       0, /* n */
+      -1, /* o */
+      -1, /* p */
+      -1, /* q */
+      -1, /* r */
+       6, /* s */
+      -1, /* t */
+      -1, /* u */
+       4, /* v */
+      -1, /* w */
+      -1, /* x */
+      -1, /* y */
+       2  /* z */
+    };
+  int value = -1;
+  if (name && name[0] >= 'a' && name[0] <= 'z')
+    value = n[name[0] - 'a'];
+  return value;
+}
+
+int main (void)
+{
+  int eins = get_number ("egon");
+  int zwei = get_number ("zwei");
+  int drei = get_number ("drei");
+  int vier = get_number ("vier");
+  printf ("%d %d %d %d\n", eins, zwei, drei, vier);
+  return 0;
+}
diff --git a/20220428/hash-map-4.c b/20220428/hash-map-4.c
new file mode 100644
index 0000000000000000000000000000000000000000..f2f4ac79bc8b65ecb78314afd69dcd7a0be1dce6
--- /dev/null
+++ b/20220428/hash-map-4.c
@@ -0,0 +1,82 @@
+#include <stdio.h>
+#include <string.h>
+
+int get_number (const char *name)  /* nicht mehr geschummelt, O(1), aber: */
+{                                  /*  - Speicher-ineffizient             */
+  static const int n[26] =         /*  - unvollständig: "sechs", "sieben" */
+    {                              /* :) zuverlässig: "egon" != "eins"    */
+       8, /* a */
+      -1, /* b */
+      -1, /* c */
+       3, /* d */
+       1, /* e */
+       5, /* f */
+      -1, /* g */
+      -1, /* h */
+      -1, /* i */
+      -1, /* j */
+      -1, /* k */
+      -1, /* l */
+      -1, /* m */
+       0, /* n */
+      -1, /* o */
+      -1, /* p */
+      -1, /* q */
+      -1, /* r */
+       6, /* s */
+      -1, /* t */
+      -1, /* u */
+       4, /* v */
+      -1, /* w */
+      -1, /* x */
+      -1, /* y */
+       2  /* z */
+    };
+  static const char *check[26] =
+    {
+       "acht",
+       NULL, /* b */
+       NULL, /* c */
+       "drei",
+       "eins",
+       "fünf",
+       NULL, /* g */
+       NULL, /* h */
+       NULL, /* i */
+       NULL, /* j */
+       NULL, /* k */
+       NULL, /* l */
+       NULL, /* m */
+       "null",
+       NULL, /* o */
+       NULL, /* p */
+       NULL, /* q */
+       NULL, /* r */
+       "sechs",
+       NULL, /* t */
+       NULL, /* u */
+       "vier",
+       NULL, /* w */
+       NULL, /* x */
+       NULL, /* y */
+       "zwei"
+    };
+  int value = -1;
+  if (name && name[0] >= 'a' && name[0] <= 'z')
+    {
+      int i = name[0] - 'a';
+      if (!strcmp (name, check[i]))
+        value = n[i];
+    }
+  return value;
+}
+
+int main (void)
+{
+  int eins = get_number ("egon");
+  int zwei = get_number ("zwei");
+  int drei = get_number ("drei");
+  int vier = get_number ("vier");
+  printf ("%d %d %d %d\n", eins, zwei, drei, vier);
+  return 0;
+}
diff --git a/20220428/hash-map-5.c b/20220428/hash-map-5.c
new file mode 100644
index 0000000000000000000000000000000000000000..cc67f01626db2f109677f56a16c721be3ecb1653
--- /dev/null
+++ b/20220428/hash-map-5.c
@@ -0,0 +1,90 @@
+#include <stdio.h>
+#include <string.h>
+
+int get_number (const char *name)  /* nicht mehr geschummelt, O(1), aber:               */
+{                                  /*  - Speicher-ineffizient                           */
+  static const int n[26] =         /* :] vollständig: "sechs" != "sieben", aber unschön */
+    {                              /* :) zuverlässig: "egon" != "eins"                  */
+       8, /* a */
+      -1, /* b */
+      -1, /* c */
+       3, /* d */
+       1, /* e */
+       5, /* f */
+      -1, /* g */
+      -1, /* h */
+      -1, /* i */
+      -1, /* j */
+      -1, /* k */
+      -1, /* l */
+      -1, /* m */
+       0, /* n */
+      -1, /* o */
+      -1, /* p */
+      -1, /* q */
+      -1, /* r */
+       6, /* s */
+      -1, /* t */
+      -1, /* u */
+       4, /* v */
+      -1, /* w */
+      -1, /* x */
+      -1, /* y */
+       2  /* z */
+    };
+  static const char *check[26] =
+    {
+       "acht",
+       NULL, /* b */
+       NULL, /* c */
+       "drei",
+       "eins",
+       "fünf",
+       NULL, /* g */
+       NULL, /* h */
+       NULL, /* i */
+       NULL, /* j */
+       NULL, /* k */
+       NULL, /* l */
+       NULL, /* m */
+       "null",
+       NULL, /* o */
+       NULL, /* p */
+       NULL, /* q */
+       NULL, /* r */
+       "sechs",
+       NULL, /* t */
+       NULL, /* u */
+       "vier",
+       NULL, /* w */
+       NULL, /* x */
+       NULL, /* y */
+       "zwei"
+    };
+  int value = -1;
+  if (name && name[0] >= 'a' && name[0] <= 'z')
+    {
+      if (name[0] == 's' && !strcmp (name, "sieben"))
+        value = 7;
+      else
+        {
+          int i = name[0] - 'a';
+          if (!strcmp (name, check[i]))
+            value = n[i];
+        }
+    }
+  return value;
+}
+
+int main (void)
+{
+  int eins = get_number ("eins");
+  int zwei = get_number ("zwei");
+  int drei = get_number ("drei");
+  int vier = get_number ("vier");
+  int fuenf = get_number ("fünf");
+  int sechs = get_number ("sechs");
+  int sieben = get_number ("sieben");
+  printf ("%d %d %d %d %d %d %d\n", eins, zwei, drei, vier, fuenf, sechs, sieben);
+  return 0;
+}
diff --git a/20220428/hash-map-6.c b/20220428/hash-map-6.c
new file mode 100644
index 0000000000000000000000000000000000000000..64a725c75ad13dad5c516657dbe5e1c77a1d0099
--- /dev/null
+++ b/20220428/hash-map-6.c
@@ -0,0 +1,46 @@
+#include <stdio.h>
+#include <string.h>
+
+int n[65536];  /* zunächst: alle 0 */
+const char *check[65536];  /* zunächst: alle NULL */
+
+void put_number (const char *name, int value)
+{
+  /* Nimm die ersten 2 Zeichen des Strings,
+   * berechne daraus einen Array-Index von 0 bis 65535.
+   * Dort hinterlege die Zahl "value" im Array.
+   */
+}
+
+int get_number (const char *name)  /* nicht mehr geschummelt, O(1), aber:               */
+{                                  /*  - Speicher-ineffizient                           */
+  int value = -1;
+  /* Nimm die ersten 2 Zeichen des Strings,
+   * berechne daraus einen Array-Index von 0 bis 65535.
+   * Dort entnimm die Zahl "value".
+   */
+  return value;
+}
+
+int main (void)
+{
+  put_number ("eins", 1);
+  put_number ("zwei", 2);
+  put_number ("drei", 3);
+  put_number ("vier", 4);
+  put_number ("fünf", 5);
+  put_number ("sechs", 6);
+  put_number ("sieben", 7);
+  put_number ("acht", 8);
+  put_number ("neun", 9);
+  put_number ("zehn", 10);
+  int eins = get_number ("eins");
+  int zwei = get_number ("zwei");
+  int drei = get_number ("drei");
+  int vier = get_number ("vier");
+  int fuenf = get_number ("fünf");
+  int sechs = get_number ("sechs");
+  int sieben = get_number ("sieben");
+  printf ("%d %d %d %d %d %d %d\n", eins, zwei, drei, vier, fuenf, sechs, sieben);
+  return 0;
+}