pseudoword.py
author Eugen Sawin <sawine@me73.com>
Mon, 20 Feb 2012 15:10:53 +0100
changeset 0 a2f88c3bd824
child 1 962dd7efaa05
permissions -rw-r--r--
Initial.
sawine@0
     1
import shelve
sawine@0
     2
import random
sawine@0
     3
sawine@0
     4
sawine@0
     5
def main():
sawine@0
     6
    return seed(10000, 13)
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()