-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbuffalo.py
More file actions
109 lines (85 loc) · 2.24 KB
/
buffalo.py
File metadata and controls
109 lines (85 loc) · 2.24 KB
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
"""
A novel about bison that bother.
"""
from argparse import ArgumentParser
from random import sample
WORDS = {
'action': ('buffalo', 'bother'),
'animal': ('buffalo', 'bison'),
'city': ('Buffalo', 'Buffalo'),
}
SENTENCE_FORMS = {
('subject',),
('verb',),
('object',),
('subject', 'verb'),
('verb', 'object'),
('subject', 'verb', 'object')
}
COMPONENTS = {
'subject': {
('animal',),
('city', 'animal'),
('subject', 'subject', 'verb'),
},
'verb': {
('action',)
},
'object': {
('animal',),
('city',),
('city', 'animal'),
('subject',),
}
}
PUNCTUATION = {
(('.', False),),
(('!', False),),
(('?', False), ('.', True)),
(('?', False), ('!', True)),
(('?', False), ('.', True), ('!', False)),
}
def capitalize(word):
"""
Capitalize a word
"""
return '{}{}'.format(word[0:1].upper(), word[1:])
def generate(expected, synonoms=False):
sentences = []
length = 0
while length < expected:
words = []
parts = list(reversed(sample(SENTENCE_FORMS, 1)[0]))
while parts:
part = parts.pop()
if part in WORDS:
options = WORDS[part]
words.append(options)
else:
parts.extend(reversed(sample(COMPONENTS[part], 1)[0]))
for punctuation, use_synonyms in sample(PUNCTUATION, 1)[0]:
length += len(words)
index = synonoms and use_synonyms
sentences.append(
'{}{}'.format(
capitalize(
' '.join(options[index] for options in words)
),
punctuation
)
)
return ' '.join(sentences)
def main():
parser = ArgumentParser(description="Write a story about bison.")
parser.add_argument(
'--length', '-l', default=50000, type=int,
help="Minimum length of the story."
)
parser.add_argument(
'--allow-synonyms', '-s', action='store_true',
help="Allow synonyms for buffalo?"
)
args = parser.parse_args()
print(generate(args.length, args.allow_synonyms))
if __name__ == '__main__':
main()