{-# LANGUAGE GADTs, RecordWildCards, FlexibleInstances
#-}
import Control.Applicative
import Data.Function
import Data.List
goatse = do
g <- choice' ["g", "9", "6", "Г", "Γ", "r"]
o <- choice' ["0", "о", "ο", "()"]
a <- choice' ["a", "4", "α", "@"]
t <- choice' ["t", "7", "+", "т", "m", "τ"]
s <- choice' ["s", "5", "с", "σ", "c", "$"]
e <- choice' ["e", "3", "е", "ε"]
let str
= concat [g
, o
, a
, t
, s
, e
] {- ideone не ест юникодики, не беда -- введём костыль (ниже) -}
choice' = choice . (zip [1..])
class Monad m => MonadVoretion m where
-- | Bernoulli distribution. Returns either of the arguments with
-- certain probability
fork :: Float -- ^ Probability of the first value
-> a -- ^ First value
-> a -- ^ Second value
-> m a
-- | Aborts execution if some condition isn't met
guard
:: Bool -- ^ Condition -> m ()
data Sample m a where
Fork :: {
_metaInfo :: !m
, _left
, _right :: r
, _next :: r -> Sample m a
} -> Sample m a
-- | Val is just a pure value
Val :: {
_unVal :: a
} -> Sample m a
-- | Guard checks some expression and backtracks if it isn't true
Guard :: {
_metaInfo :: !m
, _guarded :: Sample m a
} -> Sample m a
Zero :: Sample m a
fmap f a
@Val
{_unVal
=v
} = a
{_unVal
=f v
} fmap f a
@Fork
{..} = Fork
{ _next
= \a
-> fmap f
$ _next a
, ..
}
fmap f a
@Guard
{..} = Guard
{ _guarded
= fmap f
_guarded
, ..
}
instance Applicative (Sample m) where
pure a = Val a
Val
{_unVal
=f
} <*> a
= fmap f a
Fork{..} <*> a = Fork {
_next = \x -> (_next x) <*> a
, ..
}
Zero <*> _ = Zero
Guard{..} <*> a = Guard {
_guarded = _guarded <*> a
, ..
}
instance Monad (Sample m
) where Val{_unVal=v} >>= f = f v
Fork{..} >>= f = Fork {
_next = \a -> _next a >>= f
, ..
}
Zero >>= _ = Zero
Guard{..} >>= f = Guard {
_guarded = _guarded >>= f
, ..
}
class Default a where
deFault :: a
instance Default () where
deFault = ()
instance (Default m) => MonadVoretion (Sample m) where
fork b x y = Fork {
_metaInfo = deFault
, _left = x
, _right = y
, _bias = b
, _next = \a -> Val{_unVal=a}
}
guard False = Zero
guard True = Guard {
_guarded = Val ()
, _metaInfo = deFault
}
choice
:: MonadVoretion m
=> [(Float, a
)] -> m a
where
go (pc:tp) ((p,x):t) = do
c <- fork (p/pc) True False
if c then
else
go tp t
cobenation
:: Float -> Sample
() b
-> [(Float, b
)]cobenation ε = go 1
where
go _ Zero = []
go n _ | n<ε = []
go n Val{_unVal=v} = [(n, v)]
go n Guard{_guarded=g} = go n g
go n Fork{_bias=b, _next=f, _left=l, _right=r} = go (n*b) (f l) ++ go (n*(1-b)) (f r)
ey0jIExBTkdVQUdFIEdBRFRzLCBSZWNvcmRXaWxkQ2FyZHMsIEZsZXhpYmxlSW5zdGFuY2VzCiAgIy19CmltcG9ydCBDb250cm9sLkFwcGxpY2F0aXZlCmltcG9ydCBEYXRhLkZ1bmN0aW9uCmltcG9ydCBEYXRhLkxpc3QKCmdvYXRzZSA9IGRvCiAgZyA8LSBjaG9pY2UnIFsiZyIsICI5IiwgIjYiLCAi0JMiLCAizpMiLCAiciJdCiAgbyA8LSBjaG9pY2UnIFsiMCIsICLQviIsICLOvyIsICIoKSJdCiAgYSA8LSBjaG9pY2UnIFsiYSIsICI0IiwgIs6xIiwgIkAiXQogIHQgPC0gY2hvaWNlJyBbInQiLCAiNyIsICIrIiwgItGCIiwgIm0iLCAiz4QiXQogIHMgPC0gY2hvaWNlJyBbInMiLCAiNSIsICLRgSIsICLPgyIsICJjIiwgIiQiXQogIGUgPC0gY2hvaWNlJyBbImUiLCAiMyIsICLQtSIsICLOtSJdCiAgbGV0IHN0ciA9IGNvbmNhdCBbZywgbywgYSwgdCwgcywgZV0KICB7LSBpZGVvbmUg0L3QtSDQtdGB0YIg0Y7QvdC40LrQvtC00LjQutC4LCDQvdC1INCx0LXQtNCwIC0tINCy0LLQtdC00ZHQvCDQutC+0YHRgtGL0LvRjCAo0L3QuNC20LUpIC19CiAgZ3VhcmQgJCBhbGwgKCg8MjU1KS5mcm9tRW51bSkgc3RyCiAgcmV0dXJuIHN0cgoKY2hvaWNlJyA9IGNob2ljZSAuICh6aXAgWzEuLl0pIAoKY2xhc3MgTW9uYWQgbSA9PiBNb25hZFZvcmV0aW9uIG0gd2hlcmUKICAtLSB8IEJlcm5vdWxsaSBkaXN0cmlidXRpb24uIFJldHVybnMgZWl0aGVyIG9mIHRoZSBhcmd1bWVudHMgd2l0aAogIC0tIGNlcnRhaW4gcHJvYmFiaWxpdHkKICBmb3JrIDo6IEZsb2F0ICAtLSBeIFByb2JhYmlsaXR5IG9mIHRoZSBmaXJzdCB2YWx1ZQogICAgICAgLT4gYSAgICAgIC0tIF4gRmlyc3QgdmFsdWUKICAgICAgIC0+IGEgICAgICAtLSBeIFNlY29uZCB2YWx1ZQogICAgICAgLT4gbSBhCgogIC0tIHwgQWJvcnRzIGV4ZWN1dGlvbiBpZiBzb21lIGNvbmRpdGlvbiBpc24ndCBtZXQKICBndWFyZCA6OiBCb29sICAtLSBeIENvbmRpdGlvbgogICAgICAgIC0+IG0gKCkKCmRhdGEgU2FtcGxlIG0gYSB3aGVyZQogIEZvcmsgOjogewogICAgX21ldGFJbmZvIDo6ICFtCiAgLCBfbGVmdAogICwgX3JpZ2h0IDo6IHIKICAsIF9iaWFzIDo6ICFGbG9hdAogICwgX25leHQgOjogciAtPiBTYW1wbGUgbSBhCiAgfSAtPiBTYW1wbGUgbSBhCiAgLS0gfCBWYWwgaXMganVzdCBhIHB1cmUgdmFsdWUKICBWYWwgOjogewogICAgX3VuVmFsIDo6IGEKICB9IC0+IFNhbXBsZSBtIGEKICAtLSB8IEd1YXJkIGNoZWNrcyBzb21lIGV4cHJlc3Npb24gYW5kIGJhY2t0cmFja3MgaWYgaXQgaXNuJ3QgdHJ1ZQogIEd1YXJkIDo6IHsKICAgIF9tZXRhSW5mbyA6OiAhbQogICwgX2d1YXJkZWQgOjogU2FtcGxlIG0gYQogIH0gLT4gU2FtcGxlIG0gYQogIFplcm8gOjogU2FtcGxlIG0gYQoKaW5zdGFuY2UgRnVuY3RvciAoU2FtcGxlIG0pIHdoZXJlCiAgZm1hcCBmIGFAVmFse191blZhbD12fSA9IGF7X3VuVmFsPWYgdn0KICBmbWFwIGYgYUBGb3Jrey4ufSA9IEZvcmsgewogICAgICBfbmV4dCA9IFxhIC0+IGZtYXAgZiAkIF9uZXh0IGEKICAgICwgLi4KICAgIH0KICBmbWFwIF8gWmVybyA9IFplcm8KICBmbWFwIGYgYUBHdWFyZHsuLn0gPSBHdWFyZCB7CiAgICAgIF9ndWFyZGVkID0gZm1hcCBmIF9ndWFyZGVkCiAgICAsIC4uCiAgICB9CgppbnN0YW5jZSBBcHBsaWNhdGl2ZSAoU2FtcGxlIG0pIHdoZXJlCiAgcHVyZSBhID0gVmFsIGEKCiAgVmFse191blZhbD1mfSA8Kj4gYSA9IGZtYXAgZiBhCiAgRm9ya3suLn0gPCo+IGEgPSBGb3JrIHsKICAgICAgX25leHQgPSBceCAtPiAoX25leHQgeCkgPCo+IGEKICAgICwgLi4KICAgIH0KICBaZXJvIDwqPiBfID0gWmVybwogIEd1YXJkey4ufSA8Kj4gYSA9IEd1YXJkIHsKICAgICAgX2d1YXJkZWQgPSBfZ3VhcmRlZCA8Kj4gYQogICAgLCAuLgogICAgfQoKaW5zdGFuY2UgTW9uYWQgKFNhbXBsZSBtKSB3aGVyZQogIFZhbHtfdW5WYWw9dn0gPj49IGYgPSBmIHYKICBGb3Jrey4ufSAgICAgID4+PSBmID0gRm9yayB7CiAgICAgICBfbmV4dCA9IFxhIC0+IF9uZXh0IGEgPj49IGYKICAgICAsIC4uCiAgICAgfQogIFplcm8gICAgICAgICAgPj49IF8gPSBaZXJvCiAgR3VhcmR7Li59ICAgICA+Pj0gZiA9IEd1YXJkIHsKICAgICAgX2d1YXJkZWQgPSBfZ3VhcmRlZCA+Pj0gZgogICAgLCAuLgogICAgfQoKICByZXR1cm4gPSBwdXJlCiAgCmNsYXNzIERlZmF1bHQgYSB3aGVyZQogIGRlRmF1bHQgOjogYQoKaW5zdGFuY2UgRGVmYXVsdCAoKSB3aGVyZQogIGRlRmF1bHQgPSAoKQoKaW5zdGFuY2UgKERlZmF1bHQgbSkgPT4gTW9uYWRWb3JldGlvbiAoU2FtcGxlIG0pIHdoZXJlCiAgZm9yayBiIHggeSA9IEZvcmsgewogICAgICBfbWV0YUluZm8gPSBkZUZhdWx0CiAgICAsIF9sZWZ0ID0geAogICAgLCBfcmlnaHQgPSB5CiAgICAsIF9iaWFzID0gYgogICAgLCBfbmV4dCA9IFxhIC0+IFZhbHtfdW5WYWw9YX0KICAgIH0KCiAgZ3VhcmQgRmFsc2UgPSBaZXJvCiAgZ3VhcmQgVHJ1ZSA9IEd1YXJkIHsKICAgICAgX2d1YXJkZWQgPSBWYWwgKCkKICAgICwgX21ldGFJbmZvID0gZGVGYXVsdAogICAgfQoKY2hvaWNlIDo6IE1vbmFkVm9yZXRpb24gbSA9PiBbKEZsb2F0LCBhKV0gLT4gbSBhCmNob2ljZSBsID0gZ28gKHJldmVyc2UgJCBzY2FubCAoXGEgYiAtPiBmc3QgYiArIGEpIDAgbCkgJCByZXZlcnNlIGwgCiAgd2hlcmUKICAgIGdvIF8gWyhfLHgpXSA9IHJldHVybiB4CiAgICBnbyAocGM6dHApICgocCx4KTp0KSA9IGRvCiAgICAgIGMgPC0gZm9yayAocC9wYykgVHJ1ZSBGYWxzZQogICAgICBpZiBjIHRoZW4KICAgICAgICByZXR1cm4geAogICAgICBlbHNlCiAgICAgICAgZ28gdHAgdAoKY29iZW5hdGlvbiA6OiBGbG9hdCAtPiBTYW1wbGUgKCkgYiAtPiBbKEZsb2F0LCBiKV0KY29iZW5hdGlvbiDOtSA9IGdvIDEKICB3aGVyZQogICAgZ28gXyBaZXJvID0gW10KICAgIGdvIG4gXyB8IG48zrUgPSBbXQogICAgZ28gbiBWYWx7X3VuVmFsPXZ9ID0gWyhuLCB2KV0KICAgIGdvIG4gR3VhcmR7X2d1YXJkZWQ9Z30gPSBnbyBuIGcKICAgIGdvIG4gRm9ya3tfYmlhcz1iLCBfbmV4dD1mLCBfbGVmdD1sLCBfcmlnaHQ9cn0gPSBnbyAobipiKSAoZiBsKSArKyBnbyAobiooMS1iKSkgKGYgcikKICAgIAptYWluID0gbWFwTSBwdXRTdHJMbiAkIG1hcCBzbmQgJCBjb2JlbmF0aW9uIDAgZ29hdHNlCg==