story-gen 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +259 -0
- data/bin/story +82 -0
- data/gem.gemspec +13 -0
- data/lib/any.rb +11 -0
- data/lib/array/case_equal_fixed.rb +9 -0
- data/lib/array/chomp.rb +21 -0
- data/lib/array/separate.rb +10 -0
- data/lib/array/to_h.rb +9 -0
- data/lib/code.rb +123 -0
- data/lib/enumerable/empty.rb +10 -0
- data/lib/enumerable/lazy.rb +10 -0
- data/lib/enumerable/new.rb +30 -0
- data/lib/enumerable/sample.rb +8 -0
- data/lib/fact.rb +333 -0
- data/lib/hash/put.rb +14 -0
- data/lib/object/map_.rb +9 -0
- data/lib/object/to_rb.rb +9 -0
- data/lib/parse.rb +463 -0
- data/lib/story.rb +89 -0
- data/lib/story/compile.rb +926 -0
- data/lib/string/lchomp.rb +14 -0
- data/lib/string/ru_downcase.rb +21 -0
- data/lib/strscan/substr.rb +16 -0
- data/lib/unique_names.rb +269 -0
- data/sample/fight_club.sdl +58 -0
- data/sample/university.sdl +53 -0
- data/sample//320/261/320/276/320/271/321/206/320/276/320/262/321/201/320/272/320/270/320/271_/320/272/320/273/321/203/320/261.sdl +58 -0
- data/sample//321/203/320/275/320/270/320/262/320/265/321/200/321/201/320/270/321/202/320/265/321/202.sdl +54 -0
- metadata +75 -0
@@ -0,0 +1,14 @@
|
|
1
|
+
|
2
|
+
class String
|
3
|
+
|
4
|
+
# @param [String] prefix
|
5
|
+
# @return [String] this {String} without +prefix+ or just this {String}
|
6
|
+
# if it does not have +prefix+.
|
7
|
+
def lchomp(prefix)
|
8
|
+
if self.start_with? prefix
|
9
|
+
then self[prefix.size..-1]
|
10
|
+
else self
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
class String
|
4
|
+
|
5
|
+
# The same as {String#downcase!} but considers Russian alphabet as well.
|
6
|
+
#
|
7
|
+
# @return [String]
|
8
|
+
#
|
9
|
+
def ru_downcase!
|
10
|
+
self.tr! "A-ZА-ЯЁ", "a-zа-яё"
|
11
|
+
end
|
12
|
+
|
13
|
+
# The same as {String#downcase} but considers Russian alphabet as well.
|
14
|
+
#
|
15
|
+
# @return [String]
|
16
|
+
#
|
17
|
+
def ru_downcase
|
18
|
+
self.tr "A-ZА-ЯЁ", "a-zа-яё"
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
|
2
|
+
class StringScanner
|
3
|
+
|
4
|
+
# @param [Integer] start some value of {StringScanner#pos}.
|
5
|
+
# @param [Integer] end_ some value of {StringScanner#pos}.
|
6
|
+
# @return [String]
|
7
|
+
def substr(start, end_)
|
8
|
+
old_pos = self.pos
|
9
|
+
self.pos = start
|
10
|
+
result = peek(end_ - start)
|
11
|
+
self.pos = old_pos
|
12
|
+
return result
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
data/lib/unique_names.rb
ADDED
@@ -0,0 +1,269 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
# Infinite array of unique names.
|
4
|
+
class UniqueNames
|
5
|
+
|
6
|
+
# @param [Array<String>] base_names base names which will be used to
|
7
|
+
# generate the {UniqueNames}.
|
8
|
+
def initialize(base_names)
|
9
|
+
@base_names = base_names
|
10
|
+
@postfix_id = 0
|
11
|
+
reinit_current_names
|
12
|
+
end
|
13
|
+
|
14
|
+
# @return [UniqueNames]
|
15
|
+
def self.russian_male
|
16
|
+
UniqueNames.new %W{
|
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
|
+
end
|
117
|
+
|
118
|
+
# @return [UniqueNames]
|
119
|
+
def self.russian_female
|
120
|
+
UniqueNames.new %W{
|
121
|
+
Агата
|
122
|
+
Ада
|
123
|
+
Адель
|
124
|
+
Адриана
|
125
|
+
Алевтина
|
126
|
+
Александра
|
127
|
+
Алина
|
128
|
+
Алиса
|
129
|
+
Алла
|
130
|
+
Альбина
|
131
|
+
Анастасия
|
132
|
+
Ангелина
|
133
|
+
Анжела
|
134
|
+
Анна
|
135
|
+
Антонина
|
136
|
+
Анфиса
|
137
|
+
Арина
|
138
|
+
|
139
|
+
Богдана
|
140
|
+
Борислава
|
141
|
+
|
142
|
+
Валентина
|
143
|
+
Валерия
|
144
|
+
Варвара
|
145
|
+
Василиса
|
146
|
+
Вера
|
147
|
+
Вероника
|
148
|
+
Виктория
|
149
|
+
Виолетта
|
150
|
+
|
151
|
+
Галина
|
152
|
+
|
153
|
+
Дарья
|
154
|
+
Диана
|
155
|
+
|
156
|
+
Ева
|
157
|
+
Евгения
|
158
|
+
Екатерина
|
159
|
+
Елена
|
160
|
+
Елизавета
|
161
|
+
|
162
|
+
Жанна
|
163
|
+
|
164
|
+
Зинаида
|
165
|
+
Зоя
|
166
|
+
|
167
|
+
Илона
|
168
|
+
Инга
|
169
|
+
Инесса
|
170
|
+
Инна
|
171
|
+
Ирина
|
172
|
+
|
173
|
+
Карина
|
174
|
+
Кира
|
175
|
+
Клавдия
|
176
|
+
Клара
|
177
|
+
Кристина
|
178
|
+
Ксения
|
179
|
+
|
180
|
+
Лариса
|
181
|
+
Лидия
|
182
|
+
Лилия
|
183
|
+
Любовь
|
184
|
+
Людмила
|
185
|
+
|
186
|
+
Майя
|
187
|
+
Маргарита
|
188
|
+
Марина
|
189
|
+
Мария
|
190
|
+
Марта
|
191
|
+
Марьяна
|
192
|
+
Мирослава
|
193
|
+
|
194
|
+
Надежда
|
195
|
+
Наталья
|
196
|
+
Нелли
|
197
|
+
Нина
|
198
|
+
|
199
|
+
Оксана
|
200
|
+
Ольга
|
201
|
+
|
202
|
+
Полина
|
203
|
+
|
204
|
+
Раиса
|
205
|
+
Регина
|
206
|
+
Римма
|
207
|
+
Роза
|
208
|
+
Роксана
|
209
|
+
Руслана
|
210
|
+
|
211
|
+
Светлана
|
212
|
+
Снежана
|
213
|
+
София
|
214
|
+
|
215
|
+
Таисия
|
216
|
+
Тамара
|
217
|
+
Татьяна
|
218
|
+
|
219
|
+
Ульяна
|
220
|
+
|
221
|
+
Христина
|
222
|
+
|
223
|
+
Эвелина
|
224
|
+
Элеонора
|
225
|
+
Эльвира
|
226
|
+
Эмма
|
227
|
+
|
228
|
+
Юлиана
|
229
|
+
Юлия
|
230
|
+
|
231
|
+
Яна
|
232
|
+
Ярослава
|
233
|
+
}
|
234
|
+
end
|
235
|
+
|
236
|
+
# @return [UniqueNames]
|
237
|
+
def self.english_male
|
238
|
+
UniqueNames.new ["Jack", "Thomas", "Joshua", "Oliver", "Harry", "James", "Charlie", "William", "Daniel", "Samuel", "Alfie", "Benjamin", "Joseph", "George", "Callum", "Jake", "Ethan", "Lewis", "Luke", "Mohammed", "Matthew", "Dylan", "Jacob", "Alexander", "Ryan", "Adam", "Tyler", "Harvey", "Liam", "Max", "Cameron", "Harrison", "Jamie", "Jayden", "Leo", "Owen", "Henry", "Connor", "Archie", "Nathan", "Ben", "Muhammad", "Oscar", "Edward", "Lucas", "Michael", "Isaac", "Aaron", "Kyle", "Noah", "Finley", "Rhys", "Bradley", "Charles", "Toby", "Louis", "Brandon", "Logan", "Mason", "Reece", "Kieran", "Alex", "Riley", "Finlay", "Kai", "Freddie", "David", "Harley", "Kian", "Mohammad", "Bailey", "Sam", "Luca", "Joel", "Theo", "Leon", "John", "Robert", "Ashton", "Ellis", "Joe", "Aidan", "Billy", "Corey", "Hayden", "Evan", "Zachary", "Taylor", "Christopher", "Sebastian", "Elliot", "Morgan", "Jay", "Dominic", "Reuben", "Gabriel", "Sean", "Louie", "Andrew", "Frederick", "Ewan", "Zak"]
|
239
|
+
end
|
240
|
+
|
241
|
+
# @return [UniqueNames]
|
242
|
+
def self.english_female
|
243
|
+
UniqueNames.new ["Olivia", "Grace", "Ruby", "Jessica", "Emily", "Sophie", "Chloe", "Lucy", "Lily", "Ella", "Ellie", "Amelia", "Charlotte", "Katie", "Mia", "Hannah", "Evie", "Megan", "Amy", "Isabella", "Millie", "Isabelle", "Abigail", "Freya", "Molly", "Daisy", "Holly", "Emma", "Erin", "Poppy", "Jasmine", "Phoebe", "Leah", "Keira", "Caitlin", "Imogen", "Madison", "Rebecca", "Elizabeth", "Georgia", "Sophia", "Lauren", "Scarlett", "Amber", "Ava", "Eleanor", "Bethany", "Alice", "Isabel", "Summer", "Paige", "Anna", "Lola", "Libby", "Eva", "Maisie", "Isobel", "Brooke", "Lilly", "Alisha", "Tia", "Sarah", "Amelie", "Gracie", "Faith", "Rosie", "Courtney", "Matilda", "Niamh", "Maddison", "Sienna", "Eve", "Aimee", "Skye", "Zara", "Isla", "Shannon", "Madeleine", "Harriet", "Zoe", "Nicole", "Sofia", "Abbie", "Maya", "Lacey", "Rachel", "Francesca", "Layla", "Lydia", "Alicia", "Hollie", "Martha", "Alexandra", "Julia", "Natasha", "Lexie", "Mollie", "Morgan", "Maria", "Demi", "Rose", "Laura", "Lara", "Victoria", "Tilly", "Sara", "Evelyn", "Eloise"]
|
244
|
+
end
|
245
|
+
|
246
|
+
# @return [String]
|
247
|
+
def pop
|
248
|
+
n = @current_names.pop + postfix
|
249
|
+
if @current_names.empty?
|
250
|
+
@postfix_id += 1
|
251
|
+
reinit_current_names
|
252
|
+
end
|
253
|
+
return n
|
254
|
+
end
|
255
|
+
|
256
|
+
private
|
257
|
+
|
258
|
+
def reinit_current_names
|
259
|
+
@current_names = @base_names.shuffle
|
260
|
+
end
|
261
|
+
|
262
|
+
def postfix
|
263
|
+
if @postfix_id == 0
|
264
|
+
then ""
|
265
|
+
else "-#{@postfix_id}"
|
266
|
+
end
|
267
|
+
end
|
268
|
+
|
269
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
"
|
2
|
+
Fight club
|
3
|
+
==========
|
4
|
+
|
5
|
+
"
|
6
|
+
|
7
|
+
```
|
8
|
+
require 'unique_names'
|
9
|
+
|
10
|
+
names = UniqueNames.english_male
|
11
|
+
```
|
12
|
+
|
13
|
+
"Today in the fight club the tournament is being held! Meet the participants:"
|
14
|
+
|
15
|
+
10 раз:
|
16
|
+
```n = names.pop```;
|
17
|
+
N is the current participant;
|
18
|
+
N is in;
|
19
|
+
"
|
20
|
+
- "N", the ";
|
21
|
+
either "tiger", or "fox", or "bear", or ("horse"; N has hooves);
|
22
|
+
" ";
|
23
|
+
either ("with powerful hands"; N uses "hands"),
|
24
|
+
or ("with powerful feet"; N uses "feet"),
|
25
|
+
or:
|
26
|
+
if X is the current participant and X has hooves then (
|
27
|
+
"with powerful hooves"; X uses "hooves"
|
28
|
+
)
|
29
|
+
or (
|
30
|
+
"with sharp claws"; N uses "claws"
|
31
|
+
)
|
32
|
+
.
|
33
|
+
N is not the current participant;
|
34
|
+
.
|
35
|
+
"
|
36
|
+
|
37
|
+
Let the tournament begin!
|
38
|
+
|
39
|
+
"
|
40
|
+
While the tournament not complete:
|
41
|
+
If X is in and Y is in and X != Y, then:
|
42
|
+
(note: fight!)
|
43
|
+
either (X won; Y lost), or (Y won; X lost);
|
44
|
+
(note: yup, it should be made that existing variables can be used in
|
45
|
+
conditions rather than capturing new ones only)
|
46
|
+
if A won and B lost and A uses "hands" then ""A" has beaten "B". "
|
47
|
+
or if A won and B lost and A uses "feet" then ""A" has kicked "B". "
|
48
|
+
or if A won and B lost and A uses "hooves" then ""A" has kicked "B" and knocked him out. "
|
49
|
+
or if A won and B lost and A uses "claws" then ""A" has scratched the whole "B". ";
|
50
|
+
if A lost then (A not lost; A is not in);
|
51
|
+
if A won then A not won;
|
52
|
+
.
|
53
|
+
Or the tournament complete;
|
54
|
+
.
|
55
|
+
If X is in then ""X" is the winner!".
|
56
|
+
|
57
|
+
"
|
58
|
+
"
|
@@ -0,0 +1,53 @@
|
|
1
|
+
"Oliver" is a boy.
|
2
|
+
"Sam" is a boy.
|
3
|
+
"Nathan" is a boy.
|
4
|
+
"John" is a boy.
|
5
|
+
"Jack" is a boy.
|
6
|
+
"Katie" is a girl.
|
7
|
+
"Abigail" is a girl.
|
8
|
+
"Rose" is a girl.
|
9
|
+
"Madeleine" is a girl.
|
10
|
+
"Liza" is a girl.
|
11
|
+
|
12
|
+
"
|
13
|
+
University
|
14
|
+
==========
|
15
|
+
|
16
|
+
"
|
17
|
+
|
18
|
+
"Once upon a time in the University went "; for all X is a boy or X is a girl,
|
19
|
+
X", "; "that's it. They quickly became friends and went out often. "
|
20
|
+
|
21
|
+
While X is a boy and X not loves *:
|
22
|
+
if X is a boy and X not loves * and Y is a girl and * not loves Y then:
|
23
|
+
either:
|
24
|
+
"Once they all went out to a bar. Everyone danced. ";
|
25
|
+
either
|
26
|
+
"" (note: this means "do nothing")
|
27
|
+
or:
|
28
|
+
""X" and "Y" danced together the most. They liked each other and soon they fell in love! ";
|
29
|
+
X loves Y.
|
30
|
+
.
|
31
|
+
or:
|
32
|
+
"Once "X" and "Y" met in the dorm's kitchen. ";
|
33
|
+
either
|
34
|
+
"They talked nicely and prepared a nice supper. "
|
35
|
+
or:
|
36
|
+
"They talked very much and prepared a great supper together. Soon they understood that they love each other! ";
|
37
|
+
X loves Y.
|
38
|
+
.
|
39
|
+
or:
|
40
|
+
"Once "X" and "Y" were at the lecture and constantly looked at each other. ";
|
41
|
+
either
|
42
|
+
"After the lectures they went home and did their home tasks. "
|
43
|
+
or:
|
44
|
+
"After the lectures "X" caught "Y" and told her that he loves her! "
|
45
|
+
X loves Y.
|
46
|
+
.
|
47
|
+
.
|
48
|
+
.
|
49
|
+
|
50
|
+
"
|
51
|
+
|
52
|
+
Then they all lived long and happy!
|
53
|
+
"
|
@@ -0,0 +1,58 @@
|
|
1
|
+
"
|
2
|
+
Бойцовский клуб
|
3
|
+
===============
|
4
|
+
|
5
|
+
"
|
6
|
+
|
7
|
+
```
|
8
|
+
require 'unique_names'
|
9
|
+
|
10
|
+
names = UniqueNames.russian_male
|
11
|
+
```
|
12
|
+
|
13
|
+
"Сегодня в бойцовском клубе проводится турнир! Поприветствуйте участников:"
|
14
|
+
|
15
|
+
10 раз:
|
16
|
+
```n = names.pop```;
|
17
|
+
N - текущий участник;
|
18
|
+
N участвует в турнире;
|
19
|
+
"
|
20
|
+
- "N", ";
|
21
|
+
либо "тигр", либо "лис", либо "медведь", либо ("конь"; N имеет копыта);
|
22
|
+
" ";
|
23
|
+
либо ("с сильными руками"; N использует "руки"),
|
24
|
+
либо ("с сильными ногами"; N использует "ноги"),
|
25
|
+
либо:
|
26
|
+
если X - текущий участник и X имеет копыта, то (
|
27
|
+
"с мощными копытами"; X использует "копыта"
|
28
|
+
)
|
29
|
+
или (
|
30
|
+
"с острыми когтями"; N использует "когти"
|
31
|
+
)
|
32
|
+
.
|
33
|
+
N - не текущий участник;
|
34
|
+
.
|
35
|
+
"
|
36
|
+
|
37
|
+
Да начнется турнир!
|
38
|
+
|
39
|
+
"
|
40
|
+
Пока не конец турнира:
|
41
|
+
Если X участвует в турнире и Y участвует в турнире и X != Y, то:
|
42
|
+
(note: бой!)
|
43
|
+
либо (X победил; Y проиграл), либо (Y победил; X проиграл);
|
44
|
+
(note: дя, надо сделать, чтобы в условиях можно было существующие
|
45
|
+
переменные использовать, а не только захватывать новые)
|
46
|
+
если A победил и B проиграл и A использует "руки", то ""A" избил "B". "
|
47
|
+
или если A победил и B проиграл и A использует "ноги", то ""A" запинал "B". "
|
48
|
+
или если A победил и B проиграл и A использует "копыта", то ""A" лягнул "B" и вырубил его. "
|
49
|
+
или если A победил и B проиграл и A использует "когти", то ""A" исцарапал всего "B". ";
|
50
|
+
если A проиграл, то (A не проиграл; A не участвует в турнире);
|
51
|
+
если A победил, то A не победил;
|
52
|
+
.
|
53
|
+
Или конец турнира;
|
54
|
+
.
|
55
|
+
Если X участвует в турнире, то ""X" - победитель!".
|
56
|
+
|
57
|
+
"
|
58
|
+
"
|