3
« : Апрель 13, 2014, 04:59:41 pm »
Завёл как-то в чятике разговор про "Карманный компьютер фанатов научной фантастики Станислава Лема", теперь Петрушка всё ждёт, когда я его запрограммирую на жестоком языке под названием Компонентный Паскаль.
Мне пока лень заниматься обработкой строк на языке для этого совершенно не предназначенном, сделал на хацкеле:
import System.Random
data L = L String [L]
земля :: L
земля = L "Земля" [ L "сгорает и" все_гибнут
, L "замерзает и" все_гибнут
, L "падает на Солнце и" все_гибнут
, L "учёные" [ L "создают" мал_огр
, L "открывают" мал_огр ]
, L "подвергается нашествию" мал_огр
, L "сталкивается с огромной кометой и" разрушается
]
все_гибнут = [ L "все гибнут" конец
, L "почти все гибнут" конец ]
конец = []
мал_огр = [ L "маленьких" существ
, L "огромных" существ ]
разрушается = [ L "разрушается" конец
, L "не разрушается, но" все_гибнут
, L "остаётся невредимой" конец ]
существ = [ L "насекомых" которые
, L "пресмыкающихся" которые
, L "роботов" которые
, L "внеземных существ" которые
, L "марсиан" которые
, L "селенитов" которые
, L "внегалактических чудовищ" которые
, L "различных странных предметов" которые
]
которые = [ L "которые" делают_всякое ]
делают_всякое = [ L "желают наших женщин" ((L "похищают их и исчезают" конец)
: являются)
, L "ведут себя дружелюбно" конец
, L "ведут себя дружелюбно, но их никто не понимает" являются
, L "не понимают нас" являются
, L "отлично понимают нас" являются
, L "воспринимают нас только как пищу" ((L "и съедают нас" конец)
: являются)
]
являются = [ L "и являются" [ L "радиоактивными" и
, L "нерадиоактивными" и ] ]
и = [ L "и" [ могут_быть_уничтожены
, не_могут_быть_уничтожены ] ]
могут_быть_уничтожены =
L "могут быть уничтожены" [ L "толпой парней с факелами" конец
, L армией конец
, L "атомной бомбой" конец ]
не_могут_быть_уничтожены =
L "не могут быть уничтожены" [ L "толпой парней с факелами" но
, L армией но
, L "атомной бомбой" но ]
армией = "сухопутной армией, морским флотом, авиацией, морской пехотой и (или) "
++ "войсками береговой охраны"
но = но_учёные : но_парень : но_они
но_учёные = L "но учёные изобретают новое оружие" которое
но_парень = L "но" [ L "один хитрый парень убеждает их что люди 'OK'" ok
, L "священник рассказывает им о Боге" ok
, L "влюбляются в красивую девушку" (женятся : ok)
]
которое = [ L "которое отказывает" но_они
, L "которое их убивает" конец
, L "которое превращает их в мерзкие глыбы" конец
]
ok = [ L "и они умирают" конец
, L "и они улетают" конец
, L "и они превращаются в мерзкие глыбы" конец
]
женятся = L "и женятся и живут долго и счастливо" конец
но_они = [ L "но они умирают от чёрной оспы" конец
, L "и поэтому они убивают нас" конец
, L "и поэтому они устанавливают систему доброжелательной диктатуры" конец
, L "и поэтому они съедают нас" конец
]
сюжет :: L -> [Int] -> String
сюжет (L str []) _ = str
сюжет (L str vs) (x:xs) = str ++ " " ++ сюжет v xs
where v = vs !! (x `mod` length vs)
main = do
stdgen <- getStdGen
let rs = randomRs (1, 100) stdgen
putStrLn $ сюжет земля rs