sawine@0: import shelve sawine@0: import random sawine@0: sawine@0: sawine@0: def main(): sawine@0: return seed(10000, 13) sawine@0: db = Database('data/names') sawine@0: k = 0.1 sawine@0: while True: sawine@0: w1, w2 = db.pick_words() sawine@0: uc = (input('\n(a) {0} vs (d) {1} ? '.format(w1[0], w2[0]))) sawine@0: assert uc in {'a', 'd', 's', 'q'} sawine@0: if uc == 'q': sawine@0: break sawine@0: elif uc == 's': sawine@0: continue sawine@0: uc = 0 if uc == 'a' else 1 sawine@0: ratio = k * 1.0 / (1 + (abs(w1[1] - w2[1]))) sawine@0: # print(ratio) sawine@0: db[w1[0]] = w1[1] + (-1)**(uc) * ratio sawine@0: db[w2[0]] = w2[1] + (-1)**(1 - uc) * ratio sawine@0: print('{0} vs {1}'.format(db[w1[0]], db[w2[0]])) sawine@0: print(cross(w1[0], w2[0])) sawine@0: print(cross(w1[0], w2[0])) sawine@0: print(cross(w1[0], w2[0])) sawine@0: print(cross(w1[0], w2[0])) sawine@0: print(cross(w1[0], w2[0])) sawine@0: print(cross(w1[0], w2[0])) sawine@0: sawine@0: sawine@0: class Database: sawine@0: sawine@0: def __init__(self, name): sawine@0: self.db = shelve.open(name, 'c') sawine@0: sawine@0: def pick_words(self): sawine@0: words = list(self.db.items()) sawine@0: w1 = random.choice(words) sawine@0: w2 = random.choice(words) sawine@0: while w1 == w2: sawine@0: w2 = random.choice(words) sawine@0: return w1, w2 sawine@0: sawine@0: def rate(self, better, worse): sawine@0: better = [better, self.db[better]] if type(better) not in {tuple, list} else better sawine@0: worse = [worse, self.db[worse]] if type(worse) not in {tuple, list} else worse sawine@0: k = 0.1 sawine@0: ratio = k * 1.0 / (1 + (abs(better[1] - worse[1]))) sawine@0: better_rating = better[1] + ratio sawine@0: worse_rating = worse[1] - ratio sawine@0: self.db[better[0]] = better_rating sawine@0: self.db[worse[0]] = worse_rating sawine@0: return [[better[0], better_rating], [worse[0], worse_rating]] sawine@0: sawine@0: sawine@0: def seed(num, maxlen): sawine@0: db = shelve.open('data/names', 'c') sawine@0: db.clear() sawine@0: for i in range(num): sawine@0: db[randword(random.randint(2, maxlen))] = 0.0 sawine@0: sawine@0: sawine@0: def cross(t1, t2): sawine@0: return randword(random.randint(min(len(t1), len(t2)), sawine@0: int((len(t1) + len(t2)) / 2 + 0.5)), sawine@0: #[c for c in set([ord(t) for t in t1 + t2])]) sawine@0: [ord(t) for t in t1 + t2]) sawine@0: sawine@0: sawine@0: char_values = list(range(ord('a'), ord('z') + 1))\ sawine@0: # + list(range(ord('A'), ord('Z') + 1)) sawine@0: sawine@0: vowels = frozenset([ord('a'), ord('e'), ord('h'), ord('i'), ord('o'), ord('y'),\ sawine@0: ord('u')]) sawine@0: sawine@0: def randword(size, chars=char_values): sawine@0: sawine@0: def filter(w): sawine@0: sawine@0: def is_vowel(c): sawine@0: return c in vowels sawine@0: sawine@0: assert len(w) sawine@0: max_seq = 2 sawine@0: count = 0 sawine@0: last = is_vowel(w[0]) sawine@0: for o in w[1:]: sawine@0: now = is_vowel(o) sawine@0: count += int(last == now) sawine@0: if count >= max_seq: sawine@0: return False sawine@0: last = now sawine@0: return True sawine@0: sawine@0: def gen(): sawine@0: return [random.choice(chars) for i in range(size)] sawine@0: sawine@0: ordw = gen() sawine@0: while not filter(ordw): sawine@0: ordw = gen() sawine@0: return ''.join([chr(c) for c in ordw]) sawine@0: sawine@0: sawine@0: if __name__ == '__main__': sawine@0: main()