sawine@0
|
1 |
import shelve
|
sawine@0
|
2 |
import random
|
sawine@0
|
3 |
|
sawine@0
|
4 |
|
sawine@0
|
5 |
def main():
|
sawine@1
|
6 |
return seed(10000, 12)
|
sawine@0
|
7 |
db = Database('data/names')
|
sawine@0
|
8 |
k = 0.1
|
sawine@0
|
9 |
while True:
|
sawine@0
|
10 |
w1, w2 = db.pick_words()
|
sawine@0
|
11 |
uc = (input('\n(a) {0} vs (d) {1} ? '.format(w1[0], w2[0])))
|
sawine@0
|
12 |
assert uc in {'a', 'd', 's', 'q'}
|
sawine@0
|
13 |
if uc == 'q':
|
sawine@0
|
14 |
break
|
sawine@0
|
15 |
elif uc == 's':
|
sawine@0
|
16 |
continue
|
sawine@0
|
17 |
uc = 0 if uc == 'a' else 1
|
sawine@0
|
18 |
ratio = k * 1.0 / (1 + (abs(w1[1] - w2[1])))
|
sawine@0
|
19 |
# print(ratio)
|
sawine@0
|
20 |
db[w1[0]] = w1[1] + (-1)**(uc) * ratio
|
sawine@0
|
21 |
db[w2[0]] = w2[1] + (-1)**(1 - uc) * ratio
|
sawine@0
|
22 |
print('{0} vs {1}'.format(db[w1[0]], db[w2[0]]))
|
sawine@0
|
23 |
print(cross(w1[0], w2[0]))
|
sawine@0
|
24 |
print(cross(w1[0], w2[0]))
|
sawine@0
|
25 |
print(cross(w1[0], w2[0]))
|
sawine@0
|
26 |
print(cross(w1[0], w2[0]))
|
sawine@0
|
27 |
print(cross(w1[0], w2[0]))
|
sawine@0
|
28 |
print(cross(w1[0], w2[0]))
|
sawine@0
|
29 |
|
sawine@0
|
30 |
|
sawine@0
|
31 |
class Database:
|
sawine@0
|
32 |
|
sawine@0
|
33 |
def __init__(self, name):
|
sawine@0
|
34 |
self.db = shelve.open(name, 'c')
|
sawine@0
|
35 |
|
sawine@0
|
36 |
def pick_words(self):
|
sawine@0
|
37 |
words = list(self.db.items())
|
sawine@0
|
38 |
w1 = random.choice(words)
|
sawine@0
|
39 |
w2 = random.choice(words)
|
sawine@0
|
40 |
while w1 == w2:
|
sawine@0
|
41 |
w2 = random.choice(words)
|
sawine@0
|
42 |
return w1, w2
|
sawine@0
|
43 |
|
sawine@0
|
44 |
def rate(self, better, worse):
|
sawine@0
|
45 |
better = [better, self.db[better]] if type(better) not in {tuple, list} else better
|
sawine@0
|
46 |
worse = [worse, self.db[worse]] if type(worse) not in {tuple, list} else worse
|
sawine@0
|
47 |
k = 0.1
|
sawine@0
|
48 |
ratio = k * 1.0 / (1 + (abs(better[1] - worse[1])))
|
sawine@0
|
49 |
better_rating = better[1] + ratio
|
sawine@0
|
50 |
worse_rating = worse[1] - ratio
|
sawine@0
|
51 |
self.db[better[0]] = better_rating
|
sawine@0
|
52 |
self.db[worse[0]] = worse_rating
|
sawine@0
|
53 |
return [[better[0], better_rating], [worse[0], worse_rating]]
|
sawine@0
|
54 |
|
sawine@0
|
55 |
|
sawine@0
|
56 |
def seed(num, maxlen):
|
sawine@0
|
57 |
db = shelve.open('data/names', 'c')
|
sawine@0
|
58 |
db.clear()
|
sawine@0
|
59 |
for i in range(num):
|
sawine@0
|
60 |
db[randword(random.randint(2, maxlen))] = 0.0
|
sawine@0
|
61 |
|
sawine@0
|
62 |
|
sawine@0
|
63 |
def cross(t1, t2):
|
sawine@0
|
64 |
return randword(random.randint(min(len(t1), len(t2)),
|
sawine@0
|
65 |
int((len(t1) + len(t2)) / 2 + 0.5)),
|
sawine@0
|
66 |
#[c for c in set([ord(t) for t in t1 + t2])])
|
sawine@0
|
67 |
[ord(t) for t in t1 + t2])
|
sawine@0
|
68 |
|
sawine@0
|
69 |
|
sawine@0
|
70 |
char_values = list(range(ord('a'), ord('z') + 1))\
|
sawine@0
|
71 |
# + list(range(ord('A'), ord('Z') + 1))
|
sawine@0
|
72 |
|
sawine@0
|
73 |
vowels = frozenset([ord('a'), ord('e'), ord('h'), ord('i'), ord('o'), ord('y'),\
|
sawine@0
|
74 |
ord('u')])
|
sawine@0
|
75 |
|
sawine@0
|
76 |
def randword(size, chars=char_values):
|
sawine@0
|
77 |
|
sawine@0
|
78 |
def filter(w):
|
sawine@0
|
79 |
|
sawine@0
|
80 |
def is_vowel(c):
|
sawine@0
|
81 |
return c in vowels
|
sawine@0
|
82 |
|
sawine@0
|
83 |
assert len(w)
|
sawine@0
|
84 |
max_seq = 2
|
sawine@0
|
85 |
count = 0
|
sawine@0
|
86 |
last = is_vowel(w[0])
|
sawine@0
|
87 |
for o in w[1:]:
|
sawine@0
|
88 |
now = is_vowel(o)
|
sawine@0
|
89 |
count += int(last == now)
|
sawine@0
|
90 |
if count >= max_seq:
|
sawine@0
|
91 |
return False
|
sawine@0
|
92 |
last = now
|
sawine@0
|
93 |
return True
|
sawine@0
|
94 |
|
sawine@0
|
95 |
def gen():
|
sawine@0
|
96 |
return [random.choice(chars) for i in range(size)]
|
sawine@0
|
97 |
|
sawine@0
|
98 |
ordw = gen()
|
sawine@0
|
99 |
while not filter(ordw):
|
sawine@0
|
100 |
ordw = gen()
|
sawine@0
|
101 |
return ''.join([chr(c) for c in ordw])
|
sawine@0
|
102 |
|
sawine@0
|
103 |
|
sawine@0
|
104 |
if __name__ == '__main__':
|
sawine@0
|
105 |
main()
|