diff options
| author | Zach DeCook <zach.decook@bettercarpeople.com> | 2026-08-17 08:25:23 -0400 |
|---|---|---|
| committer | Zach DeCook <zach.decook@bettercarpeople.com> | 2026-08-17 08:25:23 -0400 |
| commit | c17744a5e900f5a2198d6a5a782c4dfd9c4ec98e (patch) | |
| tree | 4dcbf70c23945152c554b11f24bbad4c88faaf07 /zanagrams | |
| parent | 958665b368ca1534ff9db0dcbf5c704a614ae23e (diff) | |
| download | gurglesolver-c17744a5e900f5a2198d6a5a782c4dfd9c4ec98e.tar.gz | |
Add zanagrams solver zanagrams
Diffstat (limited to 'zanagrams')
| -rwxr-xr-x | zanagrams/nearletters.py | 46 | ||||
| -rwxr-xr-x | zanagrams/onceletters.py | 27 | ||||
| -rwxr-xr-x | zanagrams/zanagrams.sh | 14 |
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 |
