import Data.List
import Data.Maybe
data MarkovS = Sub String|Fin String deriving Show -- продукции : обыкновенная или финальная
type MarkovE = (String, MarkovS)
type MarkovD = [MarkovE] -- словарь
markov rules text = loop ("", Sub "") text -- первый луп - холостой
where
loop (p, Fin s) str = replaceFirst (p,s) str -- финал: заменяем и выходим
loop (p, Sub s) str = loop new_ME new_str
where
new_str = replaceFirst (p,s) str -- заменяем
new_ME = findFirst rules new_str -- ищем пару для замены
findFirst :: MarkovD -> String -> MarkovE
findFirst (x@(p,_):xs) s =
if p `isInfixOf` s -- если в s содержится строка для замены
then x -- просто возвращаем текущий MarkovE
else findFirst xs s
findFirst [] _ = ("", Fin "") -- если не нашли, то финальная пустая продукция
findSubstringIndex text pattern =
findIndex (pattern `isPrefixOf`) (tails text)
replaceFirst ([],_) text = text
replaceFirst (old, new) text = start ++ new ++ drop n end
where
n = length old
i = fromJust $ findSubstringIndex text old
(start,end) = splitAt i text
bin2unD :: MarkovD
bin2unD = [("|0", Sub "0||"), ("1", Sub "0|"), ("0", Sub "")]
un_divD :: MarkovD
un_divD = [( "%*" , Sub "*%" ),( "%|" , Sub "%*" ),( "*|" , Sub "**" ),( "|*" , Sub "t" ),( "t*" , Sub "*t" ),( "t%" , Sub "%t" ),( "%t" , Sub "%v|" ),( "t" , Sub "|" ),( "%v" , Sub "?d" ),( "?d" , Sub "d?" ),( "|d" , Sub "d|" ),( "?" , Sub "%" ),( "*d" , Sub "h" ),( "h*" , Sub "oh" ),( "h%" , Sub "h" ),( "h" , Sub "" ),( "*" , Sub "" ),( "d" , Sub "|_" ),( "/|" , Sub "-k" ),( "k|" , Sub "kk" ),( "k" , Sub "|+" ),( "+|" , Sub "|+" ),( "-" , Sub "ey" ),( "|e" , Sub "e|" ),( "y" , Sub "%" ),( "eo" , Sub "0o" ),( "e" , Sub "" ),( "|_" , Sub ".a" ),( "a." , Sub ".a" ),( ".." , Sub "." ),( ".aaaaaaaaaa" , Sub "a,." ),( ",a" , Sub "a," ),( ".aaaaaaaaa" , Sub "9" ),( ".aaaaaaaa" , Sub "8" ),( ".aaaaaaa" , Sub "7" ),( ".aaaaaa" , Sub "6" ),( ".aaaaa" , Sub "5" ),( ".aaaa" , Sub "4" ),( ".aaa" , Sub "3" ),( ".aa" , Sub "2" ),( ".a" , Sub "1" ),( "." , Sub "0" ),( "," , Sub "" ),( "a" , Sub ".a" ),( "o" , Sub "p||||||||||" ),( "|p" , Sub "p|" ),( "pp" , Sub "p" ),( "%" , Sub "u" ),( "u+" , Sub "u" ),( "u" , Sub "_" ),( "|+" , Sub "|)+" ),( ")" , Sub "(>" ),( ">+" , Sub "+>" ),( "+" , Sub "{" ),( "{" , Sub "|" ),( ">>>>>" , Sub "=" ),( "|=" , Sub "=" ),( "(=" , Sub "=" ),( "(" , Sub "/" ),( "p=" , Sub "=<" ),( "<0" , Sub "0<" ),( "<1" , Sub "1<" ),( "<2" , Sub "2<" ),( "<3" , Sub "3<" ),( "<4" , Sub "4<" ),( "<5" , Sub "5<" ),( "<6" , Sub "6<" ),( "<7" , Sub "7<" ),( "<8" , Sub "8<" ),( "<9" , Sub "9<" ),( "<<<<<" ,Sub "$" ),( "0$" , Sub "$0" ),( "1$" , Sub "$1" ),( "2$" , Sub "$2" ),( "3$" , Sub "$3" ),( "4$" , Sub "$4" ),( "5$" , Sub "$5" ),( "6$" , Sub "$6" ),( "7$" , Sub "$7" ),( "8$" , Sub "$8" ),( "9$" , Sub "$9" ),( "=$" , Fin "." ),( "0=" , Sub "=0" ),( "1=" , Sub "=1" ),( "2=" , Sub "=2" ),( "3=" , Sub "=3" ),( "4=" , Sub "=4" ),( "5=" , Sub "=5" ),( "6=" , Sub "=6" ),( "7=" , Sub "=7" ),( "8=" , Sub "=8" ),( "9=" , Sub "=9" ),( "_>" , Sub "" ),( "0>" , Sub ">0" ),( "1>" , Sub ">1" ),( "2>" , Sub ">2" ),( "3>" , Sub ">3" ),( "4>" , Sub ">4" ),( "5>" , Sub ">5" ),( "6>" , Sub ">6" ),( "7>" , Sub ">7" ),( "8>" , Sub ">8" ),( "9>" , Sub ">9" ),( "p>" , Sub "" ),( "p" , Fin "." ),( "_" , Fin ".0" ) ]
main = undefined