[first + i for i in perms(others)]to prepend the character that we initially picked off onto each string in the list.
permutations.py
#!/usr/bin/env python
import sys
def substring(s, i):
if i == (len(s) - 1):
return s[:i]
elif i == 0:
return s[1:]
else:
return s[0:i] + s[i+1:]
def perm(s):
p = []
length = len(s)
if length <= 1:
p.append(s)
else:
for i in range(length):
first = s[i]
others = substring(s, i)
p.extend([first + i for i in perm(others)])
return p
if __name__ == '__main__':
if len(sys.argv) != 2:
print('usage: %s word' % sys.argv[0])
sys.exit(1)
perms = perm(sys.argv[1])
for i in perms:
print(i)
sys.exit(0)
Let's try out the script by having it display all permutations of the string 'one'.
$ ./permutations.py one one oen noe neo eon eno
Now all we have to do to solve jumble is loop over each string in the output and see if that string appears in a dictionary. To do this, we'll write a short Bash script that greps for each word against a dictionary file. On my computer a flat text dictionary is located at /usr/share/dict/words. Feel free to change the assignment of the variable DICT to some other dictionary file that is found on your machine.
jumble.sh
#!/bin/bash
DICT=/usr/share/dict/words
if [ $# -ne 1 ]; then
echo "usage: $0 jumble-word"
exit 1
fi
cnt=1
for i in `./permutations.py $1`; do
grep -q "^$i$" $DICT
if [ $? -eq 0 ]; then
printf "%6d: %s ... [YES]\n" "$cnt" "$i"
exit 0
fi
printf "%6d: %s ... [NO]\n" "$cnt" "$i"
let cnt=cnt+1
done
exit 1
Let's try out our program on an example taken from jumble.com.
$ ./jumble.sh tecot
1: tecot ... [NO]
2: tecto ... [NO]
3: teoct ... [NO]
4: teotc ... [NO]
5: tetco ... [NO]
6: tetoc ... [NO]
7: tceot ... [NO]
8: tceto ... [NO]
9: tcoet ... [NO]
10: tcote ... [NO]
11: tcteo ... [NO]
12: tctoe ... [NO]
13: toect ... [NO]
14: toetc ... [NO]
15: tocet ... [NO]
16: tocte ... [NO]
17: totec ... [NO]
18: totce ... [NO]
19: tteco ... [NO]
20: tteoc ... [NO]
21: ttceo ... [NO]
22: ttcoe ... [NO]
23: ttoec ... [NO]
24: ttoce ... [NO]
25: etcot ... [NO]
26: etcto ... [NO]
27: etoct ... [NO]
28: etotc ... [NO]
29: ettco ... [NO]
30: ettoc ... [NO]
31: ectot ... [NO]
32: ectto ... [NO]
33: ecott ... [NO]
34: ecott ... [NO]
35: ectto ... [NO]
36: ectot ... [NO]
37: eotct ... [NO]
38: eottc ... [NO]
39: eoctt ... [NO]
40: eoctt ... [NO]
41: eottc ... [NO]
42: eotct ... [NO]
43: ettco ... [NO]
44: ettoc ... [NO]
45: etcto ... [NO]
46: etcot ... [NO]
47: etotc ... [NO]
48: etoct ... [NO]
49: cteot ... [NO]
50: cteto ... [NO]
51: ctoet ... [NO]
52: ctote ... [NO]
53: ctteo ... [NO]
54: cttoe ... [NO]
55: cetot ... [NO]
56: cetto ... [NO]
57: ceott ... [NO]
58: ceott ... [NO]
59: cetto ... [NO]
60: cetot ... [NO]
61: cotet ... [NO]
62: cotte ... [YES]
No comments:
Post a Comment