aboutsummaryrefslogtreecommitdiffstats
path: root/csci1913/Python/project1_strap012.py
blob: 6cf6361a60f4bef2c74b32f6cf688f4f0dd61cf9 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
class Random:    
    def __init__(self, seed):
        self.sevenFive = 16807
        self.twoThirtyone = 2147483647
        self.newNum = seed

    def next(self):
        self.newNum = self.sevenFive*self.newNum % self.twoThirtyone
        return self.newNum

    def choose(self, limit):
        return self.next()%limit



class Rule:
    def __init__(self, left, right):
        self.left = left
        self.right = right
        self.count = 1

    def __repr__(self):
        string = str(self.count)
        string += " "
        string += str(self.left)
        string += " -> "
        for n in range (0, len(self.right)):
            string += self.right[n]
            string += " "
        return string



class Grammar:
    def __init__(self, seed):
        self.r = Random(seed)
        self.dictionary = {}

    def rule(self, left, right):
        if left not in self.dictionary:
            self.dictionary[left] = (Rule(left,right),)
        else:
            self.dictionary[left] += (Rule(left, right),)

    def generate(self):
        if 'Start' in self.dictionary:
           return self.generating(('Start',))
        else:
            raise RuntimeError

    def select(self, left):
        rules = self.dictionary[left]
        total = 0
        c = 0
        #Some of the loops are probably not needed
        for m in range (0, len(rules)):
            total += rules[m].count
        index = self.r.choose(total)
        for c in range (0, len(rules)):
            index -= rules[c].count
            if index <= 0:
                break
        chosen = rules[c]
        for n in range (0, len(rules)):
            if rules[n] is not chosen:
                rules[n].count += 1
        return chosen.right

    def generating(self,strings):
        result=''
        for n in range (0, len(strings)):
            if strings[n] not in self.dictionary:
                result += strings[n]
                result += " "
            else:
                result += self.generating(self.select(strings[n]))
        return result




G = Grammar(101)
G.rule('Noun',   ('cat',))  # 01
G.rule('Noun',   ('boy',))  # 02
G.rule('Noun',   ('dog',))  # 03
G.rule('Noun',   ('girl',))  # 04
G.rule('Verb',   ('bit',))  # 05
G.rule('Verb',   ('chased',))  # 06
G.rule('Verb',   ('kissed',))  # 07
G.rule('Phrase', ('the', 'Noun', 'Verb', 'the', 'Noun'))  # 08
G.rule('Story',  ('Phrase',))  # 09
G.rule('Story',  ('Phrase', 'and', 'Story'))  # 10
G.rule('Story',  ('Phrase', 'but', 'Story'))  # 11
G.rule('Start',  ('Story', '.'))  # 12
for n in range (0, 5):
    print(G.generate())

# the cat bit the boy .
# the cat kissed the dog and the boy chased the boy .
# the cat chased the dog and the girl bit the boy but the girl chased the cat .
# the girl chased the dog .
# the boy kissed the girl and the cat kissed the girl .

print()
print()

# 
# 

J = Grammar(1453)
J.rule('Noun',   ('sentence',))
J.rule('Noun',   ('walrus',))
J.rule('Noun',   ('sky',))
J.rule('Noun',   ('diamond',))
J.rule('Noun',   ('Ottoman Empire',))
J.rule('Verb',   ('is',))
J.rule('Verb',   ('fanned',))
J.rule('Verb',   ('generated',))
J.rule('Verb',   ('hit',))
J.rule('Phrase', ('the', 'Noun', 'Verb', 'the', 'Noun'))  # 08
J.rule('Phrase', ('Noun', 'Verb', 'the', 'Noun'))
J.rule('Story',  ('Phrase',))  # 09
J.rule('Story',  ('Phrase', 'and', 'Story'))  # 10
J.rule('Story',  ('Phrase', 'but', 'Story'))  # 11
J.rule('Start',  ('Story', '.'))  # 12

for f in range(0, 5):
    print(J.generate())

# the walrus is the sentence and the diamond generated the walrus .
# the walrus generated the walrus and the walrus generated the sentence but diamond hit the sentence .
# sentence fanned the Ottoman Empire .
# the sky hit the diamond and sky is the sentence but the sky fanned the diamond .
# the walrus generated the diamond and the diamond generated the Ottoman Empire but the sky generated the sentence .