about summary refs log tree commit diff
path: root/zanagrams
diff options
context:
space:
mode:
authorZach DeCook <zach.decook@bettercarpeople.com>2026-08-17 08:25:23 -0400
committerZach DeCook <zach.decook@bettercarpeople.com>2026-08-17 08:25:23 -0400
commitc17744a5e900f5a2198d6a5a782c4dfd9c4ec98e (patch)
tree4dcbf70c23945152c554b11f24bbad4c88faaf07 /zanagrams
parent958665b368ca1534ff9db0dcbf5c704a614ae23e (diff)
downloadgurglesolver-c17744a5e900f5a2198d6a5a782c4dfd9c4ec98e.tar.gz
Add zanagrams solver zanagrams
Diffstat (limited to 'zanagrams')
-rwxr-xr-xzanagrams/nearletters.py46
-rwxr-xr-xzanagrams/onceletters.py27
-rwxr-xr-xzanagrams/zanagrams.sh14
3 files changed, 87 insertions, 0 deletions
diff --git a/zanagrams/nearletters.py b/zanagrams/nearletters.py
new file mode 100755
index 0000000..e592e18
--- /dev/null
+++ b/zanagrams/nearletters.py
@@ -0,0 +1,46 @@
+#!/usr/bin/env python3
+import sys
+
+def main(argv):
+    badpairs = set()
+    goodpairs = set()
+    letters = argv[1].strip()
+    #print(letters, file=sys.stderr)
+    #print(len(letters), file=sys.stderr)
+    if len(letters) == 16:
+        for x in range(0,16):    
+            l = letters[x]
+            for y in [[1,4,5], [1,3,4,5], [1,3,4,5], [3,4]][x%4]:
+                if x+y > 15:
+                    continue
+                l2 = letters[x+y]
+                goodpairs.add(l + l2)
+                goodpairs.add(l2 + l)
+
+        for x in range(0,16):
+            l = letters[x]
+            for x2 in range(x,16):
+                l2 = letters[x2]
+                if not (l + l2) in goodpairs:
+                    badpairs.add(l + l2)
+                if not (l2 + l) in goodpairs:
+                    badpairs.add(l2 + l)
+
+    print(goodpairs, file=sys.stderr)
+    print(badpairs, file=sys.stderr)
+    while 1:
+        line = sys.stdin.readline()
+        line = line.strip()
+        if not line:
+            break;
+        noprint = False
+        line2 = line.casefold()
+        for pair in badpairs:
+            if pair in line2:
+                noprint = True
+                break
+        if line and not noprint:
+            print(line, end='\n')
+
+if __name__ == '__main__':
+    main(sys.argv)
diff --git a/zanagrams/onceletters.py b/zanagrams/onceletters.py
new file mode 100755
index 0000000..ede75db
--- /dev/null
+++ b/zanagrams/onceletters.py
@@ -0,0 +1,27 @@
+#!/usr/bin/env python3
+import sys
+
+def main(argv):
+  #print(argv[2], file=sys.stderr)
+  allowed_times = int(argv[2]) if len(argv) > 2 else 1
+  #print(allowed_times, file=sys.stderr)
+  while 1:
+    letters_counts = {}
+    line = sys.stdin.readline()
+    noprint = False
+    if not line:
+        break;
+    for c in line:
+      #print(c)
+      c = c.casefold()
+      letters_counts[c] = letters_counts.get(c, 0) + 1
+      if letters_counts[c] > allowed_times and c in argv[1]:
+        #print('oops')
+        noprint = True
+        break
+    if line and not noprint:
+      print(line, end='')
+
+if __name__ == '__main__':
+  main(sys.argv)
+
diff --git a/zanagrams/zanagrams.sh b/zanagrams/zanagrams.sh
new file mode 100755
index 0000000..52f82db
--- /dev/null
+++ b/zanagrams/zanagrams.sh
@@ -0,0 +1,14 @@
+#!/bin/sh
+letters="$1"
+dots="$(printf "%s" "$letters" | tr '.[:alpha:]' '.')."
+# TODO: Don't allow repeats unless they actually repeat
+
+letters_used_once="$(printf "%s" "$letters" | sed 's/./\0\n/g' | sort | uniq -c | grep ' 1 '| grep -o '[a-z]$' | tr -d '\n')"
+letters_used_twice="$(printf "%s" "$letters" | sed 's/./\0\n/g' | sort | uniq -c | grep ' 2 '| grep -o '[a-z]$' | tr -d '\n')"
+
+lengthsort() {
+    awk '{ print length, $0 }' | sort -n | awk '{$1=""; print $2}'
+}
+
+# cafe is in the dictionary with an accent
+cat /etc/dictionaries-common/words | sed 's/é/e/g' | grep -i '^['"$letters"']*$' | grep -v "$dots" | grep .... | onceletters.py "$letters_used_once" | onceletters.py "$letters_used_twice" 2 | nearletters.py "$letters" | lengthsort