рд╣рд╛рд╕реНрдХреЗрд▓ рдкреВрд░реНрдгрд╛рдВрдХ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рдерд╛ рдХрд┐ рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╕рдВрдЦреНрдпрд╛рдПрдВ, рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рдВрдЦреНрдпрд╛рдПрдВ, рдЕрдирд┐рд╢реНрдЪрд┐рдд рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдВ рд╣реИрдВ, рдкреНрд░рд╛рдердорд┐рдХ; рдЙрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рдЕрдВрддрд░реНрдЬреНрдЮрд╛рди рд╕реЗ рдЬрд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рд╕рднреА рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд╕реЗрдЯ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВред

рд╕рдмрд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рдкреАрдиреЛ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдЧрд┐рдирддреА рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╕реЗрдЯреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдирд┐рд░реНрдорд╛рдг рд╕реЗрдЯ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рдПрдХ рдЕрдиреНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдбрд┐рдирд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН рдПрдХ рдкрд░рд┐рдорд┐рдд рд╕реЗрдЯ рдХреА рдХрд╛рд░реНрдбрд┐рдиреИрд▓рд┐рдЯреАред рддреАрд╕рд░рд╛ рд╣реИ рдЪрд░реНрдЪ рдЕрдВрдХред

рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛ рдХрд┐ рдЖрдк рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдЕрд╡рдзрд╛рд░рдгрд╛ рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдЗрдП рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЕрдЪрд╛рдирдХ рдПрдХ рдмрд┐рдВрджреБ рдкрд░ рдкреВрд░реА рджреБрдирд┐рдпрд╛ рдЙрд▓рдЯ рдЬрд╛рдПрдЧреА рдФрд░ рдХреЛрдИ рднреА рдХрдВрдкреНрдпреВрдЯрд░ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рддрдм рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдмрд╣реБрдд рдмреАрдорд╛рд░ рд╣реЛрдВрдЧреЗред рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдмрд╕ рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдХреЛ рдпрд╛рдж рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рддреБрд░рдВрдд рд╕рдмрдХреБрдЫ рдареАрдХ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рд╣рдо рд╣рд╕реНрдХреЗрд▓ рдкрд░ рдкреНрд░рд╛рдХреГрддрд┐рдХ рдФрд░ рдкреВрд░реНрдгрд╛рдВрдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдЦрд░реЛрдВрдЪ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВред рдПрдХ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдПрдХ рд╕реВрдЪреА рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдиреЗрдЯ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕рдВрдЦреНрдпрд╛ (рдмрд╢рд░реНрддреЗ рдХрд┐ рдкрд░рд┐рдорд┐рдд рдкрд░рд┐рдорд┐рдд рд╣реЛ)ред

data [a] = [] | a:[a] -- , [] : тАФ , [] тАФ
head x:_ = x; tail _:x = x;
data () = () -- ,


рд╕рд┐рджреНрдзрд╛рдВрдд рдХреА рдПрдХ рдмрд┐рдЯ:
рдЕрдВрддрд┐рдо рд╕реВрдЪреА :: = x: (x == []) || (рдкреВрдВрдЫ x - рдЕрдВрддрд┐рдо)
рд╕реВрдЪрд┐рдпреЛрдВ рдХреА рд╕рдорд╛рдирддрд╛ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг []==[] = True; (a:as)==(b:bs) = (a==b) && (as==bs) []==[] = True; (a:as)==(b:bs) = (a==b) && (as==bs) рдмрд╢рд░реНрддреЗ рдХрд┐ рддрддреНрд╡ рддреБрд▓рдиреАрдп рд╣реЛрдВред
рд╕реЗрдЯ-рдереНрдпреЛрд░реИрдЯрд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рдорд╛рди, рд╣рдо рд╕реВрдЪрд┐рдпреЛрдВ рдХреА "рд╕рдорд╛рдирддрд╛" рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН:
a ~ b :: = (a == [] && b == []] || (рдЯреЗрд▓ ~ рдП рдЯреЗрд▓ рдмреА)
рдпрд╣ рд╕рдВрдмрдВрдз рд╕рдорддреБрд▓реНрдп (рд╕рдордорд┐рдд-рд╕рдВрдХреНрд░рдордгреАрдп-рдкреНрд░рддрд┐рд╡рд░реНрдд) рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорддреБрд▓реНрдп рд╡рд░реНрдЧ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╕рдВрднрд╡ рд╣реИред рдЖрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рд╣рдо рд╕реВрдЪрд┐рдпреЛрдВ [], [(]], (()], () (, (), ()), ..., рдЕрд░реНрдерд╛рдд, рд╕реЗрдЯ [()] рдХрд╛ рдЕрдиреБрдХреНрд░рдо рд▓реЗрддреЗ рд╣реИрдВред
рд╡реЗ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рдкрд░рд┐рдорд┐рдд рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд▓рдВрдмрд╛рдИ рдХреЗ рд╕реЗрдЯ [()] рд╕реЗ рдПрдХ рд╕реВрдЪреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЗрд╕рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐ ([)] рд╕реЗ рд╕рдорддреБрд▓реНрдпрддрд╛ рд╡рд░реНрдЧ рдХреА рдкрд╣рдЪрд╛рди рдХрд░реЗрдВрдЧреЗред

type N = [](); -- [()]
data Natural = MkN N; -- ,


рд╣рдо рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЖрджрд┐рдо рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ:
toList :: Natural -> N; --
toList (MkN x) = x;
incN :: Natural -> Natural; -- ,
incN = MkN.(():).toList;

--
sumN :: Natural -> Natural -> Natural;
sumN (MkN x) = MkN.(++x).toList;

copy :: a->[a]; copy x = x: copy x;
concatAll :: [[a]] -> [a];
concatAll = foldl(++)[];
table :: Natural -> a -> [a]; --
table xy = map (\_->y) $ toList x;

-- a*b a b (),
-- b a ( , )
-- concatAll
multN :: Natural -> Natural -> Natural;
multN xy = MkN $ concatAll $ table x (toList y);
decN :: Natural -> Natural;
decN (MkN(_:xs)) = MkN xs;
decN (MkN []) = error "Cannot decrease 0 staying being Natural";
zeroN :: Natural;
zeroN = MkN [];
oneN :: Natural;
oneN = MkN [()];
equalN :: Natural -> Natural -> Bool;
equalN (MkN a) (MkN b) = a==b;


рдХреБрдЫ рдФрд░ рдХрд╛рд░реНрдп рд╢реЗрд╖ рд╣реИрдВ:
subN :: Natural -> Natural -> Natural;
subN xy | y==oneN = decN x -- x-1=decN(x)
| y/=zeroN = decN $ subN x $ decN y -- xy=(x-1)-(y-1)
| True = x; -- x-0=x
divmodN :: Natural -> Natural -> (Natural, Natural);
divmodN (MkN []) _ = error "cannot divide by zero";
divmodN base x | moreThanN base x = (zeroN, x)
| True = let (d,m) = divmodN base (subN x base) in (incN d,m);
moreThanN :: Natural -> Natural -> Bool;
moreThanN (MkN []) _ = False;
moreThanN _ (MkN []) = True;
moreThanN xy = moreThanN (decN x) (decN y);
lengthN :: [a] -> Natural;
lengthN = MkN . map (\_->());


рдЕрдм рд╣рдо рдкреВрд░реНрдгрд╛рдВрдХ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░рддреЗ рд╣реИрдВ:
data Integer = Positive Natural | Negative Natural;
рд╣рдо рдкреНрд░рд╛рдХреГрддрд┐рдХ рддрд░реНрдХ рдХреЗ рдХреБрдЫ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░рддреЗ рд╣реИрдВ:
absInt :: Integer -> Natural;
absInt (Positive x) = x;
absInt (Negative x) = x;
equalInt :: Integer -> Integer -> Bool;
equalInt (Positive x) (Positive y) = x `equalN` y;
equalInt (Negative x) (Negative y) = x `equalN` y;
equalInt (Negative x) (Positive y) | x==zeroN && y==zeroN = True;
equalInt (Positive x) (Negative y) | x==zeroN && y==zeroN = True;
equalInt _ _ = False;
negate :: Integer -> Integer;
negate (Positive x) = (Negative x);
negate (Negative x) = (Positive x);
sumInt :: Integer -> Integer -> Integer;
sumInt (Positive x) (Positive y) = Positive (sumN xy);
sumInt (Positive x) (Negative y) = if x `moreThanN` y then Positive (subN xy) else Negative (subN yx);
sumInt (Negative x) (Positive y) = if y `moreThanN` x then Positive (subN yx) else Negative (subN xy);
sumInt (Negative x) (Negative y) = Negative (sumN xy);


рдореИрдВ рдЕрдВрддрд░рд┐рдХреНрд╖ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдирд╣реАрдВ рджреВрдВрдЧрд╛ред

рдЕрдВрддрд┐рдо рд╕реНрдкрд░реНрд╢: рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рдгред рдЙрджрд╛рд╣рд░рдг рдЯрд░реНрдирд░реА рд╕рд┐рд╕реНрдЯрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ (рдЖрдВрдХрдбрд╝реЛрдВ рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд╛рде)
figures = ['0', '1', '2'];
naturalseries = zeroInt : map incInt naturalseries;
figuretoInt = compare $ zip figures naturalseries where{compare ((a,b):c) x | a==x = b | True = compare cx;};
inttoFigure = getElement figures where {getElement (h:t) n = if n==zeroInt then h else getElement t $ decInt n;};
base :: Integer;
base = lengthInt figures;
showInt :: Integer -> [Char];
showInt x | x<zeroInt = '-' : showInt (negate x)
| x==zeroInt = "0"
| x<base = [inttoFigure x]
| True = let (d,m) = divmodInt base x
in (show d) ++ [inttoFigure m];
readInt :: [Char] -> (Integer, [Char]);
readInt "" = error "No integer to read on input";
readInt str@(f:r)
| f=='-' = let (i,s) = readInt r in (negate i,s)
| f=='+' = readInt r
| True = let (num,rest) = split str in (parse $ map figuretoInt num, rest);
split :: [Char] -> ([Char],[Char]);
split "" = ("","");
split (x:y) | x~->figures = let (a,b)=split y in (x:a,b)
| True = ("", x:y);
parse :: [Integer] -> Integer;
parse = foldl (\g h->sumInt h $ multInt base g) zeroInt;


рд╕реВрдЪреА рд╕рджрд╕реНрдпрддрд╛ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (~->) :: (Eq a) => a -> [a] -> Bool;
a ~-> [] = False;
a ~-> (b:c) = (a==b) || (a ~-> c);
(~->) :: (Eq a) => a -> [a] -> Bool;
a ~-> [] = False;
a ~-> (b:c) = (a==b) || (a ~-> c);


рд╡рд╣ рд╕рдм рдмрдЪ рдЧрдпрд╛!

рдкреБрдирд╢реНрдЪ рдХреБрдЫ рднреА рдЧрдВрднреАрд░ рдирд╣реАрдВ рд╣реИред рдореИрдВ рд╕рд┐рд░реНрдл рдпрд╣ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рд╡реЗ рдкреНрд░рдХрд╛рд░ рдЬреЛ рд▓рдЧрднрдЧ рд╣рд░ рдЬрдЧрд╣ рдмреБрдирд┐рдпрд╛рджреА рд╣реИрдВ, рдФрд░ рдХрдИ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдкреБрдирд░реНрд╡рд┐рддрд░рдг рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ, рдЖрд╕рд╛рдиреА рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдЦрд░реЛрдВрдЪ рд╕реЗред
рдлрд┐рд░ рднреА, рдореИрдВрдиреЗ рдкреАрдкреАрдПрд╕ рдмреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рд╣рдореЗрд╢рд╛ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдкреНрд░рдХрд╛рд░ рдереЛрдбрд╝рд╛ рд╕рд╛ рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рд╣реИ, рддреЛ рдЖрдк рдХрд┐рд╕реА рддрд░рд╣ 8, 16, 32, 64 рддрддреНрд╡реЛрдВ рдХрд╛ рд╕рдореВрд╣ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдмрд╛рдЗрдЯ, рд╡рд░реНрдб, ...

Source: https://habr.com/ru/post/In111063/


All Articles