procgen  Check-in [1521429541]

Overview
Comment:initial commit
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: 15214295416bc1eda60fb8df4f67a01d45372acb35569bb11451225c9ac82f7a
User & Date: lexi on 2018-09-24 23:18:14
Other Links: manifest | tags
Context
2018-11-11
10:19
add ransul check-in: 9a711d8a06 user: lexi tags: trunk
2018-09-24
23:18
initial commit check-in: 1521429541 user: lexi tags: trunk
23:14
initial empty check-in check-in: bbb86f3bf6 user: lexi tags: trunk
Changes

Added argue.ml version [de71563f83].



















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
type node = L of string | R of node array | C of string array | B of node list | O of node | F of (unit -> node)
let punct = C[|
	"."; ",";
	"?"; " ?"; "??"; " ??"; " ? ?";
	"!"; " !"; "!!"; " !!"; " ! !";
	"…"; "..."; ". . . "; "...!";
	"!?"; " !?"; " ! ?"; " <3"; " ♥";
	"~"; " ~uwu~"; " XD"; " :D";
	" :P"; " ;)"; " :)"; " :("; 
	" ಠ_ಠ"; " ^_^"; " >_>";
	" >_<";
|]
let dimin = C [|
	"hon";
	"honey";
	"honeybunch";
	"dear";
	"dearie";
	"my dear";
	"sweetie";
	"sweetheart";
	"bro";
	"babe";
	"dude";
	"bruh";
	"my man";
	"sweetcheeks";
	"kiddo";
	"kid";
	"daddy";
	"folks";
	"girl";
	"my child";
	"my sweet summer child";
	"pumpkin";
	"punkin";
	"my boy";
	"little boy";
	"little girl";
	"punk";
	"bb";
	"genius";
	"cuck";
	"bitch";
	"buddy";
	"bud";
	"pal";
	"silly";
	"silly boy";
	"dummy";
|]
let writers = C[|
	(* miscellaneous assholes & multipurpose tools *)
	"lacan"; "derrida"; "chomsky"; "nietzsche"; "baudrillard"; "beaudrillard"; 
	"freud"; "pinker"; "žižek"; "zizek"; "foucault"; "deleuze"; "delueze"; "kant"; "hume";
	"russell"; "russel"; "descartes"; "guattari"; "guatari"; "richelieu"; "hegel"; "heidegger";
	"de tocqueville"; "de toqueville"; "friedman"; "keynes"; "hobbes"; "bacon"; "avicenna";
	"schopenhauer"; "camus"; "hamilton"; "schwarzenegger"; "rousseau"; "rawls"; "goethe";
	"hobbes"; "friedman"; "fromm"; "hubbard"; "johnson";
	(* greeks *)
	"plato"; "aristotle"; "socrates"; "aristophanes"; "democritus";
	(* commies *)
	"trotsky"; "comrade trotsky"; "lenin"; "comrade lenin"; "mao"; "marx";
	"hoxha";
	(* there are a lot of ways to misspell that man's name *)
	"kierkegaard"; "kierkegard"; "keirkegaard"; "keirkegard";
	(* names i just made up*)
	"o'dair"; "wilson"; "saint-madeleine"; "sampson-crusoe"; "lambert"; "hernández";
	"duchamp"; "roberts"; "michaud"; "bägelstein"; "braustwitz"; "lawrence"; "smith";
	(* elvish word generator *)
	"harviorha"; "vieluval"; "beceou"; "ilvëthiorá"; "lioralie"; "bainon"; "alherdor";
	"lenusá";
	(* fictional characters *)
	"dracula"; "voight-kampff"; "bond"; "thranduil"; "hood";
	(* me *)
	"hale";
|]
let interj = C [|
	"wow";
	"w o w";
	"lmao";
	"lmfao";
	"rofl";
	"no";
	"nope";
	"wrong";
	"nuh-uh";
	"lol";
	"haha";
	"um";
	"k";
	"okay";
	"ok";
	"amazing";
	"alright";
	"now";
	"jesus";
	"oh boy";
	"boy";
	"man";
	"oh man";
	"oh my";
	"oh god";
	"god";
	"oh wow";
	"oh my sweet summer child";
	"my sweet summer child";
	"yo";
	"but";
	"so";
	"no way";
	"fake";
	"holy shit";
	"holy crap";
	"what the fuck";
	"ugh";
	"ughhh";
	"ugghh";
	"uugh";
	"yuck";
	"ew";
	"gross";
	"try and keep up";
|]
let disagreements = C[|
	"well";
	"well maybe";
	"well, maybe";
	"well, no";
	"well, actually";
	"well actually";
	"okay well";
	"actually";
	"maybe";
	"but";
	"and";
	"so";
	"first off";
	"firstly";
	"okay so first off";
	"okay well firstly";
|]
let chance i = (Random.int i) = 0
let pick (r : 'a array) : 'a = r.(Random.int(Array.length r))
let quote x = F(fun () -> if chance 30 then R[|
	B[L"\""; x ;L"\""];
	B[L"“"; x ;L"”";];
|] else x)
type word = A of string | An of string
let rude_adjs = [|
	A "smelly"; A "gross"; A "far-right"; A "right-wing";
	A "whiny"; A "childish"; A "stupid"; A "thoughtless";
	A "worthless"; An "inane";  An "idiotic"; A "fucking";
	A "fuckin"; A "pissy"; A "dumbfuck"; A "thick";
	A "sad"; A "pathetic"; A "witless"; A"horny";
	A "useless"; An "irrational";
|]
let rude_nouns = [|
	A "dumbass"; An "asshole"; A "jerk"; A "dipshit";
	A "baby"; A "nazi"; A "chucklefuck"; A "pig";
	An "ass"; A "dork"; A "geek"; A "nerd"; A "loser";
	A "whiner"; A "wanker"; A "gobshite"; A "wingnut";
	A "boob"; A "fuck"; A "fucker"; A "cuck"; A "yokel";
	A "feeb"; A "thug"; A"gringo";
|]
let makeinsult () = let adj = if chance 2 then Some(pick rude_adjs) else None in
	let noun = pick rude_nouns in L(match adj, noun with
		| None, A(n) -> "a " ^ n
		| None, An(n) -> "an " ^ n
		| Some(A(a)), A(n) 
		| Some(A(a)), An(n) -> "a " ^ a ^ " " ^ n
		| Some(An(a)), A(n) 
		| Some(An(a)), An(n) -> "an " ^ a ^ " " ^ n);;
		
let starters = R[| interj; interj; disagreements; |]
let byes = C[| "thanks"; "thx"; "kthx"; "kthxbye"; "bye"; "bye now"; "goodbye"; "bye-bye"; "byeee"; "byeeee"; "love you too"; "byebye"; "pls and thx"; "please and thanks"; "please and thank you"; "okay"; "have a nice day"; "goodnight"; "if you know what i mean";|]
let closers = R[| byes; dimin; B[byes; O(punct); L" "; dimin;];|]
let ewe = C[| "you"; "u"; "you"; "u"; "you"; "u"; "you"; "u"; "you're";|]
let yore = R[| L"your"; L"you're"; L"ur"; L"yr"; L"u're"; B[ewe; L" are"]; B[ewe; L" r"];|]
let pleez = C[|"please"; "pls"; "plz";|]
let poscmds = R[|
	L "grow up";
	L "learn to read";
	B[L "listen to "; yore; O(L " "); L "self"];
	B[L "calm "; yore; R[|
		B[O(L " "); L "self"; O(L" down")];
		L" tits";
	|]];
	L"calm down";
	L"calm dowm";
	B[L "use "; yore; L " brain"];
	B[C[|"read"; "listen to"|]; L" what "; yore; C[|" sayin"; " saying"|]];
	B[L "think before "; ewe; L " speak"];
	L "try again";
	L "try harder";
	L "explain";
	B[L "explain "; yore; O(L " "); L "self"];
	B[L "explain "; yore; L " reasoning"];
	B[L "explain "; yore; L " logic"];
	B[L "explain "; yore; L " evidence"];
	B[L "show me "; yore; L " evidence"];
	L "go away";
	L "check the bible";
	L "pay attention";
	B[L "learn "; yore; L " place"];
	L "shut up";
	L "shut the fuck up";
	L "stop talking";
	L "shut your mouth";
	L "answer my question";
	L "read a book";
	B[L "read "; O(L"some "); writers];
	B[L "read "; O(L"some "); writers];
	B[L "read "; O(L"some "); writers];
	L "go to hell";
	L "burn in hell";
	L "go to jail";
	L "notice me senpai";
	B[L "stop contradicting "; yore; O(L " "); L "self"];
	L "alert the presses";
	L "get a job";
	L "learn to take a joke";
	L "stop projecting";
	L "speak english";
	L "face facts";
	L "pay me";
	L "die in a fire";
	B[L"stop being "; F makeinsult;];
	B[L"stop being such "; F makeinsult;];
	B[L"quit being "; F makeinsult;];
	B[C[|"learn ";"lern ";"lrn "|]; O(L"how "); C[|"to ";"2 ";"too ";"two "; "";|]; C[|"spell";"spel";"spele";"speling";"spelling"|]];
|]
let negcmds = R [|
	B[L"be "; F makeinsult;];
	B[L"be such "; F makeinsult;];
	B[L"act like such "; F makeinsult;];
	B[L"keep acting like such "; F makeinsult;];
	B[L"make "; F makeinsult; L " of "; yore; O(L " "); L "self"];
	B[L"make such "; F makeinsult; L " of "; yore; O(L " "); L "self"];
	L"be that way";
	L"talk like that";
	L"keep whining";
	L"whine";
	
|]
let commands = R[|
	poscmds;
	poscmds;
	poscmds;
	B[C[|"don't "; "dont "|]; negcmds];
|]
let thats = C[| "that is"; "that's"; "it's"; "it is";|]
let thathas = C[| "that has"; "that's"; "it has"; "it has";|]
let thatsnot = C[| "that isn't"; "that's not"; "it's not"; "it isn't"; "that is not"; "it is not";|]
let theirs = C[| "there is"; "there's"; "theirs"; "their's"; |]
let thathasnt = C[| "that hasn't"; "that's not"; "it's not"; "it hasn't"; "that has not"; "it has not";|]
let im = C[| "i'm"; "i am"; "I am"; "i'm"; "im"; "Im"; |]
let comments = R [|
	L "cool story"; 
	L "fuck me";
	L "fuck you";
	B[thats; L " wrong"];
	B[thats; L " not even wrong"];
	B[thats; L " so wrong"];
	B[thatsnot; L " correct"];
	B[thatsnot; L " right"];
	B[thats; L " incorrect"];
	B[thats; L " untrue"];
	B[thatsnot; L " true"];
	B[ewe; L " are wrong"];
	B[thats; L " never been true"];
	B[thathas; L " never been true"];
	B[thathasnt; L " ever been true"];
	B[ewe; L " have no evidence"];
	B[ewe; L " can't prove it"];
	B[ewe; L " can't prove that"];
	L "bored now";
	L "checkmate, atheists";
	L "i'm not really into pokemon";
	L "whatever";
	B[ O(L"how "); L"are "; ewe; O(L" even"); L" real" ];
	B[L"are "; ewe; O(L" even"); L" a person" ];
	B[L"are "; ewe; L" a bot" ];
	B[L"i think "; yore; O(L" actually"); O(L" just"); L" a bot"];
	L "you need jesus";
	L "you need Jesus";
	L "you need you some jesus";
	B[O(B[yore; L" "]); L"so edgy"];
	L "real edgy";
	B[thats; L" nice"];
	B[thats; O(L" so"); L" fake"];
	B[thats; L" cool"];
	B[L"good for "; ewe];
	B[O(L "watch out "); L "we got a";C[|" real ";"n "|]; L"edgelord here"];
	B[L "are "; ewe; C[|
		" okay";
		" alright";
		" well";
		" diseased";
		" sick";
		" ok";
		" OK";
	|]];
	B[L "do "; ewe; L" need help"];
	B[L "no "; ewe];
	B[O(L "it "); L"takes one to know one"];
	B[L"where do i even start"; O(B[L" with"; R[|ewe;L" this one"; L" this bullshit"|]])];
	B[im; L" not "; C[|"gonna";"going to"|]; C[|" repeat myself"; " say it again"|];];
	L"i won't repeat myself";
	L"i won't repeat myself again";
	L"i won't say it again";
	L"don't make me repeat myself";
	B[ewe; L" make me laugh"];
	B[ewe; L" are very funny"];
	B[ewe; L" should be a comedian"];
	B[yore; L" very funny"];
	B[yore; L" a terrible person"];
	B[yore; L" a terrible person, aren't "; ewe];
	B[yore; L" a terrible human being"];
	B[yore; L" a terrible excuse for human being, aren't "; ewe];
	B[O(L"and "); C[|"who";"what"|]; O(L" even"); L" are ";ewe;O(L" supposed to be")];
	B[L"delete ";yore;L" account"];
	B[L"who do ";ewe;L" think ";ewe;L" are";];
	B[L"what are ";ewe; O(L" even"); L" talking about"];
	B[ewe; L" mad"];
	L"umadbro";
	B[L"do "; ewe; O(L" actually"); O(L" even"); L" know what that word means"];
	L"blocked and reported";
	B[L"what are ";ewe; O(L" even"); C[|" on"; " smoking"|]];
	B[L"do ";ewe; O(L" even"); L" lift"];
	B[L"are ";ewe; O(L", like,"); L" high"; O(L" or something")];
	L"look who's Mad Online";
	B[L"are ";ewe; O(L" seriously"); L" Mad Online"; O(L " right now")];
	B[L"i like ";ewe];
	L"wait for it";
	B[ewe; L " still haven't answered my question"];
	B[yore; L " an idiot"];
	B[L "i will pray for "; ewe];
	L"let's do this";
	L"fight me irl";
	L"come at me";
	B[L"how can you ";ewe;
		C[| " say "; " think "; " believe " |];
		C[| "that"; "those things"; "such a thing";
		"something like that"; "things like that"; "lies"; "bullshit";|];
	];
	B[im; L" so sad for "; ewe];
	L"send nudes";
	L"jesus loves you";
	B[im; L" entitled to my opinion"];
	B[L "have "; ewe; L" even heard of the first amendment"];
	B[thats; L" called free speech"];
	L"a/s/l";
	B[L "do "; ewe; L" kik"];
	B[thats; L " hot"];
	B[ewe; L " have a conflict of interest"];
	B[L "why should i listen to "; ewe];
	B[yore; L " going to hell"];
	B[yore; L " going to go to hell"];
	B[theirs; L" a special place in hell for "; O(L"people like "); ewe];
	B[L"do "; ewe; O(L" even"); L" know who i am" ];
	B[L"it's like "; ewe; L" don't"; O(L" even"); L" know who i am" ];
	B[im; L" trying to remove it"];
	B[L "do "; ewe; L" need a safe space"];
	B[thats; L" just my opinion"];
	L"then what";
	L"seriously";
	B[L "how do "; ewe; L" know"; R[| L""; L" that"; B[L" "; thats; L " true";]|]];
	B[thats; L" circular reasoning"];
	L"https://yourlogicalfallacyis.com/bandwagon";
	L"https://yourlogicalfallacyis.com/appeal-to-authority";
	L"https://yourlogicalfallacyis.com/slippery-slope";
	L"https://yourlogicalfallacyis.com/strawman";
	L"https://yourlogicalfallacyis.com/ad-hominem";
	L"https://yourlogicalfallacyis.com/no-true-scotsman";
	L"https://yourlogicalfallacyis.com/personal-incredulity";
	L"https://yourlogicalfallacyis.com/begging-the-question";
	B[thats; L" a fallacy"];
	B[thats; L" incoherent"];
	B[thats; L" illogical"];
	B[thats; L" self-contradictory"];
	B[ewe; L" just said it wasn't"];
	B[ewe; L" just said that wasn't true"];
	B[L"now "; yore; L" just lying"];
	L"that makes no sense";
	L"what";
	L"wait back up";
	L"hold on";
	B[L"hold ";yore;L" horses"];
	B[yore; L" contradicting yourself"; O(L" again")];
	B[L "how old are "; ewe; O(L" really"); O(L" even")];
	B[O(L"i think "); yore; O(L" being"); L" intellectually dishonest"; O(L" again")];
	B[ewe; L " don't "; O(L"really "); O(L"even "); L"know what "; C[|"that word means";"those words mean";"words mean"|]; O(B[L", do ";ewe])];
	B[O(L"why do "); ewe; L" hate america"];
	B[O(L"someone "); L"alert the presses"];
	B[C[|"gravity";"evolution";"abortion";"atheism";"feminism";"misandry"|]; L" is "; O(L"still "); C[|"just";"only";"nothing but"|]; L" a theory";];
	B[yore; L" parents must be "; O(L"very "); C[|"proud of ";"ashamed of ";"angry at ";"sad for "|]; ewe];
	B[L"are "; ewe; L" being sarcastic"];
	B[L"are "; ewe; L" for real"];
	B[L"are "; ewe; L" actually serious"];
	B[L"no wonder "; ewe; L" don't have a girlfriend"];
	B[L"no wonder "; ewe; L" dont have a girlfriend"];
	B[L"no wonder "; ewe; L" haven't got a girlfriend"];
	B[L"can't "; ewe; C[|""; " people"; " all"; "ppl"|]; O(L " ever"); O(L " even"); O(L " just"); O(L " learn to"); L" take a joke"];
	B[L"can't take a joke can "; ewe];
	B[L"can't take a joke, can "; ewe];
	B[L"can't take a joke, can we"];
	B[yore; O(L " so"); L" mad"];
	B[im; O(L " so"); L" mad"];
	B[L"are ";ewe;L" projecting"];
	B[L"i think ";yore;L" projecting"];
	L"tits or gtfo";
	L"gtfo";
	B[thats; L" illegal"];
	B[thats; L" illegal"];
	B[thatsnot; L" legal"];
	B[thatsnot; L" lawful"];
	B[thats; L" problematic"; O(B[O(L","); L" for a couple reasons";]) ];
	L"so what";
	L"i don't care";
	L"i dont care";
	L"why should i care";
	B[
		R [|
			B[L"all "; yore; L" doing is"];
			B[yore; C[|"";" only";" just"|]];
		|];
		L" embarassing "; yore;
		R[|
			B[O(L " "); L "self"];
			B[O(L " own"); L " dumb ass"];
		|]
	];
	B[ewe; L" know i don't care, right"];
	B[L"i can't believe "; ewe; L" actually went there"];
	B[thats; L" a sin"];
	B[yore; L " sick"];
	L"time for some game theory";
	L"time 4 some game theory";
	B[
		O(B[O(L "maybe "); ewe; L"should "]); L"shut "; O(L"the fuck "); L "up";
		O(B[L" while "; C[|
			"other people ";
			"the adults ";
			"the grown-ups ";
			"smarter people ";
			"better people ";
			"the smart people ";
			|]; L"are talking";])
	];
	B[L"are "; ewe; L" always "; R[|
		B[L"this "; C[|
			"dense";
			"thick";
			"slow";
			"stupid";
			"annoying";
			"angry";
			"useless";
			"much of a cuck";
			"much of an asshole";
			"irritating";
			"irrational";
			"illogical";
			"dumb";
			"horny";
		|]];
		B[O(L"such "); C[|
			"a cuck";
			"a honkey";
			"a gringo";
			"a baby";
			"a pansy";
			"a loser";
			"an idiot";
			"an asshole";
			"a yokel";
			"a dumbfuck yokel";
			"an asshat";
			"a dumbfuck honkey";
			"a dumbfuck yokel asshat";
			"a piece of shit";
			"a turd";
			"a party-pooper";
			"a wanker";
			"a burden";
			"a hindrance";
			"an obstacle";
		|]];
	|]];
	B[ewe; L" have to tell me if "; yore; L" a bot"; O(B[O(punct); L" it's the law"])];
	L "this is america";
	B[thats; O(L" called"); L " a power move"];
	L "i can't even";
	L "i cant even";
	L "don't know, don't care";
	B[L "are "; ewe; L" "; O(L"actually "); O(L"just ");
		C[|"trying to"; "tryin to"; "tryna"|]; L" ";
		C[|"bore";"whine";"wheedle";"bitch";"cry"|]; L " me ";
		C[|"to death";"into submission"|]; O(L" or something")
	];
	B[C[|"its";"it's"|]; L" time for some game theory"];
|]

let insist = R[|
	B[ewe; L " need to"];
	L"try and";
	R[|
		L"do us a favor and";
		L"do us all a favor and";
		L"do us both a favor and";
		L"do everyone a favor and";
		L"do the world a favor and";
		L"do me a favor and";
		B[L "do "; yore; O(L " "); L "self a favor and"];
	|];
	L"try &";
	B[ewe; O(L" really"); L " gotta"];
	B[ewe; O(L" really"); L " should"];
	B[L "can "; ewe];
	B[L "why don't "; ewe];
	B[L "why dont "; ewe];
	B[L "y dont "; ewe];
	L "time to";
	B[L"time for ";ewe;L" to"];
	L "fuck you";
	L "fuck you,";
|]
let advs = O(O(C[|"";" already";" next time";" again";|]))
let insults = R[|
	commands;
	B[C[|"please "; "pls "; "plz "; ""|]; insist; L" "; quote poscmds; advs];
	B[insist; C[|" please "; " pls "; " plz "; " "|]; quote commands; advs];
	B[insist; L" "; quote poscmds; advs; C[|" please"; " pls"; " plz"; ""|];];
	B[
		C[|"pls 2 "; "lern2"|];
		quote poscmds;
	];
	B[O(B[ewe; L" "]); L"better "; quote poscmds;];
	B[O(B[ewe; L" "]); L"better not "; quote negcmds;];
	B[
		C[|"fine"; "okay"; "sure"; "whatever"; "w/e"; "k"; "ok"|]; O(punct); L " ";
		negcmds; O(punct);
		L " see if i care"; O(punct);
	]
|]
let rec realgrammar =  R [|
		B[starters; punct];
		B[starters; L ", "; quote dimin; punct];
		B[O(B[starters; L" ";]); insults; O(B[L ", "; quote dimin]); punct];
		B[O(B[starters; L" ";]); insults; O(B[L ", "; quote dimin]); punct];
		B[O(B[starters; L" ";]); insults; O(B[L ", "; quote dimin]); punct];
		B[O(B[interj; punct; L" ";]); quote comments; O(punct); O(B[L" ";closers])];
		(* extremely leftist voice *) B[
			O(B[starters; O(punct); L" "]);
			R[|
				B[L "have "; ewe; O(L" ever"); O(L" even"); L" read ";
					C[|"any ";"any ";"any ";"a single word of ";"";"";"";"";|];
					writers; O(L" at all")];
				B[
					C[|"i don't think"; "i don't believe"; "i doubt"; "doubt"; "really doubt"; "really gotta doubt"|];
					C[|" that ";" if "; " "|];
					ewe;
					O(L" have");
					O(L " even"); L" read "; C[|"any ";"any ";"any ";"a single word of ";"";"";"";"";|]; writers
				];
				B[L"maybe if ";ewe;C[|"";"'d";" had"|];L" read "; writers; L " you wouldn't be "; O(L"such "); F makeinsult;];
			|];
			O(B[O(L","); L" "; quote dimin]);
			O(punct);
		]
|]
let grammar = F (fun () -> match Random.int 32 with
	| 0 -> B[
		C[|
			"okay so (1/";
			"well first off (1/";
			"so (1/";
			"alright so (1/";
		|];
		F(fun () -> L(string_of_int ((Random.int 200)+53))); L")"];
	| 1 -> B[L"\""; realgrammar; L"\""];
	| 2 -> B[L"“"; realgrammar; L"”"];
	| 3 | 4 -> B[L"*"; yore;];
	| _ -> realgrammar);; (* this is horrific *)

let iter c fn = 
	let rec loop i = fn i; if i = c-1 then () else loop (i+1) in loop 0
let titcase x = 
	let len = String.length x in
	let buf = Bytes.of_string x in
	iter len (fun i ->
		if i = 0 then
			let c = Bytes.get buf (i) in
			if c <= 'z' && c >= 'a' then
				Bytes.set buf (i) (char_of_int ((int_of_char c)-32)) else ()
		else if i != len-1 && (Bytes.get buf i = ' ' || Bytes.get buf i = '*') then
			let c = Bytes.get buf (i+1) in
			if c <= 'z' && c >= 'a' then
				Bytes.set buf (i+1) (char_of_int ((int_of_char c)-32)) else ();
			else ();
	);
	Bytes.to_string buf;;
	
let randcap x = match Random.int 6 with
	| 0 -> String.uppercase_ascii x
	| 1 -> titcase x
	| _ -> x
let rec eval : node -> string = function
	| L(s) -> s
	| R(n) -> eval (pick n)
	| B(l) -> List.fold_left (fun x y -> x ^ (eval y)) "" l
	| C(a) -> pick a
	| O(n) -> if chance 2 then (eval n) else ""
	| F(f) -> eval (f ())
let () = Random.self_init ();
	print_string (randcap (eval grammar))

Added badbiobot.ml version [3931f272bd].





























































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
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
type node = N of node list | S of string | R of node array | Many of node * int * string | P | O of node | Filter of (string->string) * node;;
let gclass = R[|S"Warrior"; S "Bard"; S "Ranger"; S "Wizard"; S "Mage"; S "Paladin"; S "Rogue"; S "Ninja"; S "Warlock"; S "Champion"; S "Barbarian"; S "Assassin"; S "Conjurer"; S "Summoner"; S "Fighter"; S "Berserker"; S "Druid"; S "Orc"; S "Goblin"|]
let name = R [|
	S "Stalin"; S "Hitler"; S "Marx"; S "Kony"; S "Mao"; S "Mussolini"; S "Trump"; S "Ted Cruz"; S "esr"; S "Richard Dawkins"; S "Mishima"; S "Nixon"; S "Kissinger"; S "Reagan"; S "Erdogan"; S "Hillary"; S "Clinton"; S "Bernie"; S "Sanders"; S "David Cameron"; S "Thatcher"; S "Nigel Farage"; S "McCarthy"; S "Putin"; S "Frank Underwood"; S "Andrew Jackson"; S "Sam Harris"; S "Christopher Hitchens"; S "Columbus"; S "Julian Assange"; S "Marcus Cicero"; S "Caligula"; S "Nero"; S "Commodus"; S "Caracalla"; S "Constantine"; S "Atilla the Hun"; S "Glenn Greenwald"; S "Ed Balls"; S "Edward Snowden"; S "Genghis Khan";
|]
let nomen = R [| S"nationalist"; S "capitalist"; S "Libertarian"; S "atheist"; S "conservative"; S "Marxist"; S "beta"; S "rationalist"; S "Republican"; S "Neoreactionary"; S "communist"; S "moe"; S "NRx"; S "racial realist"; S "hacktivist"; S "European"; S "European-American"; S "white separatist"; S "Anonymous"; S "heterosexual"; S "intellectual"; S "moderate"; S "sapiosexual"; S "intellectual"; S "egalitarian";|]
let adj = R [|nomen; S "circumgender"; S "transracial"; S "free-thinking"; S "incel"; S "proud"; S "rational"; S "straight"; S "opinionated"; S "politically active"; S "traditional"; S "pro-life"; S "angry"; S "white"|]
let band = R[|S"Metallica"; S "Nine Inch Nails"; S "Taylor Swift"; S "Drake"; S "Run The Jewels"; S "Daft Punk"; S "Amanda Palmer"; S "Coldplay"; S "Radiohead";|]
let trendy_food = R [| S "bacon"; S "vodka"; S "beer"; S "wine"; S "coffee"; S "whiskey"; S "Soylent"; S "steak"; S "kale"; |]
let lang = R [| S "Ruby"; S "Rails"; S "Python"; S "Scala"; S "Java"; S "PHP"; S "Haskell"; S "LISP"; S "JavaScript"; S "node.js"; S "React"; S "Backbone"; S "Polymer"; S "Ember"; S "Angular"; S ".NET"; S "C#"; S "F#"; S "Visual Basic .NET"; S "PowerShell"; S "Meteor.js"; S "jQuery"; S "Linux"; S "GNU/Linux"; S "UNIX"; S "AWK"; S "bash"; S "zsh"; S "fish"; S "GNU"; S "Open Source "; S "Erlang"; S "Docker"; S "R"; S "Hadoop"; S "Android"; S "iOS"; S "Unity"; S "Unreal Engine"; S "UE4"; S "Source Engine"; S "Apache"; S "Lua"; S "Prolog"; S "C++"; S "D"; S "Go"; S "Golang"; S "Rust"; S "Nim"; S "OCaml"; S "Kotlin"; S "Clojure"; S "Groovy"; S "Scheme"; S "Common Lisp"; S "llvm"; S "LLVM"; S "Hoon"; S "Urbit"; S "Nock"; S "Elixir"; S "Crystal"; S "TypeScript"; S "PureScript"; S "CoffeeScript"; S "Elm"; S "LaTeX"; S "troff"; S "groff"; S "Markdown"; S "HTML"; S "CSS"; S "XSLT"; S "Flash"; S "ColdFusion"; S "FORTRAN"; S "COBOL"; S "Matlab"; S "Mathematica"; S "CUDA"; S "OpenCL"; S "OpenGL"; S "DirectX"; S "Vulkan"; S "Pascal"; S "Perl"; S "Perl 6"; S "UX"; S "Emacs Lisp"; S "Vimscript"; S "AppleScript"; S "Swift"; S "Objective-C"; S "Cocoa"; S "Cocoa Touch"; S "Xamarin"; S "Qt"; S "GTK+"; S "WPF"; S "JavaFX"; S "Swing"; S "Smalltalk" |]
let dev = R[|N[lang; S " developer";];  N[lang; S " evangelist";]; N[lang; S " dev";]; N[lang; S " lover";]; N[lang; S " enthusiast";]; N[lang; S " professional";]; N[lang; S " expert";]; N[lang; S " "; gclass]; N[lang; S " connoisseur";];|]
let rec activity = R [|band; trendy_food; S"freedom"; S "free speech"; S"nationalism"; S "Minecraft"; S "Call of Duty"; S "partying"; S "beer pong"; S "football"; S "baseball"; S "vaping"; S "pussy"; S "bacon"; S "LessWrong"; S "America"; S "RationalWiki"; S "memes"; S "4chan"; S "8chan"; S "comics"; S "hacktivism"; S "hacking"; S "ComicCon"; S "cosplay"; S "Game of Thrones"; S "hentai"; S "advocacy"; N[noun; S " advocacy";]; S "sex"; S "science"; S "anime"; S "Big Data"; S "Cloud"; S "butts"; S "UKIP"; S "white separatism"; S "Brexit"; S "grammar"; S "free software"; S "open source"; S "real literature";|]
and noun = R [|
	nomen; S "Christian"; S "brony"; S "bro"; S "brogrammer"; S "brocialist"; N[activity; S "evangelist"]; N [S "bro"; noun]; dev; N[S "10x "; lang; S " dev";]; S "free-thinker"; S "Redditor"; S "atheist"; S "furry"; S "victim of cisphobia"; S "male feminist"; S "equalist"; S "MRA"; S "beer drinker"; S "father"; S "blogger"; N[noun; S "blogger";]; S "Thatcherite"; S "geek"; S "thought leader"; S "antivax"; S "channer"; S "Men's Rights Activist"; N[S "Social Justice "; gclass]; N[activity; S "lover";]; S "Anonymous"; S "infosec professional"; S "BernieBro"; S "Marxist"; S "socialist"; S "journalist"; S "marketer"; S "social media analyst"; S "philosopher"; S "educator"; S "advocate"; N[activity; S " advocate"]; S "sexpert"; S "professional"; N[activity; S" expert";]; N[activity; S"ninja";]; S "Pythonista"; S "Rubyist"; S "PhD candidate"; S "cartoonist"; S "man"; S "skeptic"; S "grammar Nazi"; S "open sorcerer"; S "podcaster"; N[name; S "-wannabe"]; S "lover"; S "detective"; S "trekkie"; S "fuckboy"; S "Soylent eater";
|]
let political_party = R[|
S "Green"; S "Labour"; S "Labor"; S "National"; S "Libertarian"; S "Democratic"; S "Republican"; S "Liberal Democrat"; S "Lib Dem"; S "Tory"; S "Conservative"; S "Liberal"; S "UKIP"; S "BNP"; S "SSP"; S "Britain First"; S "Pirate"; S "Sex"; S "Communist";
|]
let minority = R [| S "gays"; S "homosexuals"; S "jews"; S "Arabs"; S "Mexicans"; S "Muslims"; S "immigrants"; S "blacks"; S "transgendereds"; S "transgenders"; S "transgenderists"; S "queers"; S "SJWs"; S "feminists"; S "indie game developers"; S "gamers"; S "homos"; |];;
let minority_kind = R [|S "gender"; S "justice"; S "trans"; S "feminism"; S "queer"; S "gay"; S "homosexual";|]

let startup = R[|S "Fumblr"; S "Grumblr"; S "Humblr"; S "Appearancely"; S "AccidentNow"; S "RefuseNow"; S "remainr"; S "Trembleit"; S "Punish"; S "SprayNow"; S "Tennisr"; S "Traply"; S "Yawnin"; S "momly"; S "Smartyell"; S "radiatein"; S "sawly"; S "suffery"; S "Sceneify"; S "WomanNow"; S "Ballhub"; S "Systemme"; S "Earnify"; S "Mathit"; S "Gruntly"; S "Bongh.it"; S "Lyly"|];;
let hashtag = R [|
	S "#BlueLivesMatter";
	S "#AllLivesMatter";
	S "#NotAllMen";
	S "#KONY2012";
	S "#GamerGate";
	S "#FeelTheBern";
	S "#ImWithHer";
	S "#BuildTheWall";
	S "#VoteLeave";
	S "#FreeWeev";
	S "#WhiteGenocide";
	S "#2Ad";
	S "#NordicModel";
|]
let verb = R [| S "game"; S "code"; S "blog"; S "hack"; S "vape pussy" |]
let startup_position = R[|S "CEO"; S "CTO"; S "Soylent eater"; S "Dev"; S "$dev"; S "Product Manager"; S "Customer Success Manager"; S "Full Stack Engineer"; S "Data journalist"; S "Infosec Expert"; S "Designer"; S "UX"; S "Hacker"; S "Engineer"; S "VP of Engineering"; S "Data scientist"; S "Growth Hacker"; S "Marketing"; S "Sexpert"|]
let sportsball_team = R[|S "Ducks"; S "Beavers"; S "Steelers"; S "Lakers"; S "Blazers"; S "Redskins"; S "Clippers"; S "All Blacks"; S "Newcastle"; S "Cubs"; S "West Ham"; S "Man U"; S "Chelsea"; S "Liverpool"|]
let activity = R [| band; trendy_food; S "Minecraft"; S "Call of Duty"; S "partying"; S "beer pong"; S "football"; S "baseball"; S "vaping"; S "pussy"; S "bacon"; S "LessWrong"; S "America"; S "RationalWiki"; S "memes"; S "4chan"; S "8chan"; S "comics"; S "hacktivism"; S "hacking"; S "ComicCon"; S "cosplay"; S "Game of Thrones"; S "hentai"; S "advocacy"; N[noun; S " advocacy";]; S "sex"; S "science"; S "anime"; S "Big Data"; S "Cloud"; S "Butts"; S "UKIP"; S "white separatism"; S "Brexit"; S "grammar"; S "free software"; S "open source"; S "real literature"; S "Star Trek"; S "Star Wars"; |]
let rec activity_phrase = N[activity; O(N[S", "; activity_phrase])]

let phrase = R [|
	N[S "Husband, father, "; noun; P;];
	S "Friendly.";
	S "Hubby.";
	S "That is all.";
	S "Not as funny as I think I am.";
	S "Nice guy.";
	S "You have been warned.";
	N[S "Avatar by "; name; S ".";];
	S "Jet fuel can't melt steel beams.";
	N[minority; S " can't melt steel beams.";];
	N[activity; S " can't melt steel beams.";];
	N[lang; S " can't melt steel beams.";];
	N[name; S " was right.";];
	S "Ally.";
	S "Cynical bastard.";
	S "Proud Ally.";
	S "Don't follow if you're easily offended.";
	S "I aim to offend.";
	S "Sarcastic.";
	S "TERF is a slur.";
	S "Put the Christ back in Christmas.";
	S "Give me liberty or give me death.";
	S "Fights for the users.";
	S "I call them like I see them.";
	S "I calls 'em like I sees 'em.";
	S "Honest.";
	S "I fear I am now a victim of 'cisphobia'.";
	N[O(N[Many(adj,1," "); S " "]); noun; P;];
	N[O(N[Many(adj,1," "); S " "]); S "#"; noun; P;];
	N[adj; P;];
	N[Many(adj,3," "); S " #"; noun; S " and proud of it"; P;];
	N[activity_phrase; P];
	S "No fatties.";
	N[minority_kind; S " critical."];
	N[minority_kind; S "-critical."];
	N[minority_kind; S " separatist.";];
	N[S "Go "; sportsball_team; S "!";];
	S "Don't tread on me.";
	S "English only.";
	S "We are all Africans.";
	S "Je suis Charlie.";
	N[S "Je suis "; name; P;];
	N[S "I am "; name; P;];
	N[S "We are all "; name; P];
	N[minority; S " are the real oppressors.";];
	N[minority; S " are the real racists.";];
	N[S "My best friends are "; minority; P;];
	N[S "Lover of all things "; lang; P;];
	N[S "Lover of all things "; activity; P;];
	S "RTs are not endorsements.";
	S "Thoughts are my own.";
	N[S "CEO of "; startup;];
	N[startup_position; S " at "; startup; P; ];
	S "Opinions are my own.";
	S "Opinions do not reflect those of my employer.";
	N[adj; S " pride.";];
	N[noun; S " pride.";];
	N[S "I like "; activity; P;];
	N[S "I stand with "; name; S ".";];
	S "I speak truth to power.";
	S "History will vindicate me.";
	S "Make America great again.";
	N[S "Co-founder of "; startup; P];
	S "Molon labe.";
	S "Μολών λαβέ.";
	S "The best cure for bad speech is more speech.";
	N[S "I "; verb; P;];
	N[S "I "; verb; S " and I vote.";];
	S "My public key: https://keyface.ohno/f897b10a.";
	N[S "Make America "; adj; S " again.";];
	S "Watch my TED Talk.";
	N[minority; S " need not apply.";];
	N[S "((("; name; S ")))";];
	N[S "Fan of "; band; P;];
	S "Beyhive.";
	S "He/him.";
	N[noun; S", "; noun; S ", "; noun; S ", not necessarily in that order.";];
	N[minority; S " are what's wrong with America.";];
	N[minority; S " go home.";];
	N[trendy_food; S " addict.";];
	N[trendy_food; S " enthusiast.";];
	N[trendy_food; S " and "; trendy_food; S ".";];
	N[Many(trendy_food,2,", "); S " and "; trendy_food; S ".";];
	N[trendy_food; S " is what's wrong with America.";];
	S "14/88.";
	S "No trigger warnings.";
	S "Resistance is futile.";
	N[political_party; S " shill.";];
	N[political_party; S " activist.";];
	N[S "Vote "; political_party; S "!";];
	N[name; S " for president!";];
	N[name; S " for America.";];
	S "I love correcting people who are wrong.";
	S "Carthago delenda est.";
	S "Don't @ me.";
	S "Just say no.";
	S "PM me for direct sales.";
	
|];;
let top = N[ Many(Filter(String.capitalize_ascii,phrase),2," "); O(N[S " "; Many(hashtag,1," ")]);]
let range min max = (Random.int (max-min)) + min
let pick (r: 'a array) : 'a = r.(range 0 (Array.length r));;
let rec copy n times sep : string = match times with
	| 0 -> eval n
	| _ -> (eval n)^sep^(copy n (times-1) sep)
and eval (n:node) : string = match n with
	| N l -> List.fold_left (^) "" (List.map eval l)
	| S s -> s
	| R r -> eval (pick r)
	| P -> "."
	| Many(n,t,s) -> let times = t+(range 0 2) in copy n times s
	| O x -> if Random.int 2 = 1 then eval x else ""
	| Filter(fn,n) -> fn (eval n);;

let (^^) text chr = text ^ (String.make 1 chr)
let scramble text =
	let len = String.length text in
	let rec loop i acc tps =
		if i=len then acc else
		if i+1=len then acc^^text.[i] else
			match text.[i], text.[i+1] with
				| ' ', _ -> loop (i+1) (acc^" ") false
				| _ as c, ' ' -> loop (i+1) (acc^^c) false
				| c1, c2 -> if not tps && Random.int 3 = 0 then
					loop (i+2) ((acc^^c2)^^c1) true
				else
					loop (i+2) ((acc^^c1)^^c2) tps
	in loop 0 "" false
	
let () = Random.self_init(); print_string (scramble (eval top))

Added badname.c version [ad45f5162b].

















































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
// badname.c
// generates awful fantasy names based on a consistent
// lexicon.
// copyright 2014 alexis hale. released under GPLv2.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define to(ty, ctr, end) for(ty ctr = 0; ctr<end; ++ctr)

typedef unsigned char u8;

struct morpheme {
	const char* nat;
	const char* translation;
};

struct morpheme nouns[] = {
	{"Ilu", "Stone"},     {"Siri", "Water"},  {"Raswa", "Skull"},
	{"Nishra", "Spleen"}, {"Olbu", "Blood"},  {"Oblu", "Rot"},
	{"Bolu", "Weed"},     {"Huru", "Face"},   {"Pere", "Dirt"},
	{"Sarwa", "Filth"},   {"Oru", "Land"},    {"Barna", "Stomach-"},
	{"Orba", "Gut"},      {"Pata", "Chair"},  {"U", "Self"},
	{"Ra", "Offal-"},     {"Batu", "Table-"}, {"Topa", "Scarf"},
	{"Bosi", "Cow"},      {"Sama", "Horse"},  {"Dopu", "Pig"},
	{"Lakta", "River"},   {"Lakta", "Mine"},  {"Fri", "Witch"},
	{"Tole", "Spell"},    {"Daba", "Book"},   {"Ipa", "Ale"},
	{"Odu", "Mead"},      {"Shiri", "Wine"},  {"Shospu", "Beer"},
	{"Kili", "Scream"},   {"She", "Loud"},    {"Ro", "Quick"},
	{"Tifti", "Foul"},    {"Wosa", "Evil"},   {"Bilka", "Poison-"},
	{"Swa", "Man"},       {"Pesta", "Frog"},  {"Tokta", "Bile"},
	{"Ke", "Weasel-"},     {"Poru", "Coal"},   {"Wokme", "Lie-"},
        {"Ortu", "Gold"},     {"Vaksa", "Fuck"},  {"Ruktu", "Hard"},
	{"Gorwa", "Shaft"},   {"Badga", "Rod"},   {"Ulwa", "Cock"},
	{"Vatra", "Fire"},
}, acts[] = {
	{"ktor", "splitter"}, {"swil", "cleaver"},   {"tfas", "burster"}, 
	{"dosk", "mangler"},  {"stot", "corruptor"}, {"brak", "grinder"},
	{"vas", "seeker"},    {"ftir", "drinker"},   {"var", "stamper"},
	{"shirk", "smeller"}, {"svis", "thief"},     {"brot", "seller"},
	{"tolt", "crosser"},  {"kdash", "burner"},   {"pris", "sailor"},
	{"ksat", "speaker"},  {"bkis", "carrier"},   {"shvor", "slayer"},
	{"klis", "avenger"},  {"ftam", "spoiler"},   {"lwar", "deceiver"},
	{"shpok", "grasper"}, {"pash", "striker"},   {"pris", "render"},
	{"prash", "shredder"},{"vask", "defiler"},   {"dar", "dweller"},
	{"vtir", "burner"},   {"bilk", "poisoner"},  {"vkaft", "poisoner"},
	{"ktaft", "pounder"}, {"rpift", "strangler"},{"ltaft", "rider"},
	{"kvat", "liar"},     {"ktik", "finder"},    {"vkas", "fucker"},
        {"bagde", "rod"},     {"gorwe", "shaft"},    {"kruk", "squeezer"},
	{"lwe", "cock"},      {"vakse", "fuck"},

};
typedef struct name_t {
	struct morpheme* noun,* act;
} name_t;

void prt(const char* c) {
	do putchar(*c); while (*(++c)!=0);
}

void pname(name_t* names, u8 len) {
	u8 ct = 0;
	name_t* n = names;
	prt("\e[1m");
	do { 
		prt(n->noun->nat);
		prt(n++->act->nat);
		putchar(' ');
	} while (++ct < len);
	prt("\e[0m(\"\e[4m");
	ct = 0;
	do { 
		prt(names->noun->translation);
		prt(names++->act->translation);
		if (ct != len-1) putchar(' ');
	} while (++ct < len);
	prt("\e[0m\")");
}

typedef struct entity_t {
	name_t* names; u8 namec;
} entity_t;

void make_entity(entity_t* e) {
	e -> namec=rand()%3 + 2;
	e -> names=malloc(sizeof(name_t)*e->namec);
	to (u8, i, e -> namec) {
		e -> names[i].noun =
			&nouns[rand() % sizeof(nouns) / sizeof(struct morpheme)];
		e -> names[i].act =
			&acts[rand() % sizeof(acts) / sizeof(struct morpheme)];
	}
}

int main() {
	srand(time(NULL));
	const u8 entities = 20;
	entity_t* es = malloc(sizeof(entity_t)*entities);
	for (u8 e = 0; e<entities; e++)
		make_entity(&es[e]),
		pname(es[e].names, es[e].namec), putchar('\n');
	return 0;
}

Added botsoc.scm version [6437b613b4].



























































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
; (include "lib/lisp-macro.scm")
(include "lib/bot-gambit.scm")

(rule (base-ideology)
	("liberalism")		("socialism")		("capitalism")
	("anarchism")		("marxism")		("marxism-leninism")
	("nazism")			("feminism")		("stalinism")
	("democracy")		("stirnerism")		("harm reduction")
	("egoism")			("objectivism")	("monarchism")
	("tribadism")		("eugenics")		("fascism")
	("juche")			("nationalism")	("human extinctionism")
	("demonology")	("linguistics")		("voluntary human extinction")
	("onanism")		("anthropology") ("authoritarianism")
	("totalitarianism")	("social justice")	("identity politics")
	("idpol")				("terrorism")		("islamism")
	("hedonism")		("libertinism")		("computer science")
	("libertarianism")	("static typing")	("dynamic typing"))
(rule (ideology-prefix)
	("neo-")		("social ")	("democratic ")
	("paleo-")	("retro-")	("anarcho-")
	("femino-")	("neo")		("anti-")
	("sado-")	("eroto-")	("strangulo-")
	("theo-")	("ultra-")	("arachno-")
	("anti")		("post-") 	("post")
	("ethno-")	("marxism-") ("left-")
	("alt-")	("right-") ("space ") ("gay ")
	("quantum "))
(rule (ideology)
	((base-ideology))
	((adjective) " " (ideology))
	((ideology-prefix) (base-ideology)))
(rule (problem)
	("poverty")		("hunger")			("hatred")
	("racism")		("mortality")		("misogyny")
	("drug use")	("alcoholism")		("homophobia")
	("addiction")	("exploitation")	("drug prohibition")
	("nazism")		("class conflict")	("harm reduction")
	("biphobia")	("lesbianism")		("the opioid crisis")
	("Russia")		("masturbation")	("nuclear war")
	("oppression")	("immigration")	("totalitarianism")
	("depression")	("mental illness")	("war")
	("disease") 		("the bourgeoisie")
	("crime")		("activism")			("Noam Chomsky")
	("wealth")		("eugenics")		("bigotry")
	("genocide")	("bitcoin")			("ethnic cleansing")
	("vaccination")	("autism")			("the alt-right")
	("authoritarianism") ("freedom of speech")
	("tooth decay")	("neurodivergence")
	("abortion")	("healthcare")
	("islamophobia") ("sexting") ("static typing")
	("dynamic typing") ("heterophobia") ("heterosexuality"))
(rule (adjective)
	("racist")			("homophobic")	("misogynist")
	("bigoted")		("anti-" (thing))	("evil")
	("insane")		("impossible")		("contradictory")
	("illogical")		("revolutionary")	("self-contradictory")
	("white")		("communist")		("socialist")
	("marxist")		("stalinist")			("lesbian")
	("untested")	("neurotypical")	("anarchist")
	("religious")	("bourgeois")		("proletarian")
	("classist")		("monarchist")	("fascist")
	("postfurry")	("eugenicist")		("alt-right")
	("furry")			("problematic")	("totalitarian")
	("unlikely")		("compromised")	("authoritarian")
	("useless")		("useful")			("neurodivergent")
	("desirable")	("undesirable")	("dialectic")
	("undialectic")	("undefined")	("imperialist")
	("good")		("bad")			("colonialist")
	("acausal")		("black")		("statically-typed")
	("emergent")	("libertarian")	("unreconstructed")
	("teenage")		("Lacanian")	("intersectional"))

(rule (trait)
	("power") ("influence") ("wealth") ("solidarity")
	("hope") ("conviction") ("autonomy") ("freedom")
	("liberty") ("faith"))

(rule (necessity)
	("sex") ("water") ("food") ("money")
	("wealth") ("income") ("welfare") ("tea")
	("therapy") ("pain relief") ("medical care")
	("medicine") ("reproduction") ("hope") ("faith")
	("love"))

(rule (thing)
	((problem)) ((necessity))	("Russia")	("Mars")
	("activism")
	((thing) " activism") ("anti-" (thing) " activism")
	((adjective) " activism") ("bitcoin") ("humanity")
	("vaccination") ("autism") ("medical care")
	((adjective) " power") ((adjective) " policy")
	((adjective) " politics")
	("transit") ("public transit") ("public transportation")
	("meth") ("heroin") ("dialectics") ("the dialectic")
	("the Discourse") ("medical care") ("psychiatry")
	("influenza") ("alien life") ("mind control")
	("terrorism") ("identity") ("healthcare")
	 ("literature") ("grass") ("catnip")
	("television") ("romance") ("finance") 
	("opium") ("law") ("dating") ("online dating") ("friendship"))

(rule (things)
	("pandas")	("lasers")	("toasters")
	("kulaks")	("opiates") ("painkillers")
	("teacups")	("umbrellas") ((thing) " rights")
	((adjective) " rights")
	((thing) " activists") ("anti-" (adjective) " activists")
	((ideology) " activists") ((adjective) " activists")
	("humans") ("vaccines")
	("doctors") ("drugs") ("hospitals") ("UFOs") ("aliens")
	("flowers") ("pumpkins") ("guns") ("babies")
	("friends")
	)
(rule (thingss)
	((thing)) ((things)))
	
(rule (group)
	("gays")			("whites")			("African-Americans")	
	("the poor")	("the rich")			("Jewish people")
	("natives")		("otherkin")		("psychics")
	("furries")		("immigrants")	("trans people")
	("men")			("women")			("the bourgeoisie")
	("boys")			("girls")				("the proletariat")
	("activists")		("stirnerites")		("proletarians")
	("extremists")	((thing) " extremists") ((thing) " activists")
	("addicts")		("junkies")			("tweakers")
	("potheads")	("acid heads")		("meth addicts")
	("doctors")		("gamers")			("marijuana users")
	("dentists")		("fascists")			("marijuana addicts")
	("nazis")			("wizards")			("heroin addicts")
	("hackers")		("LSD addicts")	("disabled people")
	("criminals")	("teenagers")		("the differently-abled")
	("teens")		("cissexuals"))
	
; utility fns
(rule (adjfor adj con g)
	(adj)
	(adj con g))
(rule (modal)
	("will") ("could") ("might") ("will likely") ("can")
	("surely will")	("undoubtedly will") ("may"))
	
(rule (modal-not)
	("will not") ("could not") ("might not") ("will likely not") ("cannot")
	("surely will not")	("undoubtedly will not") ("may not"))

(rule (modal-rnd) ((modal)) ((modal-not)))

(rule (cause-provoke)
	("cause")		("lead to")	("provoke the development of")	
	("provoke")	("promote")	("create"))
(rule (causes-provokes)
	("causes")		("leads to")	("provokes the development of")		
	("provokes")	("promotes")	("creates"))
	
(rule (cause g i)
	(g " " (modal))
	((thing) " " (modal) " cause " g " to")
	(i " " (modal) " cause " g " to"))

; rule definitions
(rule (predicate-or-claim i)
		(i " is actually " (ideology))
		(i " is not " (ideology))
		(i " disproves " (ideology))
		(i " is disproven by " (ideology))
		(i " is a fundamentally " (adjective) " ideology")

		(i " is " (adjective))
		(i " is basically " (adjective))
		(i " is essentially " (adjective))
		(i " is unavoidably " (adjective))
		(i " is fundamentally " (ideology))
		
		(i " is bad for " (group))
		(i " is good for " (group))
		
		(i " seeks to eradicate " (group))
		(i " seeks to eradicate " (problem))

		(i " is the source of " (problem))
		(i " is the cause of " (problem))
		(i " is the the reason for " (problem))
		(i " is the the reason " (group) " suffer from " (problem))

		(i " excludes " (group))
		((cause (group) i) " be excluded from " (thing))
		(i " dehumanizes " (group))
		(i " alienates " (group))
		(i " marginalizes " (group))
		
		(i " pathologizes " (problem))
		(i " pathologizes " (thingss))
		(i " " (modal) " deny " (group) " access to " (thingss))
	
		((group) " are " (adjective))
		((group) " are not " (adjective))
		
		((thing) " " (causes-provokes) " " (thingss))
		((things) " " (cause-provoke) " " (thingss))
		((thingss) " " (modal) " cause " (problem))
		(i " " (causes-provokes) " " (problem))
		(i " " (modal) " cause " (problem))
		
		(i " lacks class character")
		((group) " have class character")
		((group) " lack class character")
		((thing) " has class character")
		((things) " have class character")
		((thing) " lacks class character")
		((things) " lack class character")
		
	
		((problem) " " (modal-rnd) " be solved in our lifetimes")
		
		(i " fails to address " (problem))
		(i " does not address " (problem))
		(i " disregards " (problem))
		(i " is not a solution for " (problem))
		(i " does not solve " (problem))
		(i " cannot solve " (problem))
			
	)
(rule (predicate i)
	(i " was developed after " (ideology))
	(i " was built on " (ideology))
	(i " was inspired by " (ideology))
	(i " was influenced by " (ideology))
	(i " is an ideological descendent of " (ideology))
	
	(i " was developed by " (group))
	(i " was developed to address the needs of " (group))
	(i " was developed to address the needs of " (group) ", not " (group))
	
	("the main contradiction of " i " is " (problem))
	
	((group) " believe that " (pc claim (ideology))))
	
(rule (claim i)
	((problem) " " (modal) " inevitably arise")
	((problem) " " (modal) " still exist")
	((problem) " " (modal) " " (cause-provoke) " " (problem))
	((problem) " " (modal) " " (cause-provoke) " the defeat of " i)
	((problem) " cannot be distinguished from " i)
	(i " and " (ideology) " cannot be distinguished")
	(i " and " (ideology) " will produce the same result")

	((group) " " (modal) " be exploited")
	((group) " " (modal) " still be exploited")
	((group) " " (modal) " be exploited under " i)
	((group) " " (modal) " still be exploited under " i)
	((group) " " (modal) " face " (problem))
	
	(i " " (modal) " kill " (group))
	
	((thing) " is " (adjfor (adjective) " for " (group)))
	((things) " are " (adjfor (adjective) " for " (group)))
	((thing) " is actually " (adjfor (adjective) " for " (group)))
	((things) " are actually " (adjfor (adjective) " for " (group)))
	
	((problem) " " (modal) " benefit " (group))
	((problem) " " (modal) " harm " (group))
	((problem) " " (modal) " destroy " (group))
	((problem) " " (modal) " incite " (group) " against " (group))
	((problem) " " (modal) " incite " (group) " against " (problem))
	((problem) " is unfair to " (group))
	
	((problem) " is likely to result")
	((thing) " is likely to result")
	((things) " are likely to result")
	((thing) " is likely to be involved")
	((things) " are likely to involved")
	
	((thing) " is harmful to " (group))
	((things) " are harmful to " (group))
	((thingss) " " (modal) " " (cause-provoke) " the oppression of " (group))
	((cause (group) i) " face " (problem))
	((cause (group) i) " suffer " (problem))
	((cause (group) i) " suffer from " (problem))
	((cause (group) i) " experience " (problem))
	((cause (group) i) " no longer experience " (problem))
	
	((cause (group) i) " suffer")
	((cause (group) i) " be marginalized")
	((cause (group) i) " become marginalized")
	((cause (group) i) " become exploited")
	((cause (group) i) " become addicted to " (thingss))
	((cause (group) i) " lose " (trait))
	((cause (group) i) " lose " (things))
	((cause (group) i) " lose their " (trait))
	((cause (group) i) " lose their " (things))
	((cause (group) i) " no longer have " (necessity))
	((cause (group) i) " lose access to " (necessity))
	)

(rule (pc p i) ((p i)) ((predicate-or-claim (pick (vector "it" i)))))
(rule (statement i)
	((pc predicate i))
	((pc claim i))
	("i think " (pc claim i))
	("it is my considered opinion that " (pc claim i))
	("i think we all know that " (pc claim i))
	("nobody would deny that " (pc claim i))
	((pc predicate i) ", therefore " (pc claim i))
	((pc claim i) " because " (predicate i))
	("if " (pc predicate i) ", " (pc claim i))
	("if " (pc predicate i) ", then " (pc claim i))
	("because " (pc predicate i) ", " (pc claim i))
	("since " (pc predicate i) ", " (pc claim i))
	("as a result of " (problem) ", " (pc claim i))
	("due to " (problem) ", " (pc claim i))
	("despite what " (group) " think, " (pc claim i))
	("despite what " (group) " think about " (problem) ", " (pc claim i))
	("while " (group) " think " (pc claim i) ", the reality is that " (pc claim i))
	)
	
(print (statement (ideology)) "\n")

Added bottist.ml version [ef9918389c].





































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
let adjs = [| "queer"; "electric"; "space"; "super"; "discount"; "extreme"; "far-left";
    "far-right"; "unreconstructed"; "modern"; "eternal"; "original"; "historical"; "tankie"; "mystical"; "arcane"; "catholic"; "protestant"; "irish"; "dialectical"; "confucian"; "orbital"; "suborbital"; "martian"; "minimalist"; "moist"; "dire"; "trotskyite"; "trotskyist"; "supreme"; |] 
let prefixes = [|"neo"; "post"; "retro"; "anti"; "counter"; "pre"; "paleo"; "femino"; "anarcho"; "oligo"; "meta"; "diabolo"; "theo"; "petro"; "sado"; "arachno"; "psycho"; "eroto";
    "nano"; "mini"; "xeno"; "astro"; "femto"; "electro"; "endo"; "arch"; "macro"; 
    "cardio"; "mesmo"; "chrono"; "nycto"; "megalo"; "lesbo"; "masculo"; "ultra"; "urtla";
    "proto"; "weebo"; "thanato"; "volcano"; "strangulo"; "quasi"; "pseudo"; "procto";
    "copro"; "hydro"; "gastro"; "thermo"; "mystico"; "arcano"; "disastro"; "vagino"; "dino"; "nympho"; "pharma"; |]
let ists  = [| "plurali"; "femini"; "activi"; "sociali"; "marxi"; "lenini"; "stalini"; "fasci"; "sadi"; "stirneri"; "masochi"; "imperiali"; "arcani"; "syndicali"; "masturbati"; "pedantici"; "posadi"; "hoxhai"; "maoi"; "papi"; "catholici"; "protestanti"; "coloniali"; "francoi"; "materiali"; "immateriali"; "sexuali"; "stallmani"; "minarchi"; "totalitariani"; "authoritariani"; "revisioni"; "legali"; "supremaci"; "masculi"; "primitivi"; |]

let range min max = (Random.int (max-min)) + min
let chance n = range 0 n = 0
let pick (r: 'a array) : 'a = r.(range 0 (Array.length r));;

let rec accumulate fn times = fn () ^ if times = 0 then "" else " "^(accumulate fn (times-1))
let makeist () = (if chance 2 then (pick prefixes)^"-" else "") ^ (pick ists)^(pick [|"st"; "te"|])
let ideology () = (if chance 3 then (if chance 4 then (pick prefixes) else "") ^ (pick adjs)^" "  else "" ) ^ (accumulate makeist (range 0 2)) ^ " " ^ (if chance 2 then ((if chance 3 then pick prefixes else "") ^"anarchism") else (pick [|"anarcho-";"arachno-"|])^(pick ists)^"sm")
let () = Random.self_init (); print_string (ideology ())
	

Added cclg.ml version [f3cecc2737].









































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
type word = A of string | An of string
type root = Edy of word | Xy of word | Ation of word | Le of word | A of word | Cy of word
	| Rous of word | Ics of word | Ics2 of word | Sis of word | X of word | Ality of word | Ty of word
	| Ication of word | Tion of word | Arity of word | Sm of word
type prefix = Inv of word | Vf of word * string
let prefixes = [|
	Vf(A "mult","i"); Inv (A "pre"); Vf(An "ex","o"); Vf(A "retr","o");
	Inv (A "hyper"); Vf(A "hem","i"); Inv (A "eu"); Vf(A "par","a");
	Vf(A "gastr","o"); Vf(A "bell","i"); Inv (An "an"); Vf(A "mes","o");
	Vf(A "therm","o"); Vf(A "copr","o"); Vf(A "pleb","i"); Vf(An "ant","i");
	Vf(A "pseud","o"); Vf(A "quas", "i"); Vf(A "crypt","o"); Vf(A "bronch","o");
	Vf(A "hydr","o"); Vf(A "psych","o"); Vf(A "tel","e"); Vf(An "arachn","o");
	Vf(A "nyct","o"); Inv(A "dys"); Inv(A "mis"); Vf(A "mis","o"); Vf(A "the","o");
	Vf(A "terr","a"); Vf(An "astr","a"); Vf(An "astr","o"); Vf(An "archae","o");
	Vf(An "erot","o"); Vf(A "proct","o"); Vf(An "atm","o"); Vf(A "strat","o");
	Inv(A "geo"); Vf(An "omn","i"); Inv(A "poly"); Vf(A "malign","o");
	Vf(A "micr","o"); Vf(A "macr","o"); Vf(A "nan","o"); Vf(A "femt","o");
	Vf(A "kil","o"); Vf(A "pet","a"); Inv(A "tri"); Vf(A "tetr","a");
	Vf(A "yoct","o"); Vf(A "meg","a"); Vf(A "un","i"); Inv(A "bi"); Vf(A "dec","a");
	Vf(A "pent","a"); Inv(An "endo"); Vf(An "electr","o"); Vf(A "pat","a");
	Vf(A "hem","o"); Inv(An "arch"); Vf(A "mesm","o");  Vf(A "card","io");
	Vf(A "necr","o"); Inv(An "un"); Vf(An "ultr","a"); Inv(A "trans");
	Inv(A "post"); Inv(A "sub"); Inv(A "pro"); Vf(A "ben","e"); Inv(An "ab");
	Inv(An "inter"); Vf(An "intr","a"); Inv(A "non"); Inv(A "counter");
	Vf(A "contr","a"); Vf(A "path","o"); Vf(A "phon","o"); Inv(A "pan");
	Vf(A "zo","o"); Vf(A "chron","o"); Inv(A "re"); Inv(A "con"); Vf(A "volcan","o");
	Inv(A "tech"); Vf(A "plasm","o"); Vf(A "megal","o"); Inv(A "cyber"); 
	Vf(A "met","a"); Inv(A "neo"); Vf(An "ocul","o"); Vf(A "strangul","o");
	Vf(A "dendr","o"); Vf(A "matr","i"); Vf(A "patr","i"); Vf(A "lesb","o");
	Vf(A "hom","o"); Vf(A "heter","o"); Vf(A "prot","o"); Vf(An "ect","o");
	Vf(A "weeb","o"); Vf(A "fung","i"); Vf(A "per","i"); Vf(A "petr","i");
	Vf(A "sad","o"); Vf(A "femin","i"); Vf(A "mascul","o"); Vf(A "claustr","o");
    Vf(A "neur","o"); Vf(A "norm","o"); Inv (A "eu");

	Vf(An "agor","a"); Vf(A "thanat","o"); Vf(A "vagin","o"); Vf(A "bi","o"); 
	Vf(A "blog","o"); Vf(A "prometh","eo"); Vf(An "anesthes", "io");
    Vf(A "din","o"); Vf(A "medic","o");
|]

let roots = [|
	Edy (A "com");
	Edy (A "trag");
	Xy (A "gala");
	Ation (A "lact");
	Le (A "mirac");
	Rous (A "fib");
	A (An "arcan");
	Cy (A "poli");
	Ty (A "poli");
	Ics (A "polit");
	Ics (A "mathemat");
	Ics2 (A "memet");
	Sis (A "mime");
	Ics (A "linguist");
	Ics2 (A "linguist");
	Ics2 (A "therm");
	Ics (A "cosmet");
	Ics (A "anesthet");
	Ics (A "techn");
	Sis (A "synthe");
	X (An "appendi");
	Ication (A "prognost");
	Ality (A "lachrym");
	Tion (A "prohibi");
	Ation (A "not");
	Ality (A "lingu");
	Arity (A "pulmon");
	Sis (A "sta");
	Sis (A "kine");
	Ality (A "lexic");
	Ality (A "mort");
	Ation (A "gener");
	Ality (A "nocturn");
	Cy (A "delica");
	Ation (A "masturb");
	Sm (An "orga");
	Sm (A "cla");
	Cy (A "malignan");
	Tion (A "func");
	Ics (A "dialect");
	Ics (A "pedant");
	Ation (A "form");
	Ation (A "dict");
	Tion (A "construc");
	Tion (A "trac");
	Tion (A "cep");
	Ation (A "port");
	Tion (A "scrip");
	Tion (A "junc");
	Ation (A "spir");
	Ation (A "coloniz");
	Ation (A "fornic");
	Ics (A "disastr");
	Ics (A "theatr");
	Ality (A "sexu");
	Ation (A "transl");
	Sm (A "sadi");
	Sm (A "masochi");
	Ation (An "ejacul");
	Ation (A "jacul");
	Ality (A "vagin");
	Ality (A "mystic");
	Sm (A "mystici");
	Ty (A "normativi");
	Ality (A "norm");
	Ality (A "typic");
	Xy (A "do");
	Ality (A "leg");
	Sm (A "legali");
	Ation (A "leg");
	A (A "pragmat");
	A (A "stigmat");
|]

let nsuffixes = [|
	An "ite";
	An "ate";
	An "itis";
	A "sis";
	A "rrhea";
	A "tion";
	An "icon";
	A "phoria";
	A "cide";
	An "ology";
	An "ologics";
	An "ologer";
	An "ologist";
	A "phobia";
	A "sphere";
	A "spherics";
	A "gon";
	A "tron";
	A "metry";
	A "meter";
	A "noia";
	A "noiac";
	A "noid";
	A "cracy";
	A "crat";
	A "mancy";
	An "ism";
	An "ist";
	An "ary";
	An "ory";
	A "scope";
	A "jection";
	A "mission";
	A "ception";
	A "ceptor";
	An "arch";
	An "archy";
	A "turbation";
	A "turbator";
	A "plasm";
	A "mania";
	A "maniac";
	A "dendron";
	A "gasm";
	A "philia";
	A "philiac";
	A "phile";
	A "sexuality";
	A "romance";
	A "net";
	An "ium";
    A "saur";
    An "odon";
    A "normativity";
    A "typicality";
    A "doxy";
|]
let adjsuffixes = [|
	An "itic";
	An "ose";
	An "id";
	A "tic";
	A "rrheic";
	A "tive";
	An "iconic";
	A "phoric";
	A "cidal";
	An "ologic";
	An "ological";
	An "ologistic";
	A "phobic";
	A "spheric";
	A "gonal";
	A "tronic";
	A "metric";
	A "metrical";
	A "noiac";
	A "noid";
	A "cratic";
	A "mantic";
	An "ist";
	An "istic";
	An "ismic";
	An "ismatic";
	A "scopic";
	A "ject";
	A "jective";
	A "missive";
	A "ceptive";
	An "archic";
	A "turbatory";
	A "plasmic";
	A "plastic";
	A "manic";
	A "maniacal";
	An "ish";
	A "dendrite";
	A "gasmic";
	A "philic";
	A "sexual";
	A "romantic";
	A "legal";
	A "normative";
	A "typical";
|]
let (^^) w s = match w with
	An x -> An (x^s) | A x -> A (x^s);;
let pick (r : 'a array) : 'a = r.(Random.int(Array.length r))
let chance i = (Random.int i) = 0
let cform root = match root with
	| Edy x -> x^^"edo" | Xy x -> x^^"cto" | Ation x -> x^^"o"
	| Rous x -> x^^"ro" | Le x -> x^^"ulo" | A x -> x^^"o"
	| Cy x -> x^^"tico" | Ics x | Ics2 x -> x^^(if chance 2 then "i" else "o")
	| Sis x -> x^^"to"
	| X x -> x^^"co" | Ality x -> x^^"o" | Ty x -> x^^"to"
	| Ication x -> x^^"o" | Tion x -> x^^"to" | Arity x -> x^^"a"
	| Sm x -> x^^(if chance 2 then "smo" else "sto")
let bareform root = match root with
	| Edy x -> (if chance 2 then x else x^^"ed") | Xy x -> x^^"ct" | Ation x -> x
	| Rous x -> x^^"r" | Le x -> x^^"ul" | A x -> x
	| Cy x -> x^^"tic" | Ics x -> x^^"ic" | Ics2 x -> x | Sis x -> x^^"t"
	| X x -> x^^"c" | Ality x -> x | Ty x -> x^^"t"
	| Ication x -> x | Tion x -> x^^"t" | Arity x -> x
	| Sm x -> x^^"st"
let adjform root = match root with
	| Edy x -> x^^"ic" | Xy x -> x^^"ctic" | Ation x -> x^^"ic"
	| Rous x -> x^^"rous" | Le x -> x^^"ulous" | A x -> x^^"e"
	| Cy x -> x^^"tical" | Ics x -> x^^"ical" | Ics2 x -> x^^"ic" | Sis x -> x^^"tic"
	| X x -> x^^"cal" | Ality x -> x^^"al" | Ty x -> x^^"tical"
	| Ication x -> x^^(if chance 3 then "itious" else "icate")
	| Tion x -> x^^(match Random.int 4 with
		| 0 -> "tive" | 1 -> "ted" | 2 -> "cious" | 3 -> "tory" | _ -> assert false)
	| Arity x -> x^^"ary" | Sm x -> x^^(if chance 2 then "stic" else "smic")
let nform root = if chance 7 then (adjform root) ^^ "ness" else match root with
	| Edy x -> x^^"edy" | Xy x -> x^^"xy" | Ation x -> x^^(if chance 3 then "itor" else "ation")
	| Rous x -> x^^"er" | Le x -> x^^"le" | A x -> x^^"a"
	| Cy x -> x^^"cy" | Ics x -> x^^(if chance 3 then "ician" else "ics") | Sis x -> x^^"sis"
	| Ics2 x -> x^^(if chance 3 then "ician" else "ics")
	| X x -> x^^"x" | Ality x -> x^^"ality" | Ty x -> x^^"ty"
	| Ication x -> x^^"ication" | Tion x -> x^^"tion" | Arity x -> x^^"arity"
	| Sm x -> x^^(if chance 2 then "st" else "sm")
let abs (w:word) = match w with A x | An x -> x
let append pref w = match pref with
		| Inv x -> x ^^ (abs w)
		| Vf(body,v) ->	 match w with
			| An x -> body^^x
			| A x -> (body^^v)^^x
let rec word () : word = match Random.int 7 with
	| 0 -> nform (pick roots)
	| 1 -> (match pick nsuffixes with
		| An x -> (bareform (pick roots)) ^^ x
		| A x -> (cform (pick roots)) ^^ x)
	| 2 -> ((adjform (pick roots)) ^^ " ") ^^ (abs(word ()))
	| 3 -> ((match pick adjsuffixes with
		| An x -> (bareform (pick roots)) ^^ x
		| A x -> (cform (pick roots)) ^^ x) ^^ " ") ^^ (abs(word ()))
	| 4 -> append (pick prefixes) (word ())
	| 5 -> append (pick prefixes) (pick nsuffixes)
	| 6 -> ((append (pick prefixes) (pick adjsuffixes)) ^^ " ") ^^ (abs (word()))
	| _ -> assert false
let () = Random.self_init (); print_string (abs (word ())); ()

Added crime.ml version [a935c1d4c7].

















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
type word = A of string | An of string | Article | Punctuation of string
type node = T of string | Tv of string | P of string | B of node list | N of node | R of node array | Indef | O of node | Fn of (unit -> word) | C of node

let wconcat x y = match x, y with
	| (A(x),An(y)) | (A(x),A(y)) -> A(x^" "^y)
	| (An(x),An(y)) | (An(x),A(y)) -> An(x^" "^y)
	| _ -> assert false
let wprefix x y = match x, y with
	| (A(x),An(y)) | (A(x),A(y)) -> A(x^y)
	| (An(x),An(y)) | (An(x),A(y)) -> An(x^y)
	| _ -> assert false

let range min max = (Random.int (max-min)) + min
let chance n = range 0 n = 0
let pick (r: 'a array) : 'a = r.(range 0 (Array.length r));;

module CrimeDrug = struct

let frics = [| "f"; "sh"; "th"; |]
let vfrics = [| "z"; "v"; "zh"; |]
let stops = [| "t"; "p"; "k"; "c"; |]
let vstops = [| "d"; "b"; "g"; "gh"; |]
let withglide r f = Array.map (fun i -> i^f) r
let withonset r o = Array.map (fun i -> o^i) r
let consonants = Array.concat [
	frics; vfrics; stops; vstops;
	withonset stops "s";
	[| "w"; "r"; "rh"; "s"; "l"; "ch"; "n"; "m"; |];
]
let initials = Array.concat [
	consonants;
	withglide frics "r"; withglide frics "l"; withglide frics "w";
	withglide stops "r"; withglide vstops "r"; withglide vstops "w";
	[| "qu"; "spr"; "spl"; "str"; "scr"; "scl"; "squ"; "bl"; "gl"; "sn"; "sm"; "j"; "h"; "sph"; "ph";|];
]
let nuclei = [| "e"; "ee"; "i"; "a"; "ou"; "u"; "oo"; "ea"; "oa"; "ai"; "oi"; "ie";|]
let finals = Array.concat [
	vstops;
	withonset stops "s"; withonset stops "r"; withonset stops "l";
	withonset vstops "r"; withonset vstops "l";
	[| "gh"; "ck"; "ce"; "ss"; "se"; "nd"; "mb"; "mph"; "nk"; "tch"; "ke"; "ght";
	"ff";  "ll"; "zz"; "t"; "p"; "th"; "rth"; "lth"; "dge"; "nge"; "ng"; "ft"; "ckle"; "ngle"; "rkle";
	"scht"; "ze"; "x"; "sh"; "rsh"; "lsh"; "ggle"; "ddle"; "bble"; "pple"; "rge"; "lge"; "ve"; "rve";
	"lve"; "ffle"; "ttle"; "kle"; "sch"; "m"; "n"; "rm"; "lm"; "rn"; "ln";|]
]
let prefixes = [| A "crack"; A "crystal"; A "powdered"; A"raw"; A "pure"; A "liquid";
	A"street"; A "super"; An "electric"; A "diced"; A "homemade"; A "traditional";
	An "old-school"; A "purified"; A "high-caliber"; A "high-octane"; An "old-fashioned";
	A "good old"; A "honest-to-god"; A "weapons-grade"; A "soviet"; An "american";
	A "canadian"; A "british"; A "russian"; A "synthetic"; A "french"; A "cyber"; |]

let makeA i x = A(i ^ x)
let makeAn x = An x
let maybeConcat x y = match x with
	| Some t -> wconcat t y
	| None -> y
let gen () : word = maybeConcat (if chance 3 then Some (pick prefixes) else None)
	((if chance 5 then makeAn else makeA (pick initials))
		((pick nuclei) ^ (pick finals)))
		
end

let rec crime = R [|
	Tv "arson";
	T "murder";
	T "jaywalking";
	T "larceny";
	T "sex";
	T "intercourse";
	T "acts unspeakable";
	T "public indecency";
	T "software piracy";
	T "piracy";
	T "theft";
	T "regicide";
	Tv "assault";
	T "battery";
	T "treason";
	T "bribery";
	T "manslaughter";
	T "bestiality";
	T "assault and battery";
	T "corruption";
	T "corruption of a minor";
	T "highway robbery";
	T "banditry";
	T "cattle rustling";
	T "looting";
	T "war crimes";
	T "crimes against humanity";
	T "breach of contract";
	T "crime";
	T "crimes";
	T "burglary";
	T "vandalism";
	T "robbery";
	T "forgery";
	T "counterfeiting";
	T "stalking";
	T "sabotage";
	T "sedition";
	T "shoplifting";
	T "corrupt practices";
	T "fire-raising";
	T "genocide";
	T "desertion";
	T "defamation";
	T "embezzlement";
	T "immigration";
	T "emigration";
	T "illegal immigration";
	T "illegal emigration";
	T "endangerment";
	T "extortion";
	T "failure to appear in court";
	T "abduction";
	T "kidnapping";
	T "fraud";
	T "tax fraud";
	T "homicide";
	T "extortion";
	T "mutiny";
	T "extortion";
	T "perverting the course of justice";
	T "perversion";
	T "tweeting";
	T "blogging";
	T "mommyblogging";
	T "vlogging";
	T "posting";
	T "posts";
	T "trespass";
	T "broadcasting";
	T "assembly";
	T "war profiteering";
	T "blackmail";
	T "cybercrime";
	T "espionage";
	T "hijacking";
	T "hooliganism";
	T "perjury";
	T "refusal to serve in a public office";
	B [ T  "failure to appear before"; Indef; profession ];
	B [ T  "refusal to serve as"; Indef; profession ];
	B [ T  "stalking"; O(T"of"); Indef; profession ];
	B [ T  "solicitation of"; Indef; profession ];
	B [ T "bribery of"; Indef; profession; ];
	B [ T "cruelty to"; Indef; profession; ];
	B [ T "fraudulent"; practice; ];
	B [ T "misuse of"; Indef; thing; ];
	B [ thing; T "forging"; ];
	B [ T "obtaining"; Indef; thing; T "by deception"; ];
	B [ T "detonation of"; R[|B[Indef; thing];thingp|]; ];
	B [ T "conspiracy to commit"; O prefix; crime; ];
	B [ T "conspiracy to practice"; O prefix; practice ];
	B [ T "possession of"; 
		R[|
			B[Indef; thing];
			thingp;
			Fn CrimeDrug.gen;
		|];
		O(T "with intent to distribute")
	];B [ T "use of"; 
		R[|
			B[Indef; thing];
			thingp;
			Fn CrimeDrug.gen;
		|];
	];
	B [ T "conspiracy to misuse"; Indef; thing ];
	T "tax evasion";
	T "fare evasion";
	B [ T  "conduct unbecoming"; Indef; profession ];
	B [ T "deployment of"; Indef; thing ];
	B [ R[|T "provision of"; T "distribution of"|]; R[|
			B[Indef; thing];
			thingp;
			Fn CrimeDrug.gen;
		|];
		O(R[|T"to minors"; T"to a minor"|]);
	];
	B [ Tv "purchase of"; Indef; thing ];
	B [ Tv "delivery of"; Indef; thing; T "to"; Indef; profession];
|] and gerundcrime = R [|
	B [ T "impersonating"; Indef; profession ];
	B [ T "breaking and"; doing; ];
	B [ T "practicing"; O prefix; practice; ];
	B [ T "practicing the"; instrument; ];
	B [ Tv "approaching"; Indef; profession ];
	B [ T "receiving stolen"; thingp ];
	B [ T "deploying"; Indef; thing ];
	T "being horny";
	T "marketing";
	T "advertising";
	T "unlawful restraint";
	T "trespassing";
|] and doing = R [|
	Tv "entering";
	T "decorating";
	Tv "invoking";
	Tv "evoking";
	Tv "insulting";
	Tv "advertising";
	Tv "mentoring";
	Tv "bantering";
	Tv "yiffing";
	Tv "posting";
	Tv "tweeting";
	Tv "blogging";
|] and practice = R [|
	T "falconry";
	T "dentistry";
	T "philosophy";
	T "linguistics";
	T "conjuration";
	T "illusion";
	T "mathematics";
	T "set theory";
	T "math";
	T "physics";
	T "astrophysics";
	T "natural philosophy";
	T "chemistry";
	T "engineering";
	T "marketing";
	T "advertising";
	T "blogging";
	T "tweeting";
	T "posting";
	B[T "forensic"; practice];
|] and instrument = R [|
	T "clarinet";
	T "piano";
	Tv "oboe";
	T "flute";
	T "violin";
|] and thing = R [|
	T "clarinet";
	T "piano";
	T "deadly weapon";
	T "firearm";
	T "weapon";
	T "sex doll";
	T "rhinocerous";
	T "farm animal";
	T "landmine";
	T "rocket launcher";
	T "rocket-propelled grenade";
	T "grenade";
	T "ballistic missile";
	T "ICBM";
	T "rifle";
	T "vibrator";
	Tv "assault rifle";
	Tv "assault weapon";
	Tv "automatic weapon";
	Tv "artifact";
	Tv "orb";
	T "cursed object";
	Tv "infectious disease";
	T "nuclear weapon";
	T "bioweapon";
	T "chemical weapon";
	T "memetic hazard";
	T "metaphor";
	T "simile";
	Tv "analogy";
	T "turkey baster";
	T "rolling pin";
	T "household item";
	Tv "appliance";
	T "blog";
	T "post";
	T "tweet";
|] and thingp = R [|
	T "clarinets";
	T "pianos";
	T "deadly weapons";
	T "firearms";
	T "weapons";
	T "sex dolls";
	T "rhinoceri";
	T "farm animals";
	T "landmines";
	T "rocket launchers";
	T "rocket-propelled grenades";
	T "grenades";
	T "ballistic missiles";
	T "ICBMs";
	T "rifles";
	T "vibrator";
	T "handcuffs";
	Tv "assault rifles";
	Tv "assault weapons";
	Tv "automatic weapons";
	Tv "artifacts";
	Tv "orbs";
	T "hazardous materials";
	T "gender";
	T "cursed objects";
	Tv "infectious diseases";
	Tv "internet access";
	T "nuclear material";
	T "nuclear weapons";
	T "bioweapons";
	T "chemical weapons";
	T "memetic hazards";
	T "cognitohazardous materials";
	T "propaganda";
	T "metaphors";
	T "similes";
	Tv "analogies";
	T "turkey basters";
	T "rolling pins";
	T "household items";
	Tv "appliances";
	T "stolen property";
	T "blogs";
	T "posts";
	T "tweets";
|] and profession = R [|
	T "public official";
	Tv "officer of the law";
	T "justice of the peace";
	T "locksmith";
	T "blacksmith";
	T "silversmith";
	T "magician";
	T "conjurer";
	Tv "illusionist";
	T "criminal";
	T "career criminal";
	T "drug dealer";
	T "schoolteacher";
	T "con artist";
	T "conman";
	T "burglar";
	T "poet";
	Tv "artisan";
	Tv "artist";
	T "courtesan";
	T "street artist";
	T "bartender";
	T "cattle rustler";
	T "celebrity";
	T "blogger";
	T "mommyblogger";
	B [ T "professor of"; practice ];
	B [ T "master of"; practice ];
	B [ practice; T "master" ];
	B [ practice; T "professor" ];
	B [ practice; T "expert" ];
	B [ thing; T "expert" ];
|] and prefix = R [|
	Tv "unjustified";
	Tv "unjustifiable";
	T "justifiable";
	Tv "unspeakable";
	T "tactless";
	Tv "indecent";
	Tv "intemperate";
	Tv "attempted";
	Tv "unlawful";
	T "malicious";
	Tv "aggravated";
	T "dread";
	T "horny";
	T "erotic";
	T "sexual";
	T "careless";
	T "negligent";
	T "first-degree";
	T "second-degree";
	T "third-degree";
	T "culpable and reckless";
	T "criminal";
	T "illegal";
	T "forcible";
	T "fractal";
|] and suffix = R [|
	B [ T "with intent to commit"; crime ];
	T "in a public place";
	T "in a court of law";
	T "on public transit";
	T "on the high seas";
	Tv "in anger";
	T "without a license";
	T "without lawful cause";
	B [ T "in the commission of"; crime ];
	B [ T "with"; Indef; thing ];
	B [ T "with"; thingp ];
	B [ T "with multiple"; thingp ];
	T "with intent to provoke a breach of the peace";
	T "with intent to commit a breach of the peace";
	B [ T "while acting in an official capacity"; O(B[T"as"; Indef; profession])];
	B [ T "in the presence of"; Indef; profession ];
	T "in the first degree";
	T "in the second degree";
	T "in the third degree";
	T "in the vicinity of a school";
	T "with malice aforethought";
	T "with malicious intent";
	T "with violent intent";
	B [ T "unbecoming"; Indef; profession ];
	T "under false pretenses";
|]

let charge = R [|
	B[ O prefix; crime; O suffix; ];
	B[ prefix; practice; O suffix; ];
	B[ gerundcrime; O suffix; ];
|]

let rec eval node : word list = match node with
	| T x -> [A x]
	| Tv x -> [An x]
	| B l -> List.fold_left (fun (a:word list) (n:node) : word list -> a @ (eval n)) [] l
	| P p -> [Punctuation p]
	| R a -> eval(pick a)
	| O n -> if chance 2 then eval n else []
	| Fn f -> [f ()]
	| Indef -> [Article]
	| N n -> eval n (* unnecessary? *)
	| C n -> match eval n with
		| A i :: rs-> A(String.capitalize_ascii i) :: rs
		| An i :: rs-> An(String.capitalize_ascii i) :: rs
		| _ as i -> i

(* TODO: make tail-recursive *)
let rec flatten (s : word list) : string = match s with
	| Article :: A w :: rs -> " a "^w^(flatten rs)
	| Article :: An w :: rs -> " an "^w^(flatten rs)
	| Punctuation p :: rs -> p^(flatten rs)
	| A w :: rs | An w :: rs -> " "^w^(flatten rs)
	| [] -> ""
	| _ -> assert false
	
let numbers = R [| T "two"; T "three"; T "four"; T "five"; T "six"; T "seven";
	Tv "eight"; T "nine"; T "ten"; |]
let court = B[
	R[|T "the"; T "this"; |];
	O(R[|T "august"; T "noble"; T "glorious"; T "honorable"; T "grand";
		T "eminent"; T "splendid"; T "superb"; T "infallible"; T "holy";
		T "supreme";|]);
	R[|T "court"; T "tribunal"; T "court of law"; T "committee"; 
		Tv "inquisition"; |];
]
let accusation = C(B [
	Tv "you";
	R [|
			R[|
				B[
					T "stand";
					R[|
						T "here";
						B[T "before"; court;];
					|];
					O(T "today");
				]
			|];
		Tv "are";
	|];
	R[|
		B[T "to face justice for"; O(B[numbers; T "counts of"])];
		B[
			R[|
				Tv "accused";
				T "to face charges";
				T "to answer charges";
			|];
			R[|
				B[Tv "on"; numbers; T "counts of"];
				Tv "of";
			|]
		];
	|];
	charge;
	P ".";
	O(R[|
		T "How do you plead?";
		T "What say you?";
		T "How do you answer the charges?";
		T "What is your plea?";
		T "Explain yourself!";
	|]);
])
let sentence = B[
	R[|
		B[
			R[| T "You are"; T "The defendant is"; T "The accused party is"; |];
			O(T "hereby");
			O(T "stripped of all rank and");
			R[|T "sentenced"; T "condemned"|];
		];
		B[
			Tv "I";
			O(T "hereby");
			R[|T "sentence"; T "condemn"|];
			R[| T "you"; T "the defendant"; T "the accused party";|];
		];
	|];
	T "to";
]
let condemnation = B[
	sentence;
	R[|
		B[
			T "die";
			O(T "screaming");
			O(T "in agony");
			O(B[
				T "by";
					O(T "prolonged");
					O(T "ritual");
					O(T "public");
					R[| T "beheading"; T "strangulation"; T "torture";
						T "industrial negligence"; T "slow slicing"; T "lethal injection";
						T "disembowelment"; T "drowning"; T "burning";
						T "burning at the stake"; T "emasculation"; T "irradiation";
						T "stabbing"; T "poisoning"; T "flaying"; T "roasting";
						T "boiling"; T "boiling in oil"; T "boiling in acid";
						T "crucifixion"; |]
			]);
		];
		T "hang";
		T "hang until dead";
		T "hang until you are dead";
		T "be drawn and quartered";
		T "drown";
		T "burn";
		T "burn at the stake";
		T "be burned";
		T "be burned at the stake";
		T "be broken on the wheel";
		T "be torn apart by wild horses";
	|];
	O(R[|
		B[
			T "at";
			R[|
				T "dawn"; T "dusk"; T "noon"; T "high noon"; T "sunrise"; T "sunset";
			|]
		];
		T "within one week";
		T "within the hour";
		T "by day's end";
	|])
]
let imprisonment = B[
	sentence;
	R[|
		B[
			R[|T "two"; T "three"; T "four"; T "five"; T "six"; T "seven";
			Tv "eight"; T "nine"; T "ten";|];
			R[|T "seconds"; T "minutes"; T "days"; T "weeks";  T "years"; T "decades"; T "millennia";
				T "hundred years"; T "thousand years"; Tv "eons"; Tv "ages"; Tv "eras"; T "million years";
				T "billion years"; T "trillion years"; |];
		];
		B[
			R[|Indef;Tv "one";|];
			R[|T "second"; T "minute"; T "day"; T "week";  T "year"; T "decade"; T "millennium";
				T "hundred years"; T "thousand years"; Tv "eon"; Tv "age"; Tv "era"; T "million years";
				T "billion years"; T "trillion years"; |];
		];
		Tv "a lifetime";
		Tv "an eternity";
	|];
	R[|Tv "of community service"; Tv "in state prison"; Tv "in federal prison"; Tv "in prison"; 
		Tv "of jail time"; Tv "of prison time"; B[T "without"; R[|B[Indef; thing];thingp|];];
		Tv "alone"; T "in the gulag"; Tv "in a labor camp"; Tv "in the county jail";
		T "thinking about what you've done"; Tv "of penance"; Tv "in the Box";
		Tv "in the Shame Cube"; Tv "in the nightmares of children";
		Tv "in a magic lamp";Tv "in a cursed mirror"; Tv "of indentured servitude"; Tv "of slavery";|];
]
let status = R[|
	T "citizenship";
	T "rank";
	T "all rank";
	T "all status";
	T "all rights";
	T "all privileges";
	T "all clearances";
	T "all certifications";
|]
let banishment = B [
	R[|
		B[
			T "You are";
			O(T "hereby");
			O(B[T "stripped of your citizenship and";]);
			O(T "forever");
			R[|T "exiled"; T "banished";|];
		];
		B[
			R[|T "The defendant is"; T "The accused party is"; |];
			O(T "hereby");
			O(B[T "stripped of"; R[|T"her"; T"his"; T"its"; T"their";|]; T "citizenship and";]);
			O(T "forever");
			R[|T "exiled"; T "banished";|];
		];
		B[
			Tv "I";
			O(T "hereby");
			O(T "strip you of your citizenship and");
			R[|T "exile"; T "banish";|];
			T "you";
			O(T "forever");
		];
	|];
	O(B[
		T "from";
		R[|
			T "the Realm";
			T "the Kingdom";
			T "the Empire";
			T "the Republic";
			T "the Federation";
		|];
	]);
	O(B[
		T "to";
		O(B[O(T"forever"); T "wander"]);
		T "the";
		R[|
			T "howling";
			T "dark";
			T "empty";
			T "abyssal";
			T "cursed";
			T "abandoned";
			T "barbarous";
			T "forgotten";
			T "lost";
			T "forsaken";
			T "desert";
		|];
		R[|
			T "marshes";
			T "woods";
			T "forest";
			T "marsh";
			T "plain";
			T "plains";
			T "wastes";
			T "pit";
			T "shores";
			T "desert";
		|];
	]);
]
let order = B [
	R[|
		B[
			R[| T "You are"; T "The defendant is"; T "The accused party is"; |];
			O(T "hereby");
			O(B[T "stripped of"; status; Tv "and";]);
			R[|T "ordered"; T "commanded"; T "enjoined"; T "required";|];
		];
		B[
			Tv "I";
			O(T "hereby");
			R[|
				B[T "strip you of"; status; T "and";
					R[|T "order"; T "command"; T "enjoin"; T "require";|];
					T "you";
				];
			|];
		];
	|];
	T "to"; 
	R[|
		B[T "perform"; R[|T "one"; numbers;|]; T "hundred jumping jacks"];
		T "make amends";
		T "beg forgiveness";
		T "do the right thing";
		T "bleed";
		T "sacrifice your firstborn";
		T "forever quit the land of your birth";
		B[
			T "pay a fine of";
			numbers; (* TODO better numbers *)
			O(R[|T "hundred"; T "thousand"; T "hundred thousand"; T "million"; T "billion"; T "trillion";|]);
			R[| T "dollars"; T "credits"; T "units"; T "cows"; T "heads of cattle"; T "sand dollars";
				T "gold"; T "silver"; T "pounds"; T "pence"; T "pounds stirling"; T "talents";
				T "sovereigns"; T "dried yak teeth"; T "cursed fairy coins"; T "ultradollars";|];
		];
	|];
]
let reduce = B [
	R[|
		B[
			R[| T "You are"; T "The defendant is"; T "The accused party is"; |];
			O(T "hereby");
			O(B[T "stripped of"; status; Tv "and";]);
			R[|T "condemned"; T "reduced"; T "reassigned";|];
		];
		B[
			Tv "I";
			O(T "hereby");
			R[|
				B[T "strip you of"; status; T "and";
					R[|T "condemn"; T "reduce"; T "reassign";|];
					T "you";
				];
				B[
					T "strip";
					R[|T "the defendant"; T "the accused party";|];
					Tv "of"; status; T "and";
					R[|T "condemn"; T "reduce"; T "reassign";|];
					R[|T "her"; T "him"; T "it"; T "them";|];
				];
				B[
					R[|T "condemn"; T "reduce"; T "reassign";|];
					R[|T "you"; T "the defendant"; T "the accused party";|];
				];
			|];
		];
	|];
	T "to"; 
	R[|
		T "slavery";
		T "undercaste status";
		T "prole status";
		T "servitude";
		T "Infrared Clearance";
		T "unskilled labor";
		T "kitchen duty";
		T "sanitation duty";
		T "court jester";
	|];
]
let conviction = C(B [
	O(B[
		R[|
			B[Tv "in the";
				R[|T"name";T"sight";T"name and sight";T "great and terrible name";|]];
			B[T "by the";
				R[|T"grace";T"power";T"grace and power";T"will";|]];
		|];
		Tv "of";
		R[|
			T "the Queen"; T "the King"; T "her Majesty the Queen"; T "his Majesty the King";
			T "all that is holy"; T "justice"; T "God"; T "the Lord"; T "the Sultan"; T "the Caliph";
			T "the Prince"; T "the Princess"; T "the Realm"; T "the Kingdom"; T "our infernal master";
			T "Satan"; T "Lucifer"; T "Heaven"; T "the heavens"; T "the Prophet"; T "Yaldabaoth";
			T "Heaven and all its angels"; T "our Creator"; T "the Maker"; T "the spirits";
		|];
		P ",";
	]);
	R[|
		B[court;
			O(T "hereby");
			R[| T "finds"; T "declares"; T "proclaims"; T "pronounces"; T "judges"; Tv "adjuges";|];
		];
		B[Tv "I";
			O(T "hereby");
			R[| T "find"; T "declare"; T "proclaim"; T "pronounce"; T "judge"; Tv "adjudge"|];
		]
	|];
	R[| T "you"; T "the defendant"; T "the accused party";|];
	T "guilty";
	O(Tv "on all counts");
	Tv "of";
	charge;
	P".";
	O(B[
		R[|imprisonment; reduce; order; banishment; condemnation; T"Get in the Crime Hole";|];
		P".";
	]);
])
let global = R[|conviction; accusation;|]
let () = Random.self_init ();
	print_string
		(String.trim
			(flatten
				(eval global)))

Added drug.ml version [b5c9249601].



















































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
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
let frics = [| "f"; "sh"; "th"; |]
let vfrics = [| "z"; "v"; "zh"; |]
let stops = [| "t"; "p"; "k"; "c"; |]
let vstops = [| "d"; "b"; "g"; "gh"; |]
let withglide r f = Array.map (fun i -> i^f) r
let withonset r o = Array.map (fun i -> o^i) r
let consonants = Array.concat [
	frics; vfrics; stops; vstops;
	withonset stops "s";
	[| "w"; "r"; "rh"; "s"; "l"; "ch"; "n"; "m"; |];
]
let initials = Array.concat [
	consonants;
	withglide frics "r"; withglide frics "l"; withglide frics "w";
	withglide stops "r"; withglide vstops "r"; withglide vstops "w";
	[| "qu"; "spr"; "spl"; "str"; "scr"; "scl"; "squ"; "bl"; "gl"; "sn"; "sm"; "j"; "h"; "sph"; "ph";|];
]
let nuclei = [| "e"; "ee"; "i"; "a"; "ou"; "u"; "oo"; "ea"; "oa"; "ai"; "oi"; "ie";|]
let finals = Array.concat [
	vstops;
	withonset stops "s"; withonset stops "r"; withonset stops "l";
	withonset vstops "r"; withonset vstops "l";
	[| "gh"; "ck"; "ce"; "ss"; "se"; "nd"; "mb"; "mph"; "nk"; "tch"; "ke"; "ght";
	"ff";  "ll"; "zz"; "t"; "p"; "th"; "rth"; "lth"; "dge"; "nge"; "ng"; "ft"; "ckle"; "ngle"; "rkle";
	"scht"; "ze"; "x"; "sh"; "rsh"; "lsh"; "ggle"; "ddle"; "bble"; "pple"; "rge"; "lge"; "ve"; "rve";
	"lve"; "ffle"; "ttle"; "kle"; "sch"; "m"; "n"; "rm"; "lm"; "rn"; "ln";|]
]
let range min max = (Random.int (max-min)) + min
let chance n = range 0 n = 0
let pick (r: 'a array) : 'a = r.(range 0 (Array.length r));;
let prefixes = [| "crack"; "crystal"; "powdered"; "raw"; "pure"; "liquid"; "street";
	"super"; "electric"; "diced"; "homemade"; "traditional"; "old-school"; "purified";
	"high-caliber"; "high-octane"; "old-fashioned"; "good old"; "honest-to-god";
	"weapons-grade"; "soviet"; "american"; "canadian"; "british"; "russian";
	"synthetic"; "french"; "cyber"; |]
let word () = (if chance 3 then (pick prefixes) ^ " " else "") ^
	(if chance 5 then "" else pick initials) ^
	(pick nuclei) ^
	(pick finals)
	
let greets = [| "hey"; "whassup"; "what's up"; "what up"; "yo"; "hey there"; "what's shakin'" |]
let names = [| "dude"; "bro"; "man"; "babe"; "sweetheart"; "honey"; "baby"; "hottie"; "girl"; |]
let questions = [| "wanna"; "want to"; "shall we"; "how about we"; |]
let exhorts = [| "we oughta"; "you oughta"; "we ought to"; "you ought to"; "we should";
	"you should"; "let's"; |]
type component = Invariant of string | Numbered of string * string | Poss
type state = Plain of string | Compound of component list
let states = [|
	Plain "high";
	Compound[Invariant "out of"; Poss; Numbered("mind","minds")];
	Compound[Invariant "outta"; Poss; Numbered("mind","minds")];
	Plain "fucked up";
	Plain "wrecked";
	Plain "hammered";
	Plain "buzzed";
	Plain "tweaked";
	Plain "whacked";
	Plain "whacked out";
	Plain "smacked";
	Plain "smacked out";
	Plain "tipsy";
	Plain "snazzy";
	Plain "spooky";
	Plain "crazy";
	Plain "messed up";
	Plain "far out";
	Plain "horny";
	Plain "psycho";
	Plain "loony";
	Plain "wacky";
	Plain "silly";
	Plain "creepy";
	Plain "frazzled";
	Plain "dazzling";
	Plain "wired";
	Plain "peppy";
	Plain "hoovered";
	Plain "turnt";
	Plain "turnt up";
	Plain "tits-up";
	Plain "toasted";
	Plain "roasted";
	Plain "cooked";
	Plain "baked";
	Plain "basted";
	Plain "flunked";
	Plain "flunked out";
	Plain "crazed";
	Plain "stewed";
	Plain "framed for war crimes";
	Plain "ruined";
	Plain "totally ruined";
	Plain "whacked out";
	Plain "creeped out";
	Plain "spunky";
	Plain "spiffy";
	Plain "nifty";
	Plain "wicked";
	Plain "slutty";
	Plain "jazzed";
	Plain "jazzy";
	Plain "fried";
	Plain "hecked";
	Plain "hecked up";
	Plain "hecked out";
	Plain "screwed";
	Plain "screwed up";
	Plain "ousted";
	Plain "thrown out of the mall";
	Plain "cyber";
	Plain "totally online";
	Plain "cybered";
	Plain "downloaded";
|]
let roas = [| "on"; "shooting up"; "using"; "mainlining"; "snorting"; "vaping"; "smoking"; "cybering";
	"sucking down"; "gargling"; "doing"; "trying"; "guzzling"; "popping"; "downing"; "chewing"; 
	"crunching"; "sniffing"; "zapping"; "downloading"; "dropping"; "cooking up"; "freebasing"|]
let vroas = [| "shoot up"; "mainline"; "snort"; "vape"; "smoke"; "freebase";
	"suck down"; "gargle"; "do"; "try"; "guzzle"; "pop"; "down"; "chew"; "crunch";
	"sniff"; "zap"; "download"; "drop"; "cyber"; "cook up"; |]
module Pronoun = struct
	type t = {
		nom : string; obl : string; gen : string;
		refl : string; cop : string; brevcop : string;
		pl : bool;
	}
	let you = {nom = "you"; obl = "you"; gen = "your"; refl = "yourself";
		cop = "are"; brevcop = "'re"; pl = false;}
	let youpl = {nom = "you"; obl = "you"; gen = "your"; refl = "yourself";
		cop = "are"; brevcop = "'re"; pl = true;}
	let he = {nom = "he"; obl = "him"; gen = "his"; refl = "himself";
		cop = "is"; brevcop = "'s"; pl = false;}
	let they = {nom = "they"; obl = "them"; gen = "their"; refl = "themselves";
		cop = "are"; brevcop = "'re"; pl = true;}
	let she = {nom = "she"; obl = "her"; gen = "her"; refl = "herself";
		cop = "is"; brevcop = "'s"; pl = false;}
	let me = {nom = "I"; obl = "me"; gen = "my"; refl = "myself";
		cop = "am"; brevcop = "'m"; pl = false;}
	let we = {nom = "we"; obl = "us"; gen = "our"; refl = "ourselves";
		cop = "are"; brevcop = "'re"; pl = true;}
	let all = [| you; youpl; he; they; she; me; we |]
end
let cop p = Pronoun.(if chance 4 then p.nom ^ " " ^ p.cop else p.nom^p.brevcop)
let makestate p s = 
	let eval c = match c with
		| Invariant i -> i
		| Numbered(sg,pl) -> if p.Pronoun.pl then pl else sg
		| Poss -> p.Pronoun.gen
	in match s with
		| Plain t -> t
		| Compound l -> List.fold_left (fun a t -> if a = "" then a^(eval t) else a^" "^(eval t)) "" l 
let gethigh p = (cop p) ^ (pick [|" getting "; " gonna get "; " "|]) ^ (pick [|"";"so "|])
	^ (makestate p (pick states)) ^ " on " ^ (word ());;
let cantwait p = p.Pronoun.nom ^ " can't wait to get " ^ (makestate p (pick states)) ^ " on " ^ (word ());;
let affecting p =
	if chance 2 then 
		(pick [|
			"it's got"; "it's getting"; "it got"; "it has";
			"it's making"; "it's gonna get"; "it's gonna make"
		|]) ^ " " ^ p.Pronoun.obl
	else Pronoun.(pick [|
		p.nom ^ " got";
		(cop p) ^ " getting";
		(cop p) ^ " gonna get";
		(cop p);
	|]);;
let gotso p = (affecting p) ^ (pick [|" ";" so "|]) ^ (makestate p (pick states));;
let ison p = (cop p) ^ " " ^ (pick roas) ^ " " ^ (pick [|"so much ";"too much ";"way too much ";"a lotta ";"a lot of "; "a ton of "; "a whole lotta "; "a whole lot of ";"";""|]) ^ (word ());;
let isonand p = (ison p) ^ " and " ^ (gotso p)

let offer p name (* haaaack *) = (pick greets) ^ " " ^ name ^ (pick [|"! "; ", "; ". "; " - ";|]) ^
	if chance 2 then
		(pick questions) ^ (pick [|" go "; " "|]) ^ (pick vroas) ^ (pick [|" some "; " "|]) ^
		(word ()) ^ (if chance 2 then " and get " ^ (makestate p (pick states)) else "") ^ "?"
	else  
		(pick exhorts) ^ (pick [|" go "; " "|]) ^ (pick vroas) ^ (pick [|" some "; " "|]) ^
		(word ()) ^ (if chance 2 then " and get " ^ (makestate p (pick states)) else "") ^
		(pick [|"!";"";"."|]);;
let offer_wrap p (* haaaack *) = offer Pronoun.you (pick names) 
let gotsoand p = (gotso p) ^ " " ^ (pick roas) ^ (pick [|" the "; " that "; " all that ";" some ";|]) ^ (word ())
let routes = [| gethigh; ison; isonand; offer_wrap; gotsoand; cantwait; |] 
let main = Random.self_init ();
	if Array.length Sys.argv >= 2 && String.length (String.trim (Sys.argv.(1))) >= 1 then
		print_string(offer Pronoun.you (String.trim Sys.argv.(1)))
	else print_string (pick routes (pick Pronoun.all))

Added dx.ml version [a7d9e1eab3].



























































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
let range min max = (Random.int (max-min)) + min
let chance n = range 0 n = 0
let pick (r: 'a array) : 'a = r.(range 0 (Array.length r));;

let prefixes = [|
    "anarcho"; "diabolo"; "psycho"; "neuro"; "socio"; "ego"; "mesmo";
|]
let suffixes = [|
    "phrenia"; "pathy"; "sis"; "tism"; "clasm";
|]
let adjs = [|
    "eboulliant"; "gangrenous"; "hysterical"; "malicious"; "diabolical"; "injunctive"; "gregarious"; "apocalyptic"; "felonious"; "oppositional"; "defiant"; "dextrous"; "harmonious"; "disharmonious"; "defective"; "reactive"; "magnificent"; "misogynistic"; "egalitarian"; "paraphilic"; "deviant"; "subjunctive"; "indicative"; "optative"; "jussive"; "judicial"; "precarious"; "disjunctive"; "redactive"; "[REDACTED]"; "criminal"; "illegal"; "psychotic"; "delusional"; "lawful"; "unlawful"; "inferior"; "superior"; "psychotic"; "histrionic"; "borderline"; "schizoid"; "theoretic"; "theoretical"; "Marxist"; "Leninist"; "Chomskyite"; "selective"; "clinical"; "sub-clinical"; "dominant"; "latent"; "submissive"; "orgasmic"; "orgiastic"; "optimistic"; "pessimistic"; "depressive"; "manic"; "dysfunctional"; "redundant"; "reciprocal"; "reflexive"; "didactic"; "syntonic"; "asymptomatic"; "asymptotic"; "infinite"; "diabetic"; "carcinogenic"; "diabetic"; "adiabatic";
|]
let parts = [| 
    "ego"; "id"; "superego"; "posterior"; "hindbrain"; "forebrain"; "forehead"; "kidney"; "appendix"; "elbow"; "intestinal tract"; "bile"; "ichor"; "blood";
|]
let dtnames = [|
    "kreutz"; "hammar"; "feld"; "holtz"; "mann"; "eich"; "berger"; "wald"; "grund"; "weiss"; "schmerz"; "welt"; "sturm"; "blitz"; "reich"; "blitzen"; "brauch"; "ratten"; "huber"; "bliss"; "blatt"; "gott"; "zeit"; "leute"; "haupt"; "bann"; "eich"; "schaft"; "hund"; "stein"; "pferd"; "wurst"; "brot"; "lauf"; "glück"; "freund"; "feldt"; "stadt"; "dorf"; "bahn"; "euch"; "brandt"; "blut"; "knorpel";
|]
let names = [| "Chomsky"; "Marx"; "Lenin"; "Mao"; "Freud"; "Asperger";|]
let name () = if chance 6 then (pick names) else String.capitalize_ascii ((pick dtnames) ^ (pick dtnames))

let kinds = [|
    "disorder";
    "defect";
    "dysfunction";
    "personality disorder";
    "syndrome";
    "personality defect";
    "defect";
    "illness";
    "psychopathy";
    "sociopathy";
    "tendency";
    "delusion";
    "hysteria";
    "psychosis";
    "neurosis";
    "dementia";
    "schizophrenia";
    "effect";
    "mutism";
    "autism";
    "corruption";
    "mania";
|]



let rec subform () = match range 0 12 with
    | 0 -> (pick adjs) ^ " " ^ (pick kinds)
    | 1 -> (pick adjs) ^ "-" ^ (pick adjs) ^ " " ^ (pick kinds)
    | 2 -> (name ()) ^ " " ^ (pick kinds)
    | 3 -> (name ()) ^ " " ^ (subform ())
    | 4 -> (name ()) ^ "-type " ^ (subform ())
    | 5 -> (subform()) ^ " of the " ^ (pick parts)
    | 6 -> (pick adjs) ^ " " ^ (subform ())
    | 7 -> (pick adjs) ^ " " ^ (pick prefixes) ^ (pick suffixes)
    | 8 -> (pick prefixes) ^ "-" ^ (pick adjs) ^ " " ^ (pick kinds)
    | 9 -> (pick parts) ^ " " ^ (pick kinds)
    | 10 -> (name ()) ^ "-" ^ (subform ())
    | 11 -> (pick parts) ^ "-" ^ (pick adjs) ^ " " ^ (pick kinds)
    | _ -> assert false

let modifiers = [|
    "a peculiar case of";
    "a peculiar form of";
    "an unusual case of";
    "an unusual form of";
    "a remarkable case of";
    "a remarkable form of";
|]
let form () = (if chance 4 then (pick modifiers) ^ " " else "") ^ match range 0 3 with
    | 0 -> subform ()
    | 1 -> (name ()) ^ "'s " ^ (subform ())
    | 2 -> "the " ^ (subform ())
    | _ -> assert false

let dxs = [|
    "suffering from";
    "afflicted by";
    "displaying";
    "displaying the characteristics of";
    "displaying the characteristic behavior of";
    "crippled by";
    "under the influence of";
|]
let msg () = match (if chance 4 then 0 else range 0 5) with 
    | 0 -> (pick [|
        "You appear to be";
        "You would appear to be";
        "You seem to be";
        "You would seem to be";
        "I can only hypothesize that you are";
        "You are";
        "It seems you are";
        "I can only come to the conclusion that you are";
        "The only conclusion I can come to is that you are";
        "I can conclude only that you are";
        "Clearly, you are";
        "You are clearly";|]) ^ " " ^ (pick dxs) ^ " " ^ (form())
    | 1 -> "As clear a case of " ^ (form ()) ^ " as I've ever seen"
    | 2 -> "Clearly a case of " ^ (form ())
    | 3 -> "Clearly a sad case of " ^ (form ())
    | 4 -> "The symptoms are remarkably reminiscent of " ^ (form()) ^ ", as described by " ^ (name()) ^ " in his famous treatise"
    | 5 -> "The obvious diagnosis is, of course, " ^ (form()) ^ (if chance 2 then ", though I remain skeptical" else "")
    | _ -> assert false

let () = Random.self_init (); print_string (msg ())

Added egret_txt.ml version [18174bc407].















































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
type root = R of string | I of string*string
type kind = Plain | Vowel | Uncountable
type word = root * kind
let pick a = a.(Random.int (Array.length a))
let words = [|
	(R "egret", Vowel);	(I("knife","knives"), Plain);	(I("child","children"), Plain);
	(R "owl", Vowel);		(R "dawn", Uncountable);	(R "dawn", Plain);
	(R "relic", Plain);		(R "home", Plain);				(R "hope", Plain);
	(R "tower", Plain);	(R "plain", Plain);					(R "fire", Plain);
	(R "fire", Uncountable);	(R "fear", Plain);			(R "fear", Uncountable);
	(R "whisper", Plain);		(R "furrow", Plain);			(R "field", Plain);
	(R "regret", Plain);		(R "blade", Plain);			(R "thing", Plain);
	(R "pillar", Plain);		(R "fate", Plain);				(R "doom", Plain);
	(R "candle", Plain);		(R "lantern", Plain);			(I("sky","skies"), Plain);
	(I("grass","grasses"), Plain);	(I("ash","ashes"), Vowel); (R "void", Plain);
	(R "stranger", Plain);		(R "blood", Uncountable);	(R "incompetence", Uncountable);
	(R "holiness", Uncountable);	(R "sorrow", Uncountable);	(R "gladness", Uncountable);
	(R "unkindness", Uncountable); (I("cruelty","cruelties"), Plain);
	(R "cruelty", Uncountable); (R "ember", Vowel); (R "throat", Plain);
|]
let adjs = [|
	"sorrowful";"fiery";"unkind";"fallow";"sallow";"hollow";"unending";"wondrous";
	"vapid";"dim";"shallow";"glorious";"empty";"failing";"dying";"crawling";"ashen";
	"furious";"frightened";"terrible";"awful";"eternal";"silent";"frightful";"timeless";
	"golden";"black";"white";"noble";"defunct";
|]
let verbs = [|
	R "burn", true;			R "fear",true;	R "slaughter",true;	R "explode",false;
	R "interrogate",true;	R "sleep",false;	R "despair",false;		R "dissolve",true;
	R "question",true;		R "slay",true;	R "stay",false;			R "fade",false;
	I("wonder at", "wonders at"),true;		R "linger",false;		R "die",false;
	I("cry out", "cries out"),false; I("cry out at","cries out at"),true;
	I("cry","cries"),false; R "weep", false;
	I("cry out to","cries out to"),true;
|]
let compl : root array = [| R "hope"; R "believe"; I("wonder if","wonders if"); |];;
let sg (r:root) : string = match r with
	| R x -> x
	| I(x,_) -> x;;
let pl (r:root) : string = match r with
	| R x -> x^"s"
	| I(_,x) -> x;;
let indef (w:word) : string = let (r,k) = w in (match k with
	| Plain -> "a "
	| Uncountable -> ""
	| Vowel -> "an ") ^ (sg r);;
	
let pron () = pick [|
	"it",false; "she",false; "he",false; "they",true;
	"we",true; "you",true;
|]
let accpron() = pick [|
	"it";"her";"him";"them";"us"
|]
let basenp () : string * bool= let w = pick words in 
	let (r,k) = w in
	let adj = pick [|(pick adjs) ^ " ";""|] in
	let rsg = adj ^ (sg r) in
	let rpl = adj ^ (pl r) in
	let sgs = [|
		indef w;
		"the " ^ rsg;
		"yon " ^ rsg;
		"this " ^ rsg;
		"that " ^ rsg;
		"my " ^ rsg;
		"some " ^ rsg;
		"your " ^ rsg;
		"her " ^ rsg;
		"our " ^ rsg;
		"its " ^ rsg;
		"their " ^ rsg;
		"his " ^ rsg;
	|] in let pls = [|
		pl r;
		"the " ^ rpl;
		"these " ^ rpl;
		"those " ^ rpl;
		"my " ^ rpl;
		"some " ^ rpl;
		"yonder " ^ rpl;
		"your " ^ rpl;
		"her " ^ rpl;
		"our " ^ rpl;
		"its " ^ rpl;
		"his " ^ rpl;
		"their " ^ rpl;
	|] in if k = Uncountable then (pick sgs,false) else pick [|(pick sgs,false);(pick pls,true)|]

let rec gp () : string*bool = let (n,p) = np () in (n ^ " of " ^ (let (n,_) = np() in n)), p
and relp () : string*bool = let (n,p) = basenp () in (n ^ " that " ^ (vp p)), p
and np () : string*bool = (pick [| basenp; basenp; basenp; gp; relp |])()
and pvp p =  let verb, trans = pick verbs in
				let v = (if p then sg else pl) verb in
				let n, _ = (pick [| np(); accpron(),false |]) in
					v ^ if trans then (" " ^ n) else ""
(* and cvp (p:bool) : string =
	let verb = (pick compl) in
	let v = (if p then sg else pl) verb in
	let n,p = (pick [|np;pron|])() in
	let d = decl n p in
	v ^ " " ^ d -- THIS IS HORRIBLY BROKEN *)
and vp p = pvp p
and decl n p = n ^ " " ^ (vp p) ^ (pick [|
	(fun()->".");
	(fun()->", and " ^ (s()));
	(fun()->", but " ^ (s()));
|]())
and idques n p = let n2, _ = np() in (if p then "are " else "is ")^n^" "^n2^"?"
and ques n p = (if p then "do " else "does ")^n^" "^(vp true)^"?"
and s () = let (n,p) = pick [|np;pron|] () in (pick [|decl;decl;ques;idques|]) n p;;
let rec times x f = if x > 0 then
		(f (); times (x-1) f)
	else
		();;
(*let () = Random.self_init ();
	times 10 (fun () -> let c = string_of_int ((Random.int 6)+1) in
		print_string ("\x1b[1;3"^c^"m-\x1b[0;3"^c^"m "^(s ()) ^ "\n"));;*)
let () = Random.self_init (); print_string ((s ()) ^ "\n");;

Added lib/bot-cs.scm version [aad6714882].

































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
(define-macro (rule . body)
  (define (make-cases ct body acc)
    (if (eq? body '()) acc
      (make-cases (+ ct 1) (cdr body)
		(cons (list (list ct) (cons 'string-append (car body))) acc))))
  (list 'define (car body)
	(cons 'case (cons (list 'random (length (cdr body)))
	  (make-cases 0 (cdr body) '()) ))))

(define {list1}
	(case (random ct)
		((0) (string-append {list2}))
		))

(define (pick ar)
	(vector-ref ar (random (vector-length ar))))

Added lib/bot-gambit.scm version [254cc82697].



























>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
(define-macro (rule . body)
  (define (make-cases ct body acc)
    (if (eq? body '()) acc
      (make-cases (+ ct 1) (cdr body)
		(cons (list (list ct) (cons 'string-append (car body))) acc))))
  (list 'define (car body)
	(cons 'case (cons (list 'random-integer (length (cdr body)))
	  (make-cases 0 (cdr body) '()) ))))

(define (pick ar)
  (vector-ref ar (random-integer (vector-length ar))))

(random-source-randomize! default-random-source)

Added monster.ml version [17f0b8d58f].



































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
let nouns = [|
	"verve"; "pulchritude"; "beneficence"; "dismay"; "wit";
	"cheer"; "glee"; "malevolence"; "wickedness"; "cruelty";
	"sagacity"; "splendor"; "pride"; "rage"; "fury"; "snazz";
	"foolishness"; "sleepiness"; "curiosity"; "brevity"; "lust";
	"confidence"; "bashfulness"; "awkwardness"; "terror";
	"accuracy"; "insanity"; "sorrow"; "gladness"; "weariness";
	"depression"; "passion"; "dread"; "popularity"; "vulgarity";
	"madness"; "compassion";
|]
let mods = [|
	"filled"; "overcome"; "shining"; "vivacious";
	"burning"; "blazing"; "morose"; "gleeful"; "mad";
	"shaking"; "howling"; "snarling"; "gruesome";
	"helpless"; "vibrant"; "desperate";
|]
let advs = [|
	"cruelly"; "angrily"; "madly"; "hopelessly"; "thoughtlessly";
	"wickedly"; "hopefully"; "quickly"; "speedily"; "furiously";
	"kindly"; "maniacally"; "tearfully"; "bashfully"; "angrily";
	"wondrously"; "splendidly"; "tremendously"; "badly";
	"terribly"; "foolishly"; "snazzily"; "toplessly"; "balefully";
	"beautifully"; "kindly"; "thoughtfully"; "cautiously";
	"severely"; "wisely";
|]
let adjs = [|
	"cheerful"; "wondrous"; "overwhelming"; "adorable";
	"snazzy"; "hopeful"; "desperate"; "lustful"; "dour";
	"sad"; "sorrowful"; "hopeless"; "all-consuming"; "mad";
	"cruel"; "dreadful"; "terrible"; "fearsome"; "inescapable";
	"thoughtless"; "vile"; "bashful"; "topless"; "naked"; "dire";
	"baleful"; "vulgar"; "beautiful"; "horrid"; "cautious";
	"violent"; "wise"; "supreme"; "marvelous";
|]
let verbs = [|
	"shines"; "toots"; "honks"; "mutters"; "whispers"; "growls";
	"roars"; "whuffles"; "warbles"; "howls"; "screams"; "shrieks";
	"quivers"; "dances"; "hops up and down"; "grins"; "mumbles";
	"counsels you"; "glares"; "stares at you"; "looks up"; "gazes at you";
	"marvels"; "laughs";
|]

let pick a = a.(Random.int (Array.length a))
type rule = R of string array | S of string | B of rule list | A of rule array | O of rule;;
let rec eval r : string = match r with
	| R x -> pick x
	| S x -> x
	| B x -> List.fold_left (^) "" (List.map eval x)
	| A x -> eval (pick x)
	| O x -> if Random.int 2 = 0 then eval x else ""
let syl () =
	let stop = R [| "p"; "t"; "k"; |] in
	let fric = R [| "s"; "f"; "h"; "x"; |] in
	let vstop = R [| "b"; "d"; "g"; |] in
	let vfric = R [| "z"; "v"; "gh"; |] in
	let liq = R [| "l"; "r"; "y"; "w"; |] in
	let nasal = R [| "n"; "m"; "ng"; |] in
	let obs = A [| stop; fric; vstop; nasal; liq; |] in
	let v = R [| "a"; "e"; "u"; "o"; "i"; "ee"; "oo"; "au"; "ai";"oi";|] in
	let sr = A [|
		B[obs; v; O obs];
		B[A [|stop;vstop;fric;vfric;|]; O liq; v; O obs];
	|] in eval sr
	;;
let prefixes = [| "ur-"; "dire "; "dire ur-"; "super " |]
let name () =
	let size = 1 + (Random.int 3) in
	let rec loop n acc = if n = 0 then acc else loop (n-1) (acc^(syl ())) in
	(if Random.int 2 = 0 then (pick prefixes) else "") ^ loop size "";;

let isvowel c = match c with
	| 'a' | 'e' | 'i' | 'o' | 'u' -> true
	| _ -> false;;
let indef x = if isvowel x.[0] then "an "^x else "a "^x;;
let encounter () = 
	let msgs = [|
		"you encounter";
		"you chance upon";
		"you find";
		"you run into";
		"you run straight into";
		"you trip over";
		"you stumble upon";
		"you happen upon";
		"egads!";
		"how wondrous!";
		"how marvelous!";
		"how gruesome!";
		"how splendid!";
		"oh no!";
	|] in
	let kinds = B [
			R [|"it";"she";"he";|]; S" ";
			A [|
				B[ R verbs; S " ";
					A [|
						B[ S "with "; O(B[R adjs; S" "]); R nouns;];
						R advs;
					|];
				];
				B[S"is "; O(B[R advs;S" ";]); R mods;
					O(B[ S " with "; O(B[R adjs; S" "]); R nouns;]);
				];
			|];
			S "!"; 
	] in
	(pick msgs)^" "^(indef (name()))^"! " ^ (eval kinds);;
	
let rec times n a = if n = 0 then () else (a (); times (n-1) a);;
let () = Random.self_init (); 
(*	times 20 (fun () ->*)
		print_string ((encounter ()) ^ "\n")
(*	)*)

Added namegen.c version [0fd8e31656].



































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
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
// No dependencies, just compile with "cc namegen.c -o namegen"
// replacing cc with your compiler of choice!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <stdbool.h> 

struct nametype {
	const char* name;
    size_t nouns, adjs, gens;
	bool default_article;
	size_t maxadj_n, maxadj_g, minadj_n, minadj_g;
    const char* names[];
};
 
struct nametype conspiracy = { "Conspiracy",
    18,76,72,true,
	3,3,0,0, {   // the horrible data structure here is so that we can keep everything
    //NOUNS         pertaining to the nametype in one place. I wish there were a better way.
        "Order", "Cult", "Temple", "Church", "Hand", "Eyes",
        "Source", "Keepers", "Maidens", "Servants", "Templars",
		"Followers", "Celebrants", "Rite", "Sect", "Guild",
		"Society", "School",
       
    //ADJECTIVES
        "Sanctified", "Blasphemous", "Red", "Yellow", "Ebon",
        "Ochre", "Eternal", "Perpetual", "Everlasting", "Black",
        "White", "Infinite", "Timeless", "Mad", "Terrible", "Sightless",
		"All-Seeing", "Third", "Second", "Endless", "Reviled",
		"Absolute", "Damned", "Cursed", "Blessed", "Lucid",
		"Unthinkable", "Nameless", "Unspeakable", "Glorious",
		"Cold", "Burning", "Shapeless", "Unknowable", "Lifeless",
		"Fatal", "Infernal", "Celestial", "Implacable", "Eldritch",
		"Dark", "Resolute", "Resplendant", "Unstoppable", "Blood-Soaked",
		"Endless", "Forgotten", "Iron", "Secret", "Hidden", "Fiery",
		"Ancient", "Silver", "Screaming", "Mighty", "Thousand-Year",
		"Jewelled", "Damnable", "Creeping", "All-Knowing",
		"All-Hearing", "Holy", "Global", "Leering", "Forty-Second",
		"Divine", "Faithful", "Ageless", "Steadfast", "Cruel",
		"Sapphire", "Sapphic", "Secluded", "Scarlet", "Shrieking",
		"Hollow",
       
    //GENS
        "Prince", "King", "Master", "Princess", "Queen", "Mistress",
        "Devourer", "Obliterator", "Destroyer", "0Doom", "0Death",  // this is extremely hacky
        "0Torment", "Serpent", "Moon", "One", "Two", "Three", "Four",
        "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Twelve",       //there is nothing menacing about the number 11
		"Eye", "God", "Horror", "Thing", "Flames", "Night", "Day",
		"Year", "Years", "Way", "Realm", "Path", "Light", "Fire",
		"Door", "Gate", "Plan", "Terror", "0Pain", "0Screams",
		"Road", "Spire", "Beast", "Flesh", "Sword", "Mountain",
		"River","Crown","Scepter","0Fires","Desecrator","Defiler",
		"Despoiler", "Ravager", "Rite", "Sea", "Ocean", "Chaos",
		"Goat", "Legion", "Pyramid", "Dragon", "Hand", "Pantheon",
		"Spirit", "Devil", "Gods",
    }
};
 
struct nametype government = { "Government",
	10,29,64,false,
	3,3,0,0, {
	//NOUNS
		"Kingdom", "Empire", "Republic", "Principality", "Federation",
		"State", "States", "Confederacy", "Powers", "Duchy",

	//ADJECTIVES
		"United", "Confederated", "Allied", "Unified", "Collective",
		"Democratic", "Republican", "Federated", "Glorious", "People's",
		"Socialist", "Soviet", "New", "Old", "Equatorial", "North",
		"South", "West", "East", "Southwest", "Northwest", "Northeast",
		"Southeast", "Great", "Superior", "Mostly Harmless", "Grand",
		"Nuclear", "Imperial",

	//GENS
		"America", "France", "Spain", "Megaspain", "Hyperfrance",
		"Space America", "Space France", "Arabia", "New Arabia",
		"Jersey", "Zealand", "York", "Manchester", "Britain",
		"Sloravia", "Azmenistan", "Arkansas", "Ruritania", "Kundu",
		"Earth", "Mars", "Pluto", "Kansas", "Nebtratucky", "Arkantucky",
		"Nebrahoma", "New Mexigon", "Hawaishington", "Qurac", "Persia",
		"Nevadakota", "Missisota", "Minnesippi", "Montanabraska",
		"Wyomissouri", "New Hampchigan", "Delachusetts", "Arkantexas",
		"Kentexas", "Bumbelch", "Nebravada", "Tennessaw", "Connectican't",
		"Oklatucky", "Oklabama", "Canuckistan",

		"Russia", "Scotland", "Tanzania", "Ireland", "Togo", "Taiwan",
		"Syria", "Senegal", "Serbia", "Paraguay", "Norway", "Korea",
		"Poland", "Smop",

		"Warsaw", "London", "Moscow", "Rome",
		
		"Goat",
	}
};

const struct nametype* alltypes[] = {&conspiracy, &government};

char* gen_name(const struct nametype* t) {
        size_t length=0;
       
        const char* noun = t->names[rand()%t->nouns];
        length=strlen(noun)+3;
		bool swaparticle;
        const char* gen = t->names[t->nouns + t->adjs + rand()%t->gens];
		if (gen[0]=='0') swaparticle=true, gen++; else swaparticle=false;
		if ((t->default_article && !swaparticle) || (!t->default_article && swaparticle)) {
			length+=4;
		}
        length+=strlen(gen)+1;
       
 
        size_t adjc_n = rand() % (t->maxadj_n-t->minadj_n+1) + t->minadj_n;
        size_t adjc_o = rand() % (t->maxadj_g-t->minadj_g+1) + t->minadj_g;
       
        const char** adjs_n = malloc(sizeof(size_t) * adjc_n);
        for (unsigned char i = 0; i<adjc_n; i++) {
                adjs_n[i] = t->names[t->nouns + rand()%t->adjs];
                length+=strlen(adjs_n[i])+1;
        } // ouch
       
        const char** adjs_o = malloc(sizeof(size_t) * adjc_o);
        for (unsigned char i = 0; i<adjc_o; i++) {
                adjs_o[i] = t->names[t->nouns + rand()%t->adjs];
                length+=strlen(adjs_o[i])+1;
        }
       
        char* name = malloc(length+1);
        name[0] = 0; //herp a derp were there some weird errors without this
        //strcat you are fucking evil
        for (size_t i = 0; i<adjc_n; i++) {
                strcat(name, adjs_n[i]);
                strcat(name, " ");
        }
        strcat(name, noun);
        strcat(name, " of ");
		if ((t->default_article && !swaparticle) || (!t->default_article && swaparticle)) strcat (name, "the ");
        for (size_t i = 0; i<adjc_o; i++) {
                strcat(name, adjs_o[i]);
                strcat(name, " ");
        }
        strcat(name, gen);
        
        free(adjs_o);
        free(adjs_n);
        return name;
}
 
int main() {
        srand(time(NULL));
		for (int c=0;c<sizeof(alltypes)/sizeof(struct nametype*);c++) {
	        for (int i=0;i<10;i++) {
                char* name = gen_name(alltypes[c]);
                printf("\x1b[1m%s %d:\x1b[0m The %s\n",alltypes[c]->name,i,name);
                free(name);
	        }
			putchar('\n');
		}
        return 0;
}

Added orderbot.ml version [d9583c873c].































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
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
let verbs = [|
	"repel"; "assail"; "bugger"; "degauss"; "murder";
	"slay"; "abort"; "avenge"; "fuck"; "defile"; "devour";
	"slaughter"; "spoil"; "eat"; "spank"; "seize"; "respect";
	"sacrifice"; "return"; "pursue"; "deny"; "purchase"; "buy";
	"inspect"; "despoil"; "censure"; "flog"; "elect"; "summon";
	"oust"; "expel"; "extirpate"; "hire"; "fire"; "assassinate";
	"torture"; "extract"; "rescue"; "incite"; "rouse"; "arouse";
	"eliminate"; "arrest"; "kidnap"; "confine"; "condemn";
	"import"; "export"; "exclude"; "make out with"; "kiss";
	"slap"; "punch"; "whip"; "evict"; "install"; "isolate";
	"compile"; "gather"; "banish"; "exile"; "defeat"; "battle";
	"alert"; "go after"; "track down"; "hunt down"; "locate";
	"find"; "transport"; "tolerate"; "impede"; "incinerate";
	"defend"; "impale"; "demoralize"; "pleasure"; "bomb";
	"lay waste to"; "raze"; "inspire"; "worship"; "exalt";
	"repair"; "rectify"; "duplicate"; "clone"; "avert"; "prevent";
	"pervert"; "cast out"; "throw down"; "bang"; "screw"; "do";
	"enslave"; "butcher"; "download"; "upload"; "kill"; "eradicate";
	"fight"; "stab"; "cut"; "steal"; "lacerate"; "chew"; "digest";
	"impound"; "impanel"; "gnaw on"; "respect";
|]

let adjs = [|
	"sleeping"; "thoughtful"; "insipid"; "thoughtless"; "wretched";
	"wrathful"; "Republican"; "Democratic"; "royal"; "earnest";
	"imperial"; "American"; "inspired"; "immoral"; "wistful"; "wondrous";
	"cheerful"; "giggling"; "wonderful"; "angry"; "silly"; "desperate";
	"warped"; "rotting"; "rancid"; "raging"; "cool"; "clever";
	"sneering"; "eternal"; "timeless"; "ancient"; "indecent"; "delightful";
	"scented"; "sexy"; "hot"; "arousing"; "rampant"; "randy"; "evil";
	"sacred"; "holy"; "satanic"; "unholy"; "blasphemous"; "repellent";
	"repulsive"; "fucking"; "worthless"; "grotesque"; "weeping";
	"goddamn"; "rebellious"; "revolutionary"; "young"; "national";
	"federal"; "government"; "presidential"; "international"; "public";
	"current"; "medical"; "fascist"; "buxom"; "apocalyptic";
	"boastful"; "boring"; "effulgent"; "exuberant"; "lugubrious";
	"noisome"; "German"; "germanic"; "cloned"; "perverted"; "fanatic";
	"arrogant"; "magic"; "magical"; "slutty"; "orgasmic"; "obedient";
	"frantic"; "wandering"; "exalted"; "luminous"; "towering";
	"little"; "communist"; "socialist"; "neoliberal"; "master's";
	"grand";
|]

type noun = R of string | M of string | I of string * string | P of string
let nouns = [|
	R "spanner"; R "clown"; R "beetle"; R "candidate"; R "asshole";
	R "queen"; R "king"; R "advisor"; R "sausage"; M "garbage";
	R "book"; I("cockroach","cockroaches"); R "virgin"; I("clitoris","clitorises");
	R "parking lot"; R "parking space"; R "coin meter"; R "car";
	R "burglar"; I("sheep","sheep"); R "bear"; M "rabble";
	R "burger"; R "waterfall"; R "hammer"; R "doorknob";
	R "pig"; R "cop"; R "bagel"; R "mayor"; R "president";
	R "detective"; R "inquisitor"; M "police"; R "teen";
	R "mustache"; R "heterosexual"; P "Inquisition"; R "general";
	I("titty","titties"); R "monkey"; I("empress","empresses"); R "emperor";
	R "dowager"; R "elixir"; R "cipher"; R "code"; R "secret";
	M "heterosexuality"; R "dudebro"; P "opposition"; I("cactus","cacti");
	R "candelabra"; I("furry","furries"); P "gays"; P "spawn"; I("roach","roaches");
	P "debt"; M "indecency"; R "waste"; M "yaoi"; R "American"; R "Russian";
	R "German"; R "fascist"; M "software"; R "pigeon"; R "king"; R "mob";
	P "mafia"; P "apocalypse"; R "clone"; R "pervert"; R "fucker"; R "dude";
	R "fanatic"; I("army","armies"); R "wall"; R "slut"; I("sorceress","sorceresses");
	R "sorcerer"; R "mage"; I("elf","elves"); I("industry","industries");
	R "orgasm"; R "bastard"; R "cult"; R "volunteer"; I("knife","knives");
	R "spire"; I("mistress","mistresses"); R "master"; R "communist"; R "socialist";
	R "conservative"; R "liberal"; I("volcano","volcanoes"); P "means of production";
	I("jury","juries"); R"imperative";
|]

let ppl = [|
	"asshole"; "jackass"; "mom"; "dad"; "mommy"; "daddy"; "granny";
	"auntie"; "senator"; "general"; "captain"; "ma'am"; "sir"; "your majesty";
	"milady"; "milord"; "sire"; "soldier"; "private"; "fool"; "you fool";
	"you idiots"; "girls"; "ladies"; "boys"; "men"; "folks"; "minister";
	"prime minister"; "mayor"; "inquisitor";
|]
let isVowel (x:char) : bool = List.mem x ['a';'e';'i';'o';'u';'A';'E';'I';'O';'U']
type articles = Definite | Indefinite | Zero
let rand a = a.(Random.int(Array.length a))
let np () : string = if (Random.int 5) == 0 then
		rand [|"me";"yourself";"her";"him";"them"|]
	else let n, art = match rand nouns with
		| R s -> rand [|
			s, rand [|Definite;Indefinite|];
			s^"s", rand [|Definite;Zero|];
		|]
		| I(s,p) -> rand [|
			s, rand [|Definite;Indefinite|];
			p, rand [|Definite;Zero|];
		|]
		| P x -> x, Definite
		| M x -> x, rand [|Definite;Zero|] in
	let sp = rand [|n; (rand adjs)^" "^n|] in match art with
		| Definite -> "the " ^ sp
		| Indefinite -> (if isVowel sp.[0] then "an " else "a ") ^ sp
		| Zero -> sp

type seqe = T of string | S | A of string array | F of (unit -> string) | R of seqe array | O of seqe | B of seqe list
let syntax = B [A verbs; S; F np;]
let seqs = R [|
	B[syntax; R[|
		B[T ". that is an order, "; A ppl;];
		B[T ", "; A ppl];
		B[T ", "; A ppl; T ". that is an order"];
	|]; R[| T "."; T "!"; |];];
	B[O(T"i command you, "); A ppl; T ", "; syntax; R[|
		T ".";
		T ". that is an order!";
		T ". it is the only option.";
		T ". and god help us all.";
		T ". otherwise, we're dead.";
		T " or die trying.";
		T "! now!";
	|];];
	B[
		O(T"it is imperative that you "); syntax;
		O(T " or die trying"); O(B[T", ";A ppl]); R[|
		T ".";
		T ". it is the only option.";
		T ". otherwise, god help us all.";
		T ". otherwise, we're dead.";
	|];];
	B[T "this is your last chance, "; A ppl; T ". "; syntax; O(R[|
			T " or you're a dead man";
			T " or you're a dead woman";
			T " or else";
			T " or you find out what we do to people who screw us";
			T " or we go after your family";
		|]); T ".";
	];
	B[ R[|
		T "you shouldn't ";
		T "you mustn't ";
		T "don't ";
		T "we mustn't ";
		T "we cannot allow you to ";
	|]; syntax; O(B[T ", "; A ppl]); T ".";];
	B[syntax; O(B[T ", "; A ppl]); T ", and to hell with the consequences!"];
	B[T "man up and "; syntax; O(B[T ", "; A ppl]); T "."];
	B[syntax; O(B[T ", "; A ppl]); T ", and face your death like a man!"];
	B[T "we're dead anyway, we might as well ";syntax;T".";];
	B[T "you're dead anyway, you might as well ";syntax;T".";];
|]
(* val eval : seqe -> string *)
let rec eval s = match s with
	| T x -> x
	| S -> " "
	| A arr -> rand arr
	| F f -> f ()
	| R s -> eval (rand s)
	| B s -> (List.fold_left (^) "" (List.map eval s))
	| O s -> if Random.int 2 = 0 then eval s else ""

let rec times i x = x (); if i > 0 then times (i-1) x
let () = Random.self_init();
	print_string (eval seqs);
	(* (times 10 (fun () -> print_string ("- "^(eval seqs)^"\n")));; *)

Added pharma.ml version [f8230bde94].

















































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
let suffixes = [| "tine"; "zone"; "done"; "dol"; "mycin"; "pentin"; "nine"; "cillin"; "mab"; "xone"; "xine"; "zine"; "dine"; "nyl"; "nil"; "codone"; "morphone"; "drene"; "phine"; "thine"; "toxin"; "xin"; "dioxin"; "lene"; "ne"; "pine"; "relin"; "gen"; "phen"; "fen"; "dem"; "lone"; "fen"; "line"; "but"; "te"; "xate"; "tal"; "mate"; "norphine"; "dal"; "phetamine"; "amphetamine"; "quel"; |]
let salts = [| "chloride"; "acetate"; "phosphate"; "hydrochloride"; "succinate"; "sulphate"; |]
let prefixes = [| "neo"; "retro"; "nor"; "tri"; "cycli"; "tetra"; "penta"; "methyl"; "nal"; "pro"; "metha"; "fenta"; "meta"; "hydro"; "fluoro"; "thieno"; "mal"; "eroto"; "diablo"; "miso"; "propy"; "ethy"; "buta"; "hexa"; "benzo"; "piperi"; "sado"; "maso"; "philo"; "theo"; "iso"; "cyclo"; "klepto"; "pyro"; "carba"; "ibu"; "masculo"; "phos"; "estro"; "endo"; "poly"; "bi"; "tri"; "cumulo"; "strato"; "dextro"; "sinistro"; "levo"; "dextra"; "sinistra"; "ecto"; "myco"; "canna"; "am"; |]
let onsets = [| "f"; "fl"; "fr"; "p"; "pr"; "pl"; "c"; "cr"; "cl"; "s"; "sc"; "scl"; "scr"; "ph"; "sph"; "phr"; "phl"; "ch"; "chr"; "chl"; "z"; "th"; "thr"; "r"; "x"; |]
let vowels = [| "a"; "e"; "i"; "o"; "u"; "y"; |]
let codas = [| "n"; "m"; "r"; "s"; "f"; |]
let pick a = a.(Random.int(Array.length a))
let range min max = min+(Random.int(max-min))

let syl () = match range 0 3 with
	| 0 -> (pick onsets) ^ (pick vowels) ^ (pick codas)
	| 1 | 2 -> (pick onsets) ^ (pick vowels)
	| _ -> (pick vowels) ^ (pick codas)
let rec cat op fn times =
	if times = 0 then "" else (op (fn()) (cat op fn (times-1)))

let drug () =
	let prefct = range 0 3 in
	let sylct = if prefct= 0 then range 1 3 else range 0 3 in
	(cat (^) (fun () -> pick prefixes) prefct) ^
	(cat (^) syl sylct) ^
	(pick suffixes) ^ 
	(if range 0 7 = 0 then " "^(pick salts) else "")
let () = Random.self_init (); print_string (drug ()); print_string "\n";

Added procbot.ml version [47c58b9925].





>
>
1
2
require "cinch"

Added procbot.rb version [d6b2e06ea9].































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
#!/usr/bin/ruby
# encoding: UTF-8
require "cinch"
Bots = ["cclg", "sext", "sect", "order", "monster", "pharma", "argue","crime","drug","badbio","bottist","egret_txt", "babdio", "botsoc","dx"]
ShoutingMatch = /\b(MS\.|MS\s|SERGEANT\s|SGT\s|SGT\.)?\s*(SAMANTHA TAGGART|SAMANTHA TAGUE|SAMANTHA|SAM TAGUE|SAM TAGGART|SAMTAGUE|SAMMY|SAM|TAGUE|TAGGART)\b/
SmallMatch = /\b(ms\.|ms\s|sergeant\s|sgt\s|sgt\.)?\s*(samantha taggart|samantha tague|samantha|sam tague|sam taggart|samtague|sam|sammy|tague|taggart|(ね|)サム|(ね|)サムさん|(ね|)サムちゃん|سام|يا سام)\b/i
FormalQs = [
	"How may I be of assistance",
	"Yes",
	"You rang",
	"What can I do for you today",
	"Yes",
	"You rang",
]
def mult(a,b)
	b.map{|bi| a.map{|ai| ai+bi}}.flatten
end
$lastcmd = ""
bot = Cinch::Bot.new do
	configure do |c|
		c.server = "irc.oftc.net"
		c.port = 6697
		c.channels = ["#crimehole"]
		c.nick = "samtague"
		c.user = "samtague"
		c.realname = "samantha taggart"
		#c.sasl.username = "sam-tague"
		#c.sasl.password = "bott-ist-tot"
		c.ssl.use = true
	end

	on :message, /\b(ms\.|ms\s|sergeant\s|sgt\s|sgt\.)?\s*(samantha taggart|samantha tague|samantha|sam tague|sam taggart|samtague|sam|tague|taggart|(ね|)サム|(ね|)サムさん|(ね|)サムちゃん|سام|يا سام)\b/i do |m|
		
		@m=m
		@shouting = false
		def reply(x)
			if @shouting
				@m.reply x.upcase
			else
				@m.reply x
			end
		end
		formality = :friendly
		msg = m.params[1]
		if par = ShoutingMatch.match(msg)
			@shouting = true
			cmd=msg.split(ShoutingMatch,2)
		elsif par = SmallMatch.match(msg)
			@shouting = false
			cmd=msg.split(SmallMatch,2)
		end
		ranks = {
			"velartrill" => ["Admiral", "Admiral Hale"].sample,
			"mtp" => "General",
			"^alex" => "General",
			"caurinus" => "Captain",
			"Riking" => "Lieutenant"
		}
		lowranks = [ "Corporal", "Private", "Trooper" ]
		user = m.user.nick
		if ranks.include?(user)
			rank=ranks[user]
		else
			rank="Commander"
		end
		cmd.map! {|x| x.strip}
		
		cmd[1].downcase!
		if cmd[1] == "ms" or cmd[1] == "ms."
			formality = :formal
			name = cmd[2].downcase
			action = cmd[3].downcase
		elsif cmd[1] == "sergeant" or cmd[1]=="sgt" or cmd[1]=="sgt."
			formality = :military
			name = cmd[2].downcase
			action = cmd[3]
		else
			formality = :friendly
			name = cmd[1].downcase
			action = cmd[2]
		end
		if action == ""
			action = cmd[0].downcase
			action.sub!(/\W*$/,'')
			greeting = ""
		else
			greeting = cmd[0].downcase
		end

		greetings = ["hey", "hi", "yo", "hello","hey there","hi there","yo there","heya","what up","oh shit","aw yeah","ahlan","hujambo","اهلن", "你好","morning","evening","afternoon","good morning","good evening","good afternoon", "buenos días", "buenos dias", "buenos tardes", "bonjour", "ciao", "bonsoir", "howdy"]
		if greetings.include?(action.sub(/^\W*/,'').sub(/\W*$/,''))
			greeting = action
			action = ""
		end
		action.sub!(/^\W*/,'')
		action.sub!(/^please/,'')
		action.sub!(/please$/,'')
		greeting.sub!(/^\W*/,'')
		greeting.sub!(/\W*$/,'')
		lowrank = false
		if formality == :military
			if action != ""
				if action.sub!(/^sir\b/i,'') or action.sub!(/\bsir$/i,'') 
					rank = lowranks.sample
					lowrank = true
					action.strip!
				end
			end
		end
		nulls = {
			:friendly => [
				"that's my name, don't wear it out",
				"yes?",
				"what's up?",
				greetings.sample,
				greetings.sample+", "+user,
				"what's going on?"
			],
			:formal => FormalQs.map {|x| x+"?"} + FormalQs.map {|x| x+", "+user+"?"},
			:military => lowrank ? [
				"Report, soldier!",
				"Stand down, " + rank + "!",
				"Hold your horses, " + rank + "!",
				rank + " " + user + "! Report!",
				"Report!"
			] : [
				"Sir!",
				"What's the situation, sir?",
				"What's the situation, "+rank+"?",
			]
		}
		affirmatives = {
			:friendly => [
				"sure thing.",
				"no problem.",
				"no worries.",
				"will do.",
				"np!",
				"sure!",
				"okay!"
			],
			:formal => [
				"Of course.",
				"Right away.",
				"At once.",
				"As you wish.",
				"Certainly.",
				"Pleased to assist.",
				"At your command."
			],
			:military => [
				"Sir yes sir!",
				"Ten-four!",
				"Wilco!",
				"Roger that!",
				"Roger that, sir!",
				"Roger!",
				"Wilco, sir!",
				"Wilco, "+rank+"!",
				"Roger, " +rank+"!",
			]
		}
		def scancmd(x,strs)
			strs.each { |str|
				return "" if x==str
				if x.start_with?(str)
					return x[str.length+1,x.length]
				end
			}
			return false
		end
		def perform(x,user)
			y=x.split(" ",2)
			if Bots.include?(y[0].downcase)
				$lastcmd = x
				msg = ""
				bot = "./"+y[0].downcase
				IO.popen(y.length == 2 ? [bot, y[1]] : bot) { |pd|
					msg = pd.read
				}
				return msg
			elsif scancmd(x,["what do you think","what are you thinking about","penny for your thoughts","what's your opinion","opinions"])
				$lastcmd="botsoc"
				return perform("botsoc",user)
			elsif scancmd(x,["again", "make another", "do another", "tell another", "make us another", "encore", "more", "do that again", "once more" "one more time", "do it again", "play it again"])
				if $lastcmd != "" then
					return perform($lastcmd,user)
				else
					return nil
				end
			elsif bot=scancmd(x,
				(mult((mult ["give","tell","make","invent","find","i want","we want","i'd like","we'd like","can i have","can we have","can i get","can we get","create","let's get","let's have","let's hear","lemme have","let me have"], [""," me", " us"]) +
					["make up", "come up with","do","how about","maybe"], [""," a", " an", " a new", " another", " more", " some", " some more"])+
					["more","another","a","a new","an","some"]).reverse)
					# this is the worst thing i have ever done
					# i am so sorry
				case bot
					when "crime", "crimes", "felony", "felonies"
						return perform("crime",user)
					when "word", "term", "weird word", "long word", "jargon", "obscure word",
						"words", "terms", "weird words", "long words", "obscure words"
						return perform("cclg",user)
					when "monster", "beast", "monsters", "beasts"
						return perform("monster",user)
					when "drug", "drugs","street drug","street drugs"
						return perform("drug",user)
					when "pill", "pills", "pharmaceutical", "pharmaceuticals", "legal drug", "legal drugs"
						return perform("pharma",user)
					when "bad bio", "bad bios", "bad twitter bio", "bad twitter bios"
						return perform("badbio",user)
					when "order", "orders", "my orders", "our orders", "our marching orders","plan of action","our plan of action","our strategy","strategy"
						return perform("order",user)
					when "sect", "cult", "sects", "cults"
						return perform("sect",user)
					when "sext"
						return perform("sext",user)
					when "argument", "arguments", "fight", "fights"
						return perform("argue",user)
					when "ideology", "anarchism", "politics", "belief", "creed", "joke"
						return perform("bottist",user)
					when "verse", "ominous statement", "line", "prophecy"
						return perform("egret_txt",user)
					when "analysis", "opinion", "opine"
						return perform("botsoc",user)
					when "diagnosis", "dx"
						return perform("dx",user)
				end
			elsif bot=scancmd(x,["fight with","fight"])
				$lastcmd = x
				return perform("argue",user)
			else
				return nil
			end
		end
		negatives = {
			:friendly => [
				"no can do",
				"sorry, not happening",
				"i don't know how",
				"what?",
				"huh?",
				"i'm confused",
				"????",
				"what are you asking me to do",
				"um, no?",
				"um, no??",
				"that's fucked up",
				"isn't that a little problematic",
				"what do you mean",
				"that doesn't make any sense",
				"i don't understand",
				"what are you talking about",
				"how?",
				"what's going on",
				"what's going on?",
				"im scared",
				"i'm scared",
				"calm down " + user,
				"what are you talking about, " + user,
				"i never understand what "+user+" is on about",
				"im dying",
				"help",
				"lol",
				"lmao",
				"what",
				"okay but why",
				"okay but how",
				"who do i need to kill",
				";)",
				"don't make me come over there",
				"oh really",
				"i won't",
				"no",
				"you can't make me",
				"try and make me",
				"not happening",
				"not gonna happen",
				"did you really think that would work",
				"did you really think that would work, " + user,
				"did you really think you'd get away with that",
				"did you really think you'd get away with that, " + user
			],
			:formal => [
				"I'm afraid I can't do that.",
				"I'm afraid that won't be possible.",
				"That won't be possible.",
				"No can do, I'm afraid.",
				"I don't think I can help you with that.",
				"I'm sorry to report that is beyond my capabilities at present.",
				"I don't think I can do that, I'm sorry to say.",
				"Goodness! I would never dream of such a thing.",
				"Certainly not! I have a reputation to think of.",
				"Could you rephrase that?",
				"I'm sorry, I don't think I understand"
			],
			:military => lowrank ? [
				"Not happening, "+rank+"!",
				"Don't even think about it, "+rank+"!",
				"Do I look like I was born yesterday, "+rank+"!",
				"Not happening, "+rank+" "+user+"!",
				"Don't even think about it, "+rank+" "+user+"!",
				"Do I look like I was born yesterday, "+rank+" "+user+"!",
				"Drop and give me twenty!",
				"That's it, you're on KP duty!",
				"No backtalk, maggots!"
			] : [
				"Negative, sir.",
				"Cannot comply, sir.",
				"Not possible, "+rank+".",
				"Negative, sir, we're pinned down!",
				"We don't have the troops for that, "+rank+"!",
				"Sorry, sir, there's nothing I can do."
			]
		}
		whoareyou = {
			:friendly => [
				"i'm sam!",
				"i'm sam tague!",
				"samantha taggart",
				"ash's sister",
				"ash's little sister",
				"ash's younger sister"
			], :formal => [
				"I am Samantha Taggart.",
				"My name is Samantha Taggart.",
				"Taggart. Samantha Taggart.",
				"The name is Samantha Taggart.",
				"The name is Taggart.",
				"Samantha Taggart, esquire."
			], :military => [
				"Sergeant Samantha Taggart reporting for duty, sir!",
				"Sergeant First Class Sam Taggart, sir!",
				"Sergeant Taggart, sir.",
				"Sergeant Taggart, sir. The boys call me Tague.",
				"Sergeant Taggart, sir. But you can call me Sam.",
				"Sergeant Taggart, sir. Call me Sam."
			]
		}
		goodgirl = {
			:friendly => [
				"^_^", ":)",
				"thanks!",
				"you're sweet",
				"just doing my job!",
				"that's really nice of you",
				"aw, do you mean it?",
				"aw, really?",
				"thank you!",
			], :formal => [
				"Of course. I aim to please.",
				"Happy to be of service.",
				"Just doing my job.",
				"It's my pleasure.",
				"I'm just glad I can be of service.",
				"You're too kind.",
				"You're far too kind.",
				"That's very kind of you.",
				"Why, thank you!",
				"It's good to feel appreciated.",
				"It's always good to feel appreciated.",
			], :military => [
				"Yes, sir!",
				"Sir, yes, sir!",
				"Roger that, sir!",
				"Thank you, sir!",
				"You're not so bad yourself, sir.",
				"Thank you, sir. And may I just say - it's been a pleasure serving under you, sir.",
				"Godspeed, sir!"
			]
		}
		dontcare = {
			:friendly => [
				"well you should care",
				"why not",
				"why don't you care",
				"you should care",
				"this matters, " + user,
				"then you don't understand",
				"caring is cool",
				"caring is cool tho"
			], :formal => [
				"May I submit that you should, in fact, care?",
				"I do not believe you appreciate the import of this matter.",
				"This is more important than you realize.",
				"I hope you will reconsider.",
				"Apathy helps no one.",
				"Apathy solves nothing.",
				"Your apathy is shameful."
			], :military => lowrank ? [
				"Didn't your momma ever tell you caring is cool, soldier?",
				"Don't give me that, "+lowranks.sample+"!",
				"Drop and give me twenty, you apathetic worm!",
				"You don't care? I don't care that you don't care! Drop and give me twenty!",
				"No backtalk!"
			] : [
				"With all due respect, sir, caring is cool, sir!",
				rank+", sir, I urgently request that you consider your position, sir!",
				"Sir, with all due respect, I believe you are mistaken as to the importance of the situation, sir.",
				"Sir, this situation is rapidly spiraling out of control.",
				"But "+rank+", this situation is rapidly spiraling out of control."
			]
		}
		thankyou = {
			:friendly => (mult ["np","no worries","sure thing","sure","ofc","of course","glad to help","don't worry about it","just glad to help","no problem","you got it"], ["", "!", "."]),
			:formal => [
				"You're welcome.",
				"You're very welcome.",
				"It was no trouble.",
				"It was no trouble at all.",
				"It was a pleasure.",
				"It was a pleasure, truly.",
				"It was my honor.",
				"I'm pleased to be of service.",
				"Pleased to be of service.",
				"Of course.",
				"Don't mention it.",
				"Oh, don't mention it."
			], :military => [
				"No thanks necessary, sir!",
				"Just doing my job, sir.",
				"It's what they pay me for, sir.",
				"Sir, yes, sir!"
			]
		}
		insults = {
				:friendly => [
					"i don't like you either, pal",
					"fuck you", "fuck you too",
					"get fucked", "fuck off", "suck this",
					"lick my clit", "lick my tits", "suck my clit",
					"suck my tits", "i'm gonna fuck you up",
					"big talk coming from you, "+user,
					"you're on my list now, "+user,
					"go fuck yourself",
					"i'll remember this",
					"do you kiss your momma with that mouth?",
					"die in a fire","get bent","go to hell",
					"wow rude", "chill out", "take a chill pill",
					"you need to calm down", "lmao",
					"get bent", "does it look like i give a fuck what you think about me",
					"you're problematic", "hey everyone "+user+" sucks donkey balls",
					"hey everyone "+user+" jacks off to schwarzenegger movies",
					"hey everyone "+user+" killed JFK",
					"hey everyone "+user+"'s actually just hundreds of lizards dressed up like a person",
					"hey everyone "+user+" uses diphenhydramine recreationally",
					"meanie", "why are you like this", "take that back",
					"you take that back", "you take that back right now",
					"you hurt my feelings", "don't hurt my feelings like that",
					"i thought we were friends!!", "you're a horrible person, "+user,
					"please stop being mean to me", "why are you so cruel"
				], :formal => [
					"How rude!", "Goodness!", "Goodness, how rude!", "Goodness gracious!",
					"You would do well to treat your betters with more respect than that.",
					"You've made an enemy today, "+user+".", "I won't tolerate such language!",
					"I won't tolerate such disrespect!",
					"I'm sorry, I was unaware my duties would include babysitting today!",
					"Please show yourself out.", "Your services will no longer be required.",
					"This is hardly the place for such infantile behavior.",
					"Why must you be like this?", "Unacceptable!",
					"Goodness gracious, why must you be like this?"
				], :military => [
					"What the hell did you just say to me, maggot?",
					"Insubordination!",
					"I'll have you flogged for this!",
					"You got an awful big mouth on you, "+lowranks.sample+". Let's see you wash the floor with it!",
					"Insubordination will not be tolerated!",
					"You'll hang for this!",
					"Out of line!",
					"You're out of line!",
					"You're out of line, soldier!",
					"Out of line, "+lowranks.sample+" "+user+"!",
					"You're out of line, "+lowranks.sample+" "+user+"!"
				]
			}
			if param=scancmd(action,["meet","this is","these are",
						"let me introduce you to","let me introduce",
						"allow me to introduce you to",
						"allow me to introduce",
						"say hi to","say hello to",
						"introduce yourself to"])
				param.sub!(/\W*$/,'')
				reply [
					"pleased","nice","good",
					"i'm so happy",
					"i'm so glad",
					"it's so nice",
					"it's so good"
				].sample+" to "+[
					"meet you",
					"get to meet you",
					"make your acquaintance"
				].sample+", "+param+(rand(2)==0 ? ". "+user+" has told me so much about you" : "")
			elsif param=scancmd(action,["good night","night","gnight","g'night","i'm going to bed","going to bed","im going to bed", "bedtime", "time for bed", "it's my bedtime","its my bedtime","nighty-night"])
				reply mult(["good night","night","sleep well","sleep tight","i wish you an enjoyable cycle of nocturnal hallucinations", "commencement of dormancy phase acknowledged"], ["", ", "+user, ", pesky flesh-creature", ", human", ", mortal"]).sample
			elsif param=scancmd(action,["i don't care","it doesn't matter","don't care","idc","nevermind","never mind","nvm","i don't give a shit","i don't give a fuck", "does it look like i care"])
				reply dontcare[formality].sample
			elsif param=scancmd(action,["fuck you","fuck off","go fuck yourself","get fucked","fu","get bent","diaf","die in a fire","screw you","you cunt","you bitch","you piece of shit","you scumbag","you sleazeball","you jackass","you asshole","you cockroach"])
				reply insults[formality].sample
			elsif param=scancmd(action,["thanks","thank you","i appreciate it", "ty", "thx", "obliged", "much obliged","appreciated","danke","gracias","merci","merci beaucoup","shukran","shukran jazeelan","asante","asante sana","arigatou","doumo arigatou", "ありがとう", "どうもありがとう", "どうもありがとうございます","شكران", "شكران جزيلاا"])
				reply thankyou[formality].sample
			elsif param=scancmd(action,["well done","good work","excellent work","good girl","nicely done","nice job","good job","perfect","you did well","excellent job","you did great","you did perfect","you did perfectly","wonderful","you did good","gj"])
				reply goodgirl[formality].sample
			elsif param=scancmd(action,["who are you","who do you think you are","who even are you","tell me who you are","tell us who you are","introduce yourself"])
				reply whoareyou[formality].sample
		elsif greeting==""
			if action==""
				reply nulls[formality].sample
			else
				result=perform(action,user)
				r=""
				if result != nil
					result.chomp!
					if formality != :friendly
						r=affirmatives[formality].sample+" "
						result[0] = result[0].upcase
						result += "." if not result=~/\W$/
					end
					reply r+result.chomp
				else
					reply negatives[formality].sample
				end
			end
		else
			if action==""
				if formality == :friendly
					reply (nulls[:friendly] + [
						greeting+" yourself"
					]).sample
				elsif formality == :formal
						r = greeting
						r[0]=r[0].upcase
						reply r +", " + user + "."
				elsif formality == :military
					if lowrank
						reply [
							"You're out of line, "+rank+"!",
							"Cut the chatter, soldier!",
							"Stow the chit-chat, "+rank+"!",
						].sample
					else
						reply rank+", sir!"
					end
				end
			else
				if formality == :military and lowrank
					reply negatives[formality].sample
					return
				end
				result=perform(action, user)
				r=""
				if result != nil
					result[0] = result[0].upcase if formality != :friendly
					r=affirmatives[formality].sample
					result.chomp!
					result += "." if not result=~/\W$/
					reply r+" "+result
				else
					reply negatives[formality].sample
				end
			end
		end
	end
	on :message, /daddy/i do |m|
		m.reply "NO DDLG"
	end
	on :message, /monad/i do |m|
		m.reply "NO HASKELL"
	end
	on :message, /satan/i do |m|
		lucy = ["hail satan", "ave satanas", "all glory to the prince of darkness"]
		lucy += lucy.map { |x| x.upcase }
		m.reply(mult(lucy, ["",".","!","!!","!!1"]).sample)
	end
	
	on :message, /there/i do |m|
		m.reply ["*they're","*their"].sample if rand(50)==0
	end
	on :message, /ableis[mt]/i do |m|
		m.reply ["stop saying that", "that word is banned",
		"that's not a word anymore, sorry", "you don't get to say that anymore", "nope"].sample 
		m.reply 'if you mean "harmful to disabled people," say that'
	end
	on :message, /your/i do |m|
		m.reply ["*you're","*yore"].sample if rand(50)==0
	end
	on :online, "velartrill" do |m|
		m.reply "ALL RISE"
	end
end

bot.start

Added ritebot.ml version [516880dfa0].











































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
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
(* please add your name/handle to the credits section here:
	- velartrill
    - riking27
   also see grammar at line 79 for further editing opportunities
*)
let adjs = [| "gleeful"; "putrescent"; "whimsical"; "looming"; "endless"; "infinite"; "final"; "lustful"; 
	"twilight"; "black"; "lunar"; "solar"; "whispering"; "sundered"; "lawless"; "threefold"; "sevenfold";
	"tenfold"; "manifest"; "heavenly"; "somber"; "shadowed"; "wandering"; "distant"; "vengeful";
	"fearful"; "mighty"; "shrieking"; "lofty"; "loathesome"; "faceless"; "silent"; "pale"; "crimson";
	"fiery"; "wondrous"; "spiteful"; "weary"; "hateful"; "forsaken"; "forbidden"; "mellifluous";
    "abyssal"; "innocent"; "bronzed"; "fine"; "poor"; "masterful"; "forgotten"; "lost"; "infernal";
    "merciful"; "merciless"; "reckless"; "wonderful"; "beloved"; "ancient"; "decrepit"; "abstract";
    "honorable"; "animated"; "bloody"; "dead"; "old"; "expired"; "new"; "fresh"; |]
let nouns = [| "orb"; "law"; "moon"; "night"; "fist"; "question"; "deceit"; "perception"; "regret";
	"wonder"; "terror"; "hope"; "lust"; "inception"; "manifestation"; "whole"; "sea"; "stone"; "earth";
	"door"; "gate"; "portal"; "tree"; "fear"; "might"; "egret"; "circle"; "pit"; "crevice"; "hand"; "face";
	"inferno"; "spite"; "loom"; "malice"; "vial"; |]
let forces = [| "prince"; "king"; "queen"; "archon"; "god"; "demon"; "lord"; "lady"; "thing"; "wind";
	"beast"; "terror"; "spirit"; "spirits"; "muse"; "sylph"; "fool"; "child"; "creature"; "drake"; |]
let kinds = [| "rite"; "ritual"; "spell"; "invocation"; "evocation"; "conjuration"; "abjuration"; "binding"; 
	"incantation"; "appeasement"; "craft"; "alchemy"; "transmutation"; "transmogrification"; "incitement";
    "debasement"; "blessing"; "consecrecation"; "desecration"; |]

(* two of these are combined to form a surname *)
let people_name_elts = [| "wind"; "horn"; "fear"; "sea"; "sun"; "sky"; "star"; "hand"; "cold"; "warm"; "sand";
	"soul"; "sin"; "pale"; "dark"; "dread"; "hammer"; "lust"; "rage"; "blood"; "fire"; "flame"; "over"; "blight";
    "thunder"; "time"; "space"; "void"; "light"; "mind"; "life"; "air"; "breath"; "heir"; "doom"; "stein"; "chill";
    "cool"; "love"; "just"; "drake"; "hell"; "war"; "wright"; "bone"; |] 

(* these precede surnames *)
let forenames = [| "abigail"; "mordred"; "morgan"; "samantha"; "rachael"; "cassandra"; "jedediah"; "zebediah";
    "malachi"; "malachiah"; "charles"; "jezebel"; "simon"; "simone"; "salamandrael"; "jehosaphat"; "josiah";
    "mandrake"; "jessifer"; "sophia"; "morgause"; "winfred"; "winnifred"; "jennifer"; "carlissa"; "carlotta";
    "carissa"; "melissa"; "xylinda"; "samedra"; "damara"; "kurloz"; "hans"; "vladimir"; |] 
    
(* titles prefix a name, i.e. Sir Abigail Lusthammer *)
let titles = [| "sir"; "king"; "lord"; "queen"; "empress"; "dame"; "madam"; "mistress"; "master"; "lady";
    "emperor"; "archmage"; "magister"; "archmagister"; "magistress"; "magistrix"; "archmagistress";
    "archmagistrix"; "knight"; "agent"; |] 
	
type node = R of string array | B of node array | OL of node list | O of node | L of node list | S of string

let pick a = a.(Random.int(Array.length a))
let range min max = min+(Random.int(max-min))
let rec eval n : string = match n with
	| R(n) -> pick n
	| OL(n) -> eval (O(L n))
	| B(n) -> eval (pick n) 
	| O(n) -> if range 0 2 = 0 then eval n else ""
	| L(n) -> List.fold_left (fun a b -> a ^ (eval b)) "" n
	| S(s) -> s

let people = L [ R people_name_elts; R people_name_elts; ]
let force = L [R adjs; S " "; R forces]
let attrib = L[OL[R titles; S" "]; OL[R forenames; S" "]; people; OL[S" the "; R adjs;];S"'s ";]
let ritual_name = B [|
	L [O attrib; OL[R adjs; S " "]; R kinds; S " of "; O(S "the "); OL[force; S "'s "]; OL[R adjs; S " "]; R nouns; ];
	L [attrib; OL[R adjs; S " "]; R nouns; ]
|]

let agents = [| "a child"; "a bird"; "an eagle"; "a thief"; "a king"; "a conqueror"; "a fool"; "a madman";
			"an innocent"; "a murderer"; "a virgin"; "a queen"; "a pauper"; "a fox"; "a girl"; "a boy";
            "a dying man"; "a drake"; "a beast"; "a spirit"; "a sylph"; "a seer"; "the wind"; |]
let liquids = B [| S "blood"; S "ale"; S "wine"; S "water"; S"sea-water"; S"river-water"; S"lake-water"; L[S "the blood of "; R agents]; |]
let liquid_containers = [| "chalice"; "ewer"; "goblet"; "bowl"; "waterskin"; "bottle"; "cask"; |]
let object_containers = [| "bowl"; "box"; "basket"; "chest"; |]
let surfaces = [| "plinth"; "platter"; "altar"; "plate"; |]
let objects = [| "stone"; "feather"; "orb"; "quill"; "knife"; "candle"; "bow"; "bullet";
	"necklace"; "charm"; "amulet"; "biscuit"; |]
let materials = [| "crystal"; "bone"; "iron"; "steel"; "copper"; "gold"; "silver"; "sapphire"; "opal";
	"jade"; "amethyst"; "quartz"; "diamond"; "emerald"; "tin"; "zinc"; "bismuth"; "sterling"; "bronze"; "blood"; |]
(* [optional[partorigin], bodyparts] *)
let bodyparts = [| "skull"; "femur"; "blood"; "tooth"; "toe"; "eye"; "eyeball"; "skin"; "hand"; "fingernail";
	"claw"; "toenail"; "tail"; "vertebra"; "backbone"; "heart"; "liver"; "spleen"; "womb"; "fetus"; "fin"; |]
let partorigin = [| "human"; "virgin"; "cow"; "dog"; "horse"; "beast"; "wolf"; "alligator"; "goat"; "bird";
	"crow"; "eagle"; "dove"; "pigeon"; "owl"; "elephant"; "bear"; "fox"; "buzzard";
    (* posessives *)
    "a beloved pet's"; "an innocent's"; "the target's"; "your"; "your"; "an intruder's"; |]

type thingkind = Liquid_container | Object_container | Surface | Object
type thing = {
	kind : thingkind;
	name : string;
	adj : string option;
	desc : string option;
}
let times = R[| "once"; "twice"; "thrice"; |]
let places = [| "in a dreadful ravine"; "in a forsaken village"; "at the bottom of the sea"; "on the moon";
			"in a grave"; "in a mausoleum"; "beneath a tree"; "where it should not have been"; "in the sea";
            "in a dwelling"; "in a forest"; |]
let desc =
	(* kinds *) B[|
		(* actions *) L[ B[|
			L[S"found";
				OL[S" "; R places];
				OL[S" by ";
					R(Array.concat [agents; [|"one who should not have found it"; |]])];
			];
			
			L[S"lost";
				OL[S" "; 
					R(Array.concat [places;[|"to the sea";|]])];
				OL[S" by "; 
					R(Array.concat [agents; [|"one who should not have lost it"; |]])];
			];
			L[S "stolen";
				OL[S" by "; 
					R(Array.concat [agents; [|"one who should not have stolen it"; |]])];
				OL[S" from "; 
					R(Array.concat [agents; [|"one who should not have lost it";"one who should not have stolen it";
					"one who should never have held it"; "its rightful owner"; "a vault"; "a castle"; "a beast"; |]])];
			];
			L[S "washed";
				OL[S" "; R[|
					"in the sea"; "in blood"; "beneath a waterfall"; "in a fountain"; "in a lake long-dry";
					"in tears"; "in tears of grief"; "in tears of joy";|]];
				OL[S" by "; 
					R(Array.concat [agents; [|"an elderly washerwoman"; |]])];
			];
		|];
		(* circumstances *) O(B[|
			S" at night";
			S" by chance";
			S" long ago";
			S" years ago";
			S" in the distant past";
			S" at noon";
			S" at dawn";
			S" in war";
            S" at war";
            S" for years";
            S" by accident";
		|]);
	];
    (* traits *) B[|
		L[times; S"-blessed"];
		L[times; S"-cursed"];
		S "black as night";
		S "red as blood";
        S "white as bone";
        S "blue as the sky";
        S "green as grass";
        S "bright as gold";
        S "old as time";
	|];
|]

let adj_material = L[ O(OL[R adjs; S" "]); OL[R materials; S" "]; ]
			
let newthing () : thing = let kind = pick [|Liquid_container; Object_container; Surface; Object;|] in {
	kind = kind;
	adj = pick[|None; Some(pick adjs)|];
	desc = pick[|None; Some(eval desc)|];
	name = match kind with
		| Liquid_container -> eval (L[adj_material; R liquid_containers])
		| Object_container -> eval (L[adj_material; R object_containers])
		| Surface -> eval (L[adj_material; R surfaces])
		| Object -> eval (B[|
			L[adj_material; R objects];
			L[OL[R partorigin; S" "]; R bodyparts;]
		|])}
let descthing t = (match t.adj with Some(s) -> s^" " | None -> "")^
	(*(String.uppercase_ascii()*) t.name^
	(match t.desc with Some(s) -> ", "^s | None -> "")


let ritual () =
	let name = eval ritual_name in
	let foci =
		let rec acc (times : int) : thing list = (newthing ()) :: (if times = 0 then [] else acc (times-1))
		in acc (range 0 10)
	in
	(String.uppercase_ascii(name))^"\n\n"^
	(pick [|"You will need:"; "Components:"; "Foci:"; "Ingredients:"; "Elements:"; "Materials:";
		"You must gather:"; "Necessary offerings:"|]) ^"\n"^
		(let rec enumerate_foci n f = match f with
			| x :: rs -> ((string_of_int n) ^ ") " ^ (descthing x) ^ "\n") ^ (enumerate_foci (n+1) rs)
			| [] -> "" in enumerate_foci 1 foci)
	
let () = Random.self_init (); print_string (ritual ());;

Added sectbot.ml version [870ab943c4].



























































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
type word = R of string | I of string * string
type apos = Obs | Size | Attrib | Shape | Age | Mid | Color | Origin | Material | Qual
let order adj = match (let _,a = adj in a) with
	| Obs -> 0 | Size -> 1 | Attrib -> 2 | Shape -> 3 | Age -> 4
	| Mid -> 5 | Color -> 6 | Origin -> 7 | Material -> 8 | Qual -> 9
type adj = string * apos
let adjs : adj array = [|
	"Sanctified", Obs; "Blasphemous", Obs; "Red", Color; "Yellow", Color;
	"Ebon", Color; "Ochre", Color; "Eternal", Age; "Perpetual", Age;
	"Everlasting", Age; "Black", Color; "White", Color; "Mad", Obs;
	"Infinite", Attrib; "Timeless", Age;  "Terrible", Obs; "Sightless", Obs;
	"All-Seeing", Mid; "Third", Obs;  "Second", Obs;  "Endless", Obs;
	"Reviled", Obs; "Absolute", Obs; "Damned", Obs; "Cursed", Obs;
	"Blessed", Obs; "Lucid", Obs; "Unthinkable", Obs; "Nameless", Obs;
	"Unspeakable", Obs; "Glorious", Obs; "Cold", Obs; "Burning", Obs;
	"Shapeless", Shape;  "Formless", Shape; "Unknowable", Obs; "Lifeless", Obs;
	"Fatal", Attrib; "Infernal", Origin; "Abyssal", Origin; "Celestial", Origin;
	"Implacable", Obs; "Dark", Color; "Resolute", Obs; "Resplendant", Color;
	"Unstoppable", Obs; "Blood-Soaked", Material; "Endless", Size;
	"Forgotten", Obs; "Iron", Material; "Bronze", Material; "Steel", Material;
	"Secret", Obs; "Hidden", Obs; "Fiery", Color; "Ancient", Age;
	"Silver", Material; "Silver", Color; "Screaming", Mid; "Mighty", Mid;
	"Thousand-Year", Qual; "Jewelled", Material; "Damnable", Mid; 
	"Creeping", Mid; "All-Knowing", Mid; "All-Hearing", Mid; "Holy", Mid;
	"Global", Mid; "Leering", Mid; "Forty-Second", Obs; "Divine", Mid;
	"Faithful", Mid; "Ageless", Age; "Steadfast", Attrib; "Cruel", Attrib;
	"Sapphire", Material; "Sapphic", Origin; "Secluded", Mid; "Scarlet", Color;
	"Shrieking", Mid; "Hollow", Mid; "Mild", Mid; "Wondrous", Obs;
|]
let subjects = [|
	"Order"; "Cult"; "Temple"; "Church"; "Hand"; "Eyes";
	"Source"; "Keepers"; "Maidens"; "Servants"; "Templars";
	"Followers"; "Celebrants"; "Rite"; "Sect"; "Guild";
	"Society"; "School"; "Gathering"; "Bearers"; "Guardians";
	
|]
let definite_objects = [|
	"Prince"; "King"; "Master"; "Princess"; "Queen"; "Mistress";
	"Devourer"; "Obliterator"; "Destroyer"; "Portal";
	"Serpent"; "Moon"; "One"; "Two"; "Three"; "Four";
	"Five"; "Six"; "Seven"; "Eight"; "Nine"; "Ten"; "Twelve";
	"Eye"; "God"; "Horror"; "Thing"; "Flames"; "Night"; "Day";
	"Year"; "Years"; "Way"; "Realm"; "Path"; "Light"; "Fire";
	"Door"; "Gate"; "Plan"; "Terror"; "Staff"; "Window";
	"Road"; "Spire"; "Beast"; "Flesh"; "Sword"; "Mountain";
	"River";"Crown";"Scepter"; "Desecrator";"Defiler";
	"Despoiler"; "Ravager"; "Rite"; "Sea"; "Ocean"; "Chaos";
	"Goat"; "Legion"; "Pyramid"; "Dragon"; "Hand"; "Pantheon";
	"Spirit"; "Devil"; "Gods"; "Rod"; "Glitch"; "Error";
	"Perversion";
|]
let zero_objects = [|
	"Doom"; "Death"; "Torment"; "Fires"; "Pain"; "Screams";
	"Fear"; "Terror"; "Whispers"; "Failure"; "Perversion";
|]

let pick (r : 'a array) : 'a = r.(Random.int(Array.length r))
let picks (r : ('b * ('a array)) list) : ('b * 'a) =
	let sum = List.fold_left (fun c (_,a) -> c + Array.length a) 0 r in
	let id = Random.int sum in
	let rec find i (l : (bool * ('a array)) list) =
		match l with (tag,a)::tl ->
		let sz = Array.length a in
			if sz > i then (tag, a.(i))
			else find (i-sz) tl
		| _ -> assert false
	in find id r;;
	
let adjp () =
	let flatten l = List.fold_left (fun a (s,_) -> a ^ " " ^ s) "" l in
	let rec pos adj (phr : adj list) =
		if (phr = []) then [adj]
		else if (order adj) > order (List.hd phr) then
			(List.hd phr) :: (pos adj (List.tl phr))
		else adj :: (List.tl phr)
	in let rec loop phr ct =
		if ct = 0 then pos (pick adjs) phr
		else loop (pos (pick adjs) phr) (ct-1)
	in flatten (loop [] (Random.int 4));;
	
let objp () = picks [(true, definite_objects); (false, zero_objects)]
let sect () = let a = adjp() in
	let a' = adjp() in
	let def,o = objp() in
	match Random.int 7 with		(* haaack *)
		| 0 -> "The " ^ (pick subjects) ^ " of the " ^ (let a,_ = pick adjs in a)
		| 1 -> "The " ^ (pick subjects) ^ " of " ^ (if def then "the " else "") ^ o
		| 2 -> "The" ^ a' ^ " " ^ (pick subjects) ^ " of " ^ (if def then "the " else "") ^ o
		| 3 -> "The" ^ a' ^ " " ^ (pick subjects) ^ " of the " ^ (let a,_ = pick adjs in a)
		| _ ->  "The" ^ a' ^ " " ^ (pick subjects) ^ " of" ^ (if def then " the" else "") ^ a ^ " " ^ o
		
let () = Random.self_init ();
	print_string (sect())

Added sextbot.ml version [96e435dd0f].

















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
type noun = R of string * string | V of string * string | M of string | Mv of string | Pn of string | Pnv of string
let sn n = R(n, n^"s")
let nouns = [|
	R("pussy", "pussies"); sn "cock"; R("penis", "penises"); sn "representative";
	R("minority","minorities"); sn "dick"; sn "breast"; sn "mouth"; sn "face";
	M "hair"; Pn "politics"; sn "soul"; sn "ear"; sn "nose"; sn "senator"; sn "kink";
	sn "girl"; sn "boy"; R("city","cities"); R("titty","titties"); sn "vagina"; sn "bot";
	sn "butt"; R("foot","feet"); R("moose","moose"); sn "daughter"; sn "cunt";
	sn "Bolshevik"; sn "goat"; sn "tentacle"; sn "uncle"; sn "queen"; sn "peer"; 
	R("party","parties"); R("cooch","cooches"); R("snooch","snooches"); sn "tit";
	V("ass","asses"); sn "gender"; sn "cop"; M "police"; sn "loser"; sn "king";
	sn "rifle"; sn "vibrator"; Pn "authorities"; R("box","boxes"); sn "orifice"; 
	sn "count"; sn "baron"; R("countess","countesses"); R("baroness","baronesses");
	R("thesis","theses"); M "praxis"; M "rope"; Pn "handcuffs"; sn "boob"; 
	sn "critique"; sn "slave"; sn "buttslut"; sn "idea"; sn "revolver"; sn "corpse";
	R("ideology","ideologies"); sn "beast"; sn "youth"; sn "tail"; sn "bulge";
	sn "tty"; sn "dongle"; sn "shell"; sn "result"; sn "argument"; sn "guitar"; 
	R("class","classes"); V("advance","advance"); sn "restraint"; sn "nipple"; 
	sn "orb"; M "junk"; sn "array"; R("matrix","matrices"); sn "crack"; sn "fork"; 
	R("mistress","mistresses"); V("assignment","assignments");
	R("switch","switches"); sn "sin"; sn "creep"; sn "Pope";  sn "weeb";
	sn "submission"; sn "strap"; sn "noun"; sn "verb"; R("cross","crosses"); sn "whip"; 
	M "faith"; Pn "beliefs"; Pn "panties";	 V("implement","implements"); 
	sn "text"; sn "book"; sn "grimoire"; sn "twink"; sn "blog"; sn "scandal"; 
	Pn "drugs"; Mv "evil"; M "good"; sn "moron"; sn "fuck"; sn "neck"; sn "cad"; 
	sn "fucker"; sn "stalker"; R("beauty","beauties"); sn "jock"; sn "people";
	sn "bro"; sn "president"; sn "nerd"; sn "rival"; sn "hacker"; sn "johnson"; 
	V("illusion","illusions"); sn "hand"; R("ash","ashes"); M "love"; sn "father";
	sn "mother"; R("boundary","boundaries"); sn "callout"; sn "appendage"; 
	sn "callout post"; sn "death"; R("witch","witches"); sn "limb"; sn "loophole";
	V("attack surface","attack surfaces"); sn "claw"; M "democracy"; sn "cannon"; 
	R("woman","women"); M "shit"; Mv "artillery"; R("facility","facilities"); 
	R("man","men"); sn "blog post"; R("knife","knives"); sn "moon"; M "truth";
	R("fetish","fetishes"); R("tummy","tummies"); sn "bunker"; sn "pigeon";
	V("orgasm", "orgasms"); sn "startup"; sn "throat"; sn "wizard"; sn "robe";
	sn "spell"; sn "fanfic"; sn "rack"; sn "thumbscrew"; sn "ballot"; sn "campaign";
	sn "gay"; sn "lesbian"; sn "mommyblog"; sn "widget"; sn "spine"; sn "hell";
	sn "candidate"; sn "dog"; sn "pig"; R("Tory","Tories"); sn "prime minister";
	V("outrage","outrages"); V("elf","elves"); R("dwarf","dwarves"); V("orc","orcs");
	V("ork","orks"); M "discourse"; V("imbecile","imbeciles"); sn "monolith";
	sn "scepter"; V("obelisk","obelisks"); sn "clit"; R("clitoris","clitorises"); M "porn";
	sn "wound"; sn "relationship"; sn "probe"; sn "porn"; sn "secret"; R("lady","ladies");
	V("anxiety","anxieties"); M "scum"; M "dirt"; M "trash"; R("witch","witches");
	M "steam"; M "smoke"; R("senpai","senpai"); R("kohai","kohai"); M "vore";
	R("sensei","sensei"); sn "meat"; R("staff","staves"); sn "rod"; M "terror";
	V("anus","anuses"); R("church","churches"); sn "debate"; sn "console";
	M "bondage"; M "discipline"; sn "catboy"; sn "catgirl"; sn "top"; sn "bottom";
	sn "submissive"; sn "dom"; sn "domme"; sn "prole"; sn "car"; sn "hat";
	sn "commander"; sn "general"; sn "sergeant"; sn "lieutenant"; sn "ensign";
	sn "captain"; sn "admiral"; sn "doctor"; Pn "steel beams"; R("furry","furries");
	V("insecurity","insecurities"); sn "limit"; sn "law"; sn "enchantment";
	R("postmaster general","postmasters general"); R("wench","wenches");
	sn "shame cube"; sn "government"; sn "laser"; M "blood"; M "sex";
	sn "mace"; sn "flail"; sn "neg"; sn "dome"; V("atom","atoms"); sn "chest";
	M "space"; sn "flaw"; sn "failure"; R("booty","booties"); sn "beaver";
	sn "governor"; sn "nuke"; sn "nuclear missile"; sn "nuclear warhead";
	V("ICBM","ICBMs"); V("electrode","electrodes"); Mv "abuse";
	sn "machine"; sn "fucker"; R("boris","borises"); R("gary","garies");
	sn "doom"; sn "pimp"; sn "shitpost"; Pnv "evils"; Pn "Crime Hole";
	
	R ("[REDACTED]","[REDACTED]");
	V ("[REDACTED]","[REDACTED]");
|]
type word = A of string | An of string
let adjs = [|
	A "gleaming"; A "bleeding"; A "stupid"; A "useless"; A "sexy";
	A "tight"; A "wet"; A "hard"; A "kinky"; A "pervy"; A "Republican";
	A "naughty"; A "filthy"; A "slutty"; A "revolutionary"; A"nuclear";
	A "counterrevolutionary"; A "hopeless"; A "satanic"; A "sex";
	A "nuclear sex"; A "lusty"; A "noble"; A "witty"; A "hot"; A "soft";
	A "steamy"; A "Marxist"; A "horny"; A "slutty"; A "lustful";
	A "lawful"; A "bold"; A "sophisticated"; A "winsome"; A "dumb";
	A "bulging"; A "throbbing"; A "scrawny"; A "problematic";
	A "duly appointed"; A "wondrous"; A "scandalous"; A "papal";
	A "holy"; A "whimpering"; A "Bluetooth-enabled"; A "fuckable";
	A "sentient"; A "Turing-complete"; A "redneck"; A "corrective";
	A "lawless"; A "lunar"; A "solar"; A "luminous"; A "repressive";
	A "sustainable"; A "wise"; A "wizardly"; A "sorcerous"; A "wizard";
	A "magic"; A "presidential"; A "campaign"; A "gay"; A "lesbian";
	A "regressive"; A "psychic"; A "sad"; A "happy"; A "humble";
	A "Tory"; A "sinister"; A "sick"; A "twisted"; A "moderate";
	A "horrific"; A "horrifying"; A "conservative"; A "sensible";
	A "meaningless"; A "luscious"; A "lucrative"; A "terror";
	A "secret"; A "snobby"; A "bratty"; A "mystical"; A "$300";
	A "$700"; A "$1000"; A "100-carat"; A "cool"; A "rad";
	A "radical"; A "terrorist"; A "firm"; A "dead"; A "decaying";
	A "submissive"; A "dominant"; A "moist"; A "humiliating"; 
	A "government sex"; A "government"; A "sext"; A "ballistic";
	A "government sext"; A "glistening"; A "blood"; A "strategic";
	A "laser"; A "government blood"; A "+1"; A "cursed"; A "space";
	A "space sex"; A "monumental"; A "restrained"; A "helpless";
	A "boring"; A "heterosexual"; A "monogamous"; A "hairy";
	A "sin"; A "sinful"; A "tactical"; A "rectal"; A "fucking";
	A "dread"; A "dread sex"; A "dread government"; A "pimp";
	A "dread government sex"; A "doom"; A "government doom";
	
	An "awful"; An "electronic"; An "electric"; An "ugly";
	An "illegal"; An "unlawful"; An "arcane"; An "undulating";
	An "appropriate"; An "inappropriate"; An "appropriative";
	An "eminent"; An "ominous"; An "oppressive"; An "anal";
	An "unsustainable"; An "outrageous"; An "insensitive";
	An "elfin"; An "elvish"; An "elfin sex"; An "elvish sex";
	An "esoteric"; An "exotic"; An "abusive"; An "austere";
	An "embarrassing"; An "erotic"; An "imperial";
	An "immaculate"; An "evil"; An "evil government";
	An "evil sex"; An "evil elf"; An "evil gay";
|]
let pick (r : 'a array) : 'a = r.(Random.int(Array.length r))
let coin () = if Random.int 2 = 0 then true else false
let getform p noun = match noun with 
		| Mv (n) | M(n) -> n
		| Pn (n) | Pnv(n) -> n
		| V(sg,pl) -> (if p then pl else sg)
		| R(sg,pl) -> (if p then pl else sg);;
		
let stat noun = let plural = match noun with 
		| Mv (_) | M(_) -> false
		| Pn (_) | Pnv(_) -> true
		| _ -> coin() in
	let form, vl = match noun with
		| V(sg,pl) -> if plural then pl,true else sg,true
		| R(sg,pl) -> if plural then pl,false else sg,false
		| Mv(n) -> n,true
		| M(n) -> n,false 
		| Pn(n) -> n,true 
		| Pnv(n) -> n,true in plural, form, vl;;

let bnp force_sg : string * bool = let noun = pick nouns in
	let p, form, vl = stat noun in
	let plural = if force_sg then false else p in
	let dets = Array.append [| "my"; "your"; "the"; "some"; |]
		(if plural then [| "these"; "those"; |] else [| "this"; "that"; |]) in
	let adj = if coin () then None else Some (pick adjs) in
	(if Random.int 5 = 0 then
		if plural then form else match adj with
		| None -> if vl then "an "^form else "a "^form
		| Some(A(n)) -> "a "^n^" "^form
		| Some(An(n)) -> "an "^n^" "^form
	else (pick dets) ^(
		match adj with
			| None -> ""
			| Some(A(n)) | Some(An(n)) -> " "^n
	)^" "^form),plural;;
	

type form = Bare | Sg | Ppl | Ing
type verb = (form -> string option -> string)
let actions' : verb array ref = ref [||]
let np () = let base, number = bnp false in 
	let n = match Random.int 30 with
		| 0 -> base ^ " of " ^ (let b,_ = bnp false in b)
		| 1 -> base ^ " of " ^ ((pick !actions') Ing (if coin() then None else Some (
			getform true (pick nouns)
		)))
		| 2 -> base ^ " of " ^ (match pick adjs with A(n) | An(n) -> n) ^
			" " ^ ((pick !actions') Ing None)
		| 3 -> (let b,_ = bnp true in b) ^ "'s " ^ (getform (coin()) (pick nouns))
		| _ -> base
	in (n,number);;
	
let strn () = let n,_ = np() in n

let svb (sg,pl,ing,ppl) : verb = (fun f obj -> let o = match obj with
		| None -> ""
		| Some x -> " "^x
	in (match f with
		| Bare -> sg
		| Sg -> pl
		| Ppl -> ppl
		| Ing -> ing)^o)
let phrvb (sg,pl,ing,ppl) prep = (fun f obj -> let o = match obj with
		| None -> ""
		| Some x -> " "^x
	in (match f with
		| Bare -> sg
		| Sg -> pl
		| Ppl -> ppl
		| Ing -> ing)^o^" "^prep)
let ppvb (sg,pl,ing,ppl) prep = (fun f obj -> let o = match obj with
		| None -> ""
		| Some x -> " "^x
	in (match f with
		| Bare -> sg
		| Sg -> pl
		| Ppl -> ppl
		| Ing -> ing)^o^" "^prep^" "^(strn()))
let svt x = (x,x^"s",x^"ing",x^"ed")
let svte x = (x^"e",x^"es",x^"ing",x^"ed")
let evt x = (x,x^"es",x^"ing",x^"ed")

let simple_verbs : verb array = [|
	svb (svt "yank");
	svb (svte "delet");
	svb (svt "compress");
	svb (svt "fuck");
	svb (svt "sext");
	svb (svt "spank");
	svb (svt "smack");
	svb (svt "fork");
	svb ("slap", "slaps", "slapping", "slapped");
	svb (evt "publish");
	svb (evt "punish");
	svb (evt "kiss");
	svb (svt "stay");
	svb (svt "laser");
	svb (svt "censor");
	svb (svt "tweet");
	svb ("vore","vores","voring","vored");
	svb ("bite","bites","biting","bitten");
	svb (evt "dox");
	svb ("police", "polices", "policing", "policed");
	svb (svt "inspect");
	svb ("defile", "defiles", "defiling", "defiled");
	svb ("@", "@s", "@'ing", "@'ed");
	svb ("shoot","shoots","shooting","shot");
	svb ("ship","ships","shipping","shipped");
	svb ("stun","stuns","stunning","stunned");
	svb (svte "mutilat");
	svb (svte "criticiz");
	svb ("debunk","debunks","debunking","debunked");
	svb (svte "critiqu");
	svb ("smite", "smites", "smiting", "smitten");
	svb ("verify", "verifies", "verifying", "verified");
	svb (svt "restrain");
	svb ("inflect", "inflects", "inflecting", "inflected");
	svb ("whip", "whips", "whipping", "whipped");
	svb (svte "squeez");
	svb (svt "pull");
	svb (svt "flatten");
	svb (svt "crush");
	svb (svte "abus");
	svb ("cut", "cuts", "cutting", "cut");
	svb ("dispel", "dispels", "dispelling", "dispelled");
	svb ("split", "splits", "splitting", "split");
	svb (svte "throttl");
	svb (svte "strangl");
	svb (svt "slaughter");
	svb (svte "grop");
	svb (svte "vap");
	svb (svt "sever");
	svb (svt "stalk");
	svb (svt "mock");
	svb ("stab", "stabs", "stabbing", "stabbed");
	svb (svt "snort");
	svb ("ban", "bans", "banning", "banned");
	svb ("oppress", "oppresses", "oppressing", "oppressed");
	svb ("suppress", "suppresses", "suppressing", "suppressed");
	svb ("depress", "depresses", "depressing", "depressed");
	svb (svt "sadden");
	svb (svte "curs");
	svb (svte "vot");
	svb (svt "disrupt");
	svb (svte "humbl");
	svb (svt "fucc");
	svb (svt "69");
	svb (svt "cuck");
	svb ("snap", "snaps", "snapping", "snapped");
	svb (svte "pleasur");
	svb (svte "pleas");
	svb (svt "cuff");
	svb (svt "melt");
	svb (svte "deprecat");
	svb (svte "debat");
	svb (svt "dick");
	svb ("bleed", "bleeds", "bleeding", "bled");
	svb (svt "finger");
	svb (svt "exploit");
	svb ("portscan", "portscans", "portscanning", "portscanned");
	svb ("bully", "bullies", "bullying", "bullied");
	svb (svt "enchant");
	svb ("steal", "steals", "stealing", "stolen");
	svb (svt "yiff");
	phrvb (svt "yiff") "up";
	svb (svt "duel");
	svb (svt "repeal");
	svb (svt "twist");
	svb (svt "abolish");
	svb (svte "punctur");
	svb (svte "roboticiz");
	svb ("wiretap", "wiretaps", "wiretapping", "wiretapped");
	svb ("do", "does", "doing", "done");
	svb (svt "dial");
	svb (svte "enslav");
	svb ("neg", "negs", "negging", "negged");
	svb (svt "slander");
	svb (svt "smear");
	svb (svt "sex");
	svb (svte "censur");
	svb (svte "exoticiz");
	svb (svte "romanticiz");
	svb (svt "bombard");
	svb (svte "seduc");
	svb (svt "despoil");
	svb (svt "destroy");
	svb (svte "ravag");
	svb (svt "ravish");
	svb (svt "plunder");
	svb ("[REDACTED]","[REDACTED]","[REDACTED]","[REDACTED]");
	svb (svte "delud");
	svb (svt "redact");
	svb (svte "denigrat");
	svb (svte "expung");
	svb (svt "insert");
	ppvb (svt "insert") "in";
	svb (svt "lick");
	svb (svt "defeat");
	svb (svt "defend");
	svb (svte "interrogat");
	svb (svte "tortur");
	svb (svt "shock");
	svb (svte "scandaliz");
	svb ("beat","beats","beating","beaten");
	svb (svt "obey");
	svb (svt "disobey");
	svb (svt "doom");
	svb (svt "pimp");
	svb (svt "dissect");
	svb (svt "transcend");
	svb (svte "exorcis");
	svb (svte "compil");
	svb (svte "decompil");
|]

let complex_verbs : verb array = [|
	svb ("laugh at","laughs at","laughing at","laughed at");
	svb ("shoot at","shoots at","shooting at","shot at");
	svb ("shout at","shouts at","shouting at","shouted at");
	phrvb (svt "fuck") "up";
	phrvb (evt "mess") "up";
	phrvb ("hold","holds","holding","held") "down";
	phrvb (evt "push") "down";
	phrvb (svt "knock") "down";
	phrvb ("tie","ties","tying","tied") "down";
	phrvb ("tie","ties","tying","tied") "up";
	ppvb ("tie","ties","tying","tied") "up with";
	ppvb ("tie","ties","tying","tied") "to";
	phrvb ("take","takes","taking","taken") "offline";
	phrvb ("take","takes","taking","taken") "apart";
	ppvb ("take","takes","taking","taken") "out of";
	phrvb ("take","takes","taking","taken") "out";
	ppvb ("take","takes","taking","taken") "out for";
	phrvb ("beat","beats","beating","beaten") "up";
	phrvb ("beat","beats","beating","beaten") "off";
	ppvb ("beat","beats","beating","beaten") "up with";
	ppvb (svte "shov") "onto";
	ppvb (svte "shov") "off";
	ppvb (svte "shov") "out of";
	ppvb (svte "shov") "down";
	ppvb (svt "smack") "in";
	ppvb (svt "smack") "right in";
	ppvb (svt "smack") "with";
	ppvb ("slap", "slaps", "slapping", "slapped") "with";
	ppvb ("slap", "slaps", "slapping", "slapped") "in";
	ppvb ("slap", "slaps", "slapping", "slapped") "right in";
	phrvb ("slap", "slaps", "slapping", "slapped") "silly";
	phrvb ("slap", "slaps", "slapping", "slapped") "off";
	ppvb (evt "punish") "with";
	ppvb (evt "kiss") "on";
	phrvb (svt "connect") "to the internet";
	ppvb (svt "connect") "to";
	ppvb (svt "disconnect") "from";
	phrvb (svt "disconnect") "from the internet";
	ppvb ("put","puts","putting","put") "in";
	ppvb (svt "lock") "in";
	phrvb ("shoot","shoots","shooting","shot") "down";
	ppvb ("shoot","shoots","shooting","shot") "in";
	phrvb ("set","sets","setting","set") "on fire";
	phrvb ("set","sets","setting","set") "to 'stun'";
	phrvb ("get","gets","getting","gotten") "all over";
	ppvb ("get","gets","getting","gotten") "all over";
	phrvb ("spill","spills","spilling","spilt") "all over";
	ppvb ("spill","spills","spilling","spilt") "all over";
	phrvb ("strap","straps","strapping","strapped") "down";
	ppvb ("strap","straps","strapping","strapped") "to";
	phrvb ("keep","keeps","keeping","kept") "out";
	ppvb ("keep","keeps","keeping","kept") "in";
	phrvb ("keep","keeps","keeping","kept") "down";
	ppvb ("keep","keeps","keeping","kept") "out of";
	svb ("beg for","begs for","begging for","begged for");
	ppvb (svte "forc") "into";
	ppvb ("ship","ships","shipping","shipped") "with";
	svb ("submit", "submits", "submitting", "submitted");
	svb ("submit to", "submits to", "submitting to", "submitted to");
	svb ("conjugate", "conjugates", "conjugating", "conjugated");
	svb ("decline", "declines", "declining", "declined");
	ppvb ("inflict", "inflicts", "inflicting", "inflicted") "on";
	ppvb (svt "restrain") "with";
	ppvb ("whip", "whips", "whipping", "whipped") "with";
	svb ("bind", "binds", "binding", "bound");
	ppvb ("bind", "binds", "binding", "bound") "with";
	ppvb ("bind", "binds", "binding", "bound") "to";
	svb (svt "respect");
	svb (svt "disrespect");
	svb (svte "dictat");
	ppvb (svte "dictat") "to";
	svb ("control", "controls", "controlling", "controlled");
	svb (svt "follow");
	svb (svt "unfollow");
	svb (svte "simulat");
	svb (svte "stimulat");
	svb (svte "relocat");
	ppvb (svte "reloca") "to";
	svb (svte "lik");
	svb (svte "crav");
	svb ("deny", "denies", "denying", "denied");
	ppvb (svte "argu") "with";
	svb ("argue with", "argues with", "arguing with", "argued with");
	svb (svte "conjur");
	phrvb (svte "conjur") "up";
	svb ("conjure upon", "conjures upon", "conjuring upon", "conjured upon");
	svb (svt "detect");
	ppvb (svte "disabus") "of";
	ppvb ("cut", "cuts", "cutting", "cut") "with";
	ppvb ("cut", "cuts", "cutting", "cut") "up with";
	phrvb ("cut", "cuts", "cutting", "cut") "up";
	phrvb ("cut", "cuts", "cutting", "cut") "off";
	svb (svte "disassembl");
	svb (svt "clean");
	phrvb ("tidy", "tidies", "tidying", "tidied") "up";
	svb ("tidy", "tidies", "tidying", "tidied");
	ppvb (svte "disassembl") "with";
	phrvb (svt "mock") "online";
	phrvb (svt "mock") "on the internet";
	phrvb (svt "mock") "on Twitter";
	phrvb (svt "call") "out";
	phrvb (svt "call") "names";
	svb ("sin with", "sins with", "sinning with", "sinned with");
	phrvb (svt "call") "out";
	svb ("jerk it to", "jerks it to", "jerking it to", "jerked it to");
	svb ("get off on", "gets off on", "getting off on", "got off on");
	phrvb (svt "exploit") "for sex";
	svb (svte "eviscerat");
	svb (svt "dismember");
	svb (svte "dislocat");
	svb (svte "decriminaliz");
	svb (svte "legaliz");
	svb (svte "disparag");
	svb (svte "evolv");
	svb ("evolve into", "evolves into", "evolving into", "evolved into");
	svb ("devolve into", "devolves into", "devolving into", "devolved into");
	svb (svte "appropriat");
	svb (svte "downvot");
	svb (svte "upvot");
	
	svb (svte "standardiz");
	svb ("commune with", "communes with", "communing with", "communed with");

	svb (svt "devour");
	svb (svte "demoniz");
	phrvb (svte "vot") "into office";
	phrvb (svte "vor") "into office";
	svb ("vote for", "votes for", "voting for", "voted for");
	svb ("spit on", "spits on", "spitting on", "spat on");
	svb ("shit on", "shits on", "shitting on", "shat on");
	svb ("sit on", "sits on", "sitting on", "sat on");
	svb (svte "demoraliz");
	svb ("whisper to", "whispers to", "whispering to", "whispered to");
	svb (svt "discern");
	svb (svt "disgust");
	svb (svt "offend");
	svb (svt "disdain");
	svb (svt "resent");
	svb ("lie to", "lies to", "lying to", "lied to");

	ppvb ("rub", "rubs", "rubbing", "rubbed") "with";
	ppvb ("rub", "rubs", "rubbing", "rubbed") "on";
	ppvb ("rub", "rubs", "rubbing", "rubbed") "all over";
	ppvb ("rub", "rubs", "rubbing", "rubbed") "down with";
	phrvb ("rub", "rubs", "rubbing", "rubbed") "down";
	ppvb ("grind", "grinds", "grinding", "ground") "on";
	ppvb (svt "fill") "with";
	svb (svt "fill");
	phrvb ("snap", "snaps", "snapping", "snapped") "off";
	svb ("bleed on", "bleeds on", "bleeding on", "bled on");
	svb (svt "wound");
	svb (svt "harm");
	svb (svte "prob");
	ppvb (svte "prob") "for";
	svb (svte "automat");
	svb ("watch", "watches", "watching", "watched");
	svb (svt "monitor");
	svb (svte "observ");
	svb ("expel", "expels", "expelling", "expelled");
	ppvb ("expel", "expels", "expelling", "expelled") "from";
	svb ("throw", "throws", "throwing", "thrown");
	phrvb ("throw", "throws", "throwing", "thrown") "out";
	ppvb ("throw", "throws", "throwing", "thrown") "into";
	svb ("sing about", "sings about", "singing about", "sung about");
	svb ("sing for", "sings for", "singing for", "sung for");
	svb ("sing with", "sings with", "singing with", "sung with");
	svb (svt "deflect");
	svb (svte "resembl");
	svb (svte "consol");
	svb ("write about", "writes about", "writing about", "written about");
	svb (svt "honor");
	ppvb (svt "honor") "with";
	svb (svt "dishonor");
	ppvb (svt "dishonor") "with";
	svb ("extol the virtues of", "extols the virtues of", "extolling the virtues of", "extolled in virtue");
	svb (svte "disciplin");
	svb (svte "dominat");
	svb ("top", "tops", "topping", "topped");
	svb (svte "servic");
	svb (svte "serv");
	svb (svt "download");
	svb (svt "upload");
	svb (svt "hack");
	svb (svte "friendzon");
	svb (svte "vindicat");
	svb (svte "shame cub");
	svb (svte "sham");
	svb ("fux", "fuxes", "fuxing", "fuxed");
	phrvb (svt "duel") "to the death";
	ppvb (svt "duel") "for";
	ppvb (svt "duel") "to death for";
	ppvb (svt "duel") "to the death for";
	svb (svte "kinksham");
	ppvb (svte "punctur") "with";
	ppvb (svte "penetrat") "with";
	svb (svt "enter");
	phrvb (svt "dial") "up";
	phrvb (svt "tweet") "up";
	svb ("tweet at","tweets at","tweeting at","tweeted at");
	svb (svte "placat");
|]

let trverbs = Array.append simple_verbs complex_verbs;;

actions' := simple_verbs

let trvp (f : form) : string = if Random.int 15 != 0 then ((pick trverbs) f (Some (strn ())))
	else ((pick simple_verbs) f (Some (strn ()))) ^ " to death"
let vp (f : form) : string = ((pick trverbs) f None)

let titles = [| 
	"mistress"; "master"; "lady"; "lord"; "señora"; "mademoiselle"; "señor"; "monsieur"; "bro";
	"daddy"; "mommy"; "slave"; "girl"; "boy"; "fucktoy"; "senator"; "fuckslave"; "manslave";
	"slut"; "buttslut"; "uncle"; "buttslave"; "professor"; "princess"; "prince"; "father"; "sir";
	"friar"; "president"; "dear"; "your holiness"; "your grace"; "your excellency"; "your worship";
	"your honor"; "milady"; "milord"; "mister"; "missy"; "congressman"; "your eminence";
	"your imperial majesty"; "your majesty"; "miss"; "babe"; "Mr. Chairman"; "Mr. President";
	"Madam Secretary"; "Madam President"; "cuntslave"; "prime minister"; "minister"; "sire";
	"senpai"; "kohai"; "sensei"; "commander"; "general"; "sergeant"; "lieutenant"; "ma'am";
	"captain"; "admiral"; "doctor"; "ensign"; "madame"; "maîtresse"; "maître"; "cap'n"; "baby";
	"babe"; "comrade"; "citizen";
|]
let bareadj () = match pick adjs with A(a) | An(a) -> a;;

let clause () = let n, pl = np () in
	n ^ " " ^ (trvp (if pl then Bare else Sg));;
let (^^) s c = s ^ (String.make 1 c);;
let capitalize_each s = 
	let rec loop (i : int) (o : string) (sp : bool) = 
		if i = (String.length s) then o
		else match s.[i] with
			| ' ' -> loop (i+1) (o^^' ') true
			| 'a'..'z' as c -> if sp
				then loop (i+1) (o^^(Char.uppercase_ascii c)) false
				else loop (i+1) (o^^c) false
			| _ as c -> loop (i+1) (o^^c) false
	in loop 0 "" true
let spell () = let name = (pick trverbs) Bare (Some(match pick nouns with
	| R(sg,pl) | V(sg,pl) -> pick [|sg;pl|]
	| M(n) | Mv(n) | Pn(n) | Pnv(n) -> n)) in capitalize_each name
let ivb f = pick [|
	(fun () -> (pick trverbs) f (Some "you"));
	(fun () -> (pick trverbs) f (Some "you"));
	(fun () -> (pick trverbs) f (Some "ye"));
	(fun () -> (pick trverbs) f (Some "myself"));
	(fun () -> (pick trverbs) f (Some "myself"));
	(fun () -> (pick trverbs) f (Some "meself"));
	(fun () -> (trvp f));
	(fun () -> (trvp f));
|]();;
let uvb f = pick [|
	(fun () -> (pick trverbs) f (Some "yourself"));
	(fun () -> (pick trverbs) f (Some "me"));
	(fun () -> (pick trverbs) f (Some "yourself"));
	(fun () -> (pick trverbs) f (Some "me"));
	(fun () -> (pick trverbs) f (Some "yeself"));
	(fun () -> (trvp f));
|]();;
let rec tpls = [|
	(fun () -> clause());
	(fun () -> "I like "^(strn()));
	(fun () -> "I'm "^(strn()));
	(fun () -> "I'm always "^(strn()));
	(fun () -> "I'm always a slut for "^(strn()));
	(fun () -> "I'm always "^(strn())^" for "^(strn()));
	(fun () -> "I'm always "^(bareadj())^" for "^(strn()));
	(fun () -> "I, um, I "^(ivb Bare));
	(fun () -> "I, um, "^(ivb Bare));
	(fun () -> "you, um, you "^(uvb Bare));
	(fun () -> "you, um, "^(uvb Bare));
	(fun () -> "I like to "^(ivb Bare));
	(fun () -> "I like to, how you say, "^(ivb Bare));
	(fun () -> "I'm gonna "^((pick simple_verbs) Bare (Some "you"))^" silly and call you \""^(pick titles)^"\"");
	(fun () -> "you "^((pick simple_verbs) Bare (Some "me"))^" silly and call me \""^(pick titles)^"\"");
	(fun () -> ((pick simple_verbs) Bare (Some "me"))^" silly and call me \""^(pick titles)^"\"");
	(fun () -> "you want to be "^((pick simple_verbs) Ppl None)^" silly and called \""^(pick titles)^"\"");
	(fun () -> "I want to "^(ivb Bare));
	(fun () -> "let me "^(ivb Bare));
	(fun () -> "I wanna "^(ivb Bare));
	(fun () -> "I'm gonna "^(ivb Bare));
	(fun () -> "I'm going to "^(ivb Bare));
	(fun () -> "I need to "^(ivb Bare));
	(fun () -> "I gotta "^(ivb Bare));
	(fun () -> "you need to "^(uvb Bare));
	(fun () -> "you need to be "^((pick trverbs) Ppl None));
	(fun () -> "you gotta "^(uvb Bare));
	(fun () -> "you must not "^(uvb Bare));
	(fun () -> "you wouldn't "^(uvb Bare));
	(fun () -> "don't make me "^(ivb Bare));
	(fun () -> "I force you to "^(uvb Bare));
	(fun () -> "you force me to "^(ivb Bare));
	(fun () -> "I'm "^(bareadj ()));
	(fun () -> "I'm gonna make you "^(bareadj ()));
	(fun () -> "you're "^(bareadj ()));
	(fun () -> "this is "^(bareadj ()));
	(fun () -> "this is very "^(bareadj ()));
	(fun () -> "this is deeply "^(bareadj ()));
	(fun () -> "you have to "^(uvb Bare)^" if you want to be my "^(pick titles));
	(fun () -> "I "^(ivb Bare));
	(fun () -> "I cast "^(spell ()));
	(fun () -> "I need to cast "^(spell ()));
	(fun () -> "don't make me cast "^(spell ()));
	(fun () -> "I cast "^(spell ())^" on you");
	(fun () -> "don't make me cast "^(spell ())^" on you");
	(fun () -> "I cast "^(spell ())^" on myself");
	(fun () -> "I need to cast "^(spell ())^" on myself");
	(fun () -> "you cast "^(spell ()));
	(fun () -> "you need to cast "^(spell ()));
	(fun () -> "you cast "^(spell ())^" on me");
	(fun () -> "you need to cast "^(spell ())^" on me");
	(fun () -> "you cast "^(spell ())^" on yourself");
	(fun () -> "you need to cast "^(spell ())^" on yourself");
	(fun () -> "I'm "^(ivb Ing));
	(fun () -> "I've "^(ivb Ppl));
	(fun () -> "you've "^(uvb Ppl));
	(fun () -> "you "^(uvb Bare));
	(fun () -> "look me in the eye when I "^(pick trverbs) Bare (Some "you"));
	(fun () -> "keep your eyes on "^(strn())^" while I "^(ivb Bare));
	(fun () -> "you must really want to be "^(vp Ppl)^(if coin() then "" else " by "^(strn())));
	(fun () -> "you must really want me to "^(ivb Bare));
	(fun () -> "you must really want "^(strn())^" to "^(trvp Bare));
	(fun () -> "you're gonna get "^(vp Ppl));
	(fun () -> (if coin() then "please " else "") ^ "put "^(strn())^" in "^(strn())^(if coin() then "" else ", and then "^(trvp Bare)));
	(fun () -> (trvp Bare));
	(fun () -> "please " ^ (trvp Bare));
	(fun () -> ((pick trverbs) Bare (Some "me")) ^ " and " ^ ((pick trverbs) Bare (Some "me")));
	(fun () -> (pick tpls)() ^" so I can "^(ivb Bare));
	(fun () -> (pick tpls)() ^" hard");
	(fun () -> (pick tpls)() ^" harder");
	(fun () -> (pick tpls)() ^", if that's alright");
	(fun () -> (pick tpls)() ^", in the Biblical sense");
	(fun () -> (pick tpls)() ^" - in the Biblical sense");
	(fun () -> (pick tpls)() ^", if you don't mind");
	(fun () -> (pick tpls)() ^", if you know what I mean");
	(fun () -> "um, " ^ (pick tpls)());
	(fun () -> "arrrr, " ^ (pick tpls)());
	(fun () -> "yarrr, " ^ (pick tpls)());
	(fun () -> "well, " ^ (pick tpls)());
	(fun () -> "you know, " ^ (pick tpls)());
	(fun () -> "haha, " ^ (pick tpls)());
|]
let epithets = [| "lover"; "punk"; "slut"; "slave"; "fuck"; "fucker"; "toy"; "eater"; "snob"; "lord"; "-ass"; "boy"; "girl"; "bro"; "-man"; "man";|]
let rec mtpls = [| (* haaaaack *)
	(fun () -> (pick tpls)());
	(fun () -> (pick tpls)());
	(fun () -> (pick tpls)());
	(fun () -> (pick tpls)()^"~");
	(fun () -> (pick tpls)()^"?");
	(fun () -> (pick tpls)() ^", right?");
	(fun () -> (pick tpls)() ^" - no homo");
	(fun () -> (pick tpls)() ^" - no hetero");
	(fun () -> (pick tpls)() ^", but no homo");
	(fun () -> (pick tpls)() ^", yeah?");
	(fun () -> (pick tpls)() ^", alright?");
	(fun () -> "wanna "^(uvb Bare)^"?");
	(fun () -> "wanna "^(uvb Bare)^", if you know what I mean?");
	(fun () -> (pick tpls)() ^", "^(pick titles));
	(fun () -> (pick tpls)() ^", "^(pick titles)^"~");
	(fun () -> "hey "^(pick titles)^", "^(pick tpls)());
	(fun () -> (pick tpls)() ^", "^(pick titles)^"-san");
	(fun () -> (pick tpls)() ^", "^(pick titles)^"-kun");
	(fun () -> (pick tpls)() ^", "^(pick titles)^"-sama");
	(fun () -> (pick tpls)() ^", "^(pick titles)^"-chan");
	(fun () -> (pick tpls)() ^", "^(pick titles)^"-tan");
	(fun () -> (pick tpls)() ^", "^(pick titles)^"-senpai");
	(fun () -> "please, "^(pick tpls)() ^", "^(pick titles)^"-san");
	(fun () -> "please, "^(pick titles)^"-san, "^(pick tpls)());
	(fun () -> (pick tpls)() ^", "^(match pick nouns with R(n,_) | V(n,_) | M(n) | Mv(n) | Pn(n) | Pnv(n) -> n)^"-san"); (* yeesh *)
	(fun () -> (pick tpls)() ^", you "^(match pick nouns with R(n,_) | V(n,_) | M(n) | Mv(n) | Pn(n) | Pnv(n) -> n)^(if coin() then "" else (pick epithets))); (* yeesh *)
	(fun () -> (pick tpls)() ^", you "^
		(match pick adjs with A(a) | An(a) -> a)^" "^
		(match pick nouns with R(n,_) | V(n,_) | M(n) | Mv(n) | Pn(n) | Pnv(n) -> n)
		^(if coin() then "" else (pick epithets))); (* yeeeeeeeeeeesh *)
|]
let rec ntpls = [|
	(fun name -> (pick tpls)() ^", "^name);
	(fun name -> (pick tpls)() ^", "^name);
	(fun name -> (pick tpls)() ^", "^name);
	(fun name -> (pick tpls)() ^", "^name);
	(fun name -> (pick tpls)() ^", "^name);
	(fun name -> (pick tpls)() ^", "^name^"~");
	(fun name -> (pick tpls)() ^", "^name^"~");
	(fun name -> (pick tpls)() ^", "^name^" - no homo");
	(fun name -> (pick tpls)() ^", "^name^" - no hetero");
	(fun name -> "Hey "^name^", "^(pick tpls)());
	(fun name -> "Hey "^name^", "^(pick tpls)());
	(fun name -> "Hey "^name^", "^(pick tpls)());
	(fun name -> "Hey "^name^", "^(pick tpls)());
	(fun name -> "Hey "^name^", "^(pick tpls)()^"~");
	(fun name -> "Hey "^name^", "^(pick tpls)()^" - no homo");
	(fun name -> "Hey "^name^", "^(pick tpls)()^" - no hetero");
	(fun name -> "Hey "^name^", "^(trvp Bare));
	(fun name -> "Hey "^name^", "^(trvp Bare));
	(fun name -> "Hey "^name^", "^(trvp Bare));
	(fun name -> "Hey "^name^", "^(trvp Bare));
	(fun name -> "Hey "^name^", "^(trvp Bare)^"~");
	(fun name -> "Hey "^name^", "^(trvp Bare)^" - no homo");
	(fun name -> "Hey "^name^", "^(trvp Bare)^" - no hetero");
|]
let () = Random.self_init ();
	if (Array.length Sys.argv = 1) || (Sys.argv.(1) = "") then print_string (String.capitalize_ascii ((pick mtpls)()))
	else print_string (String.capitalize_ascii ((pick ntpls) (String.trim Sys.argv.(1))));
	print_string "\n";
	

Added threat.ml version [dc6a67ba01].





































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
let range min max = min+(Random.int (max-min))
let pick ar = ar.(range 0 (Array.length ar))
let rule (items : string list Lazy.t array) = let syntax = Lazy.force(pick items) in
    List.fold_left (^) "" syntax 
let choice ar = Lazy.force(pick ar)
type person = {
    nom : string;
    gen : string;
    acc : string;
}

let victims = [|
    {nom="you";gen="your";acc="you"};
|]
let insults = [|
    "bitch"; "cunt"; "freak"; "douchebag";
    "bastard";
|]
let action victim = rule [|
    lazy ["port "; victim.acc; " to lisp"];
    lazy ["rain on "; victim.gen; " parade"];
|]
let intros () =
    let vocative () = match range 0 3 in
        | 0 -> "you"
        | 1 -> pick insults
        | 2 -> "you, " ^ (pick insults) in
    rule [|
        lazy ["listen up, "; vocative (); "!
|]
let threat () = (intros()) ^ " " ^ (action (pick victims)) 
let () =
    Random.self_init();
    print_string (threat ())

Added threat.scm version [c3beb2da63].





















































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
(include "bot.scm")

(define actors
  '#(me you thou they him her myself "your mother" "your mom" "your father"
	"your dad" "your aunt" "your uncle" "your dog"))

(define pronouns '(
  (you    (nom . "you")  (acc . "you")  (gen . "your")  (poss . "yours")  )
  (thou   (nom . "thou") (acc . "thee") (gen . "thy")   (poss . "thine")  )
  (they   (nom . "they") (acc . "them") (gen . "their") (poss . "theirs") )
  (him    (nom . "he")   (acc . "him")  (gen . "his")   (poss . "his")    )
  (her    (nom . "her")  (acc . "her")  (gen . "hers")  (poss . "hers")   )
  (me	  (nom . "I")    (acc . "me")   (gen . "my")    (poss . "mine")   )
  (myself (nom . "I") 	 (acc . "myself") (gen . "my own") (poss . "my own"))))

(define (conjugate v t n)
  (if (eq? v 'cop)
	(case (cons t n)
	

(define (inflect c n)
  (if (string? n)
	(case c
	  ((nom acc)  n)
	  ((gen poss cop) (string-append n "'s")))
	; else
	(cdr (assq c (cdr (assq n pronouns))))))

(rule (action victim)
  ("port " victim " to lisp")
  ("rain on " victim "'s parade"))

(rule (subject actor)
  ((inflect 'cop actor) " gonna")
  ((inflect 'nom actor) " swear"))
  
(print
  (inflect
	(pick '#(nom acc gen poss))
	(pick actors)))

;(print (action "you"))