рдХрд┐рддрдирд╛ рдкрд╛рдиреА рд▓реАрдХ рд╣реБрдЖ рд╣реИ? рд╣рдо рд╣рд╛рд╕реНрдХреЗрд▓ рдкрд░ рдПрдХ рдЪрд╛рдБрджрд╡реЙрдХ рджреНрд╡рд╛рд░рд╛ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рддреЗ рд╣реИрдВ

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


рджреАрд╡рд╛рд░реЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реВрдЪреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

type Height = Int

walls :: [Height]
walls = [2,5,1,2,3,4,7,7,6]

рдкреНрд░рддреНрдпреЗрдХ рджреАрд╡рд╛рд░ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдкрд╛рдиреА рдХреА рдорд╛рддреНрд░рд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рддреАрди рдЪреАрдЬреЛрдВ рдХреЛ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛:

  1. рд╡рд░реНрддрдорд╛рди рджреАрд╡рд╛рд░ рдХреА рдКрдВрдЪрд╛рдИ
  2. рд╕рдмрд╕реЗ рдКрдБрдЪреА рдмрд╛рдИрдВ рджреАрд╡рд╛рд░ рдХреА рдКрдБрдЪрд╛рдИ
  3. рд╕рдмрд╕реЗ рдКрдБрдЪреА рджрд╛рд╣рд┐рдиреА рджреАрд╡рд╛рд░ рдХреА рдКрдБрдЪрд╛рдИ

рд╣рдореЗрдВ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдиреАрдЪреЗ рдХреМрди рд╕реА рджреАрд╡рд╛рд░ рджрд╛рдИрдВ рдпрд╛ рдмрд╛рдИрдВ рдУрд░ рд╣реИ, рд╡рд░реНрддрдорд╛рди рджреАрд╡рд╛рд░ рдХреА рдКрдВрдЪрд╛рдИ рдХреЛ рдЙрдЪреНрдЪрддрдо рд╕реЗ рдШрдЯрд╛рдПрдВ рдФрд░ рдкрд╛рдиреА рдХреА рдорд╛рддреНрд░рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:



рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдореЗрдВ рджреАрд╡рд╛рд░ рдмреА рдХреЗ рд▓рд┐рдП рдкрд╛рдиреА рдХреА рдорд╛рддреНрд░рд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрдЪреНрдЪрддрдо рдмрд╛рдИрдВ рджреАрд╡рд╛рд░ рдХреА рдКрдБрдЪрд╛рдИ - a , 3 рд╣реИ ред рдЙрдЪреНрдЪрддрдо рджрд╛рдПрдВ рджреАрд╡рд╛рд░ рдХреА рдКрдВрдЪрд╛рдИ - s , 2 рд╣реИ ред рдКрдВрдЪреА рджреАрд╡рд╛рд░ рдХреЗ рдХрд╛рд░рдг, рдкрд╛рдиреА рджрд╛рдИрдВ рдУрд░ рдлреИрд▓ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╣рдо рджрд╛рдИрдВ рджреАрд╡рд╛рд░ рдХреА рдКрдВрдЪрд╛рдИ рд╕реЗ рдЧрд┐рдирддреА рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рджреАрд╡рд╛рд░ рдХреЗ рд▓рд┐рдП рдкрд╛рдиреА рдХреА рдорд╛рддреНрд░рд╛ рдЦ рд╣реИ = рдКрдВрдЪрд╛рдИ c - рдКрдВрдЪрд╛рдИ рдЦ = 2 - 1 = 1 ред

рд╕реВрдЪреА рдХреЗ рдПрдХ рдкрд╛рд╕ рдореЗрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рджреЛ рдореЗрдВ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛ - рдкреВрд░реА рдмрд╛рдд рдКрдкрд░реА рдмрд╛рдПрдБ рдФрд░ рджрд╛рдПрдБ рджреАрд╡рд╛рд░реЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рд╣реИред ( UPD :roman_kashitsynрджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдПрдХ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХреИрд╕реЗ рд╕рдВрднрд╡ рд╣реИ, рдХреЗрд╡рд▓ рдкреНрд░рддреНрдпреЗрдХ рджреАрд╡рд╛рд░ рдкрд░ рд╕рдВрдЪрд┐рдд рдкрд╛рдиреА рдХреА рдорд╛рддреНрд░рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдмрд┐рдирд╛)

рд╣рдо рд░рд╛рдЬреНрдп рдкреНрд░рднрд╛рд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рджреАрд╡рд╛рд░ рдХреЗ рд▓рд┐рдП рдЙрдЪреНрдЪрддрдо рдмрд╛рдИрдВ рджреАрд╡рд╛рд░ рдХреА рдЧрдгрдирд╛ рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:

type Volume = Int

--|        
themax :: Height -> State Height Height
themax h = modify (max h) *> get

-- |            
highest_left :: [Height] -> [Height]
highest_left walls = evalState (traverse themax walls) 0



рдЕрдм рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рджреАрд╡рд╛рд░ рдХреЗ рд▓рд┐рдП рдЙрдЪреНрдЪрддрдо рджрд╛рдПрдВ рджреАрд╡рд╛рд░ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдореЗрдВ рдмрд╛рдИрдВ рдУрд░ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рджрд╛рдИрдВ рдУрд░ рдЧрд┐рдирддреА рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреИрд╕реЗ рд╣реЛрдирд╛ рд╣реИ? рд╕реВрдЪреА рдЪрд╛рд▓реВ рдХрд░реЗрдВ? рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд╢реАрд░реНрд╖рдХ рд╕реЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рдФрд░ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рдзрд┐ рд╣реИред

рдЕрдиреБрд▓реЛрдо рд╡рд┐рд▓реЛрдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрд╖


рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдкреНрд░рдХрд╛рд░ рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдкреИрдХреЗрдЬ рдореЗрдВ рд░рд╣рддрд╛ рд╣реИ (рд╢рдмреНрдж рдХреЗ рд╢рд╛рдмреНрджрд┐рдХ рдФрд░ рдЖрд▓рдВрдХрд╛рд░рд┐рдХ рдЕрд░реНрде рдореЗрдВ)ред рдпрд╣ рдЖрдкрдХреЛ рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ рдореЗрдВ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рднрд╛рд╡ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:

newtype Backwards f a = Backwards { forwards :: f a }

рдпрд╣ рдХрд╛рдо рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ? рдХреЗ рдХреЛ рдХрд░реАрдм рд╕реЗ рджреЗрдЦ рд▓реЗрддреЗ рд╣реИрдВ рдЕрдиреБрдкреНрд░рдпреЛрдЧреА рд╡рд░реНрдЧ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкрд┐рдЫрдбрд╝реЛрдВ :

-- |          liftA2  <**>
instance Applicative t => Applicative (Backwards t) where
        pure = Backwards . pure
	Backwards f <*> Backwards x = Backwards ((&) <$> x <*> f)

& $ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рд╣реА рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣реИ , рд▓реЗрдХрд┐рди рддрд░реНрдХреЛрдВ рдХреЗ рдПрдХ рдЕрд▓рдЧ рдХреНрд░рдо рдХреЗ рд╕рд╛рде: рдкрд╣рд▓реЗ рддрд░реНрдХ, рдлрд┐рд░ рдлрд╝рдВрдХреНрд╢рди:

f $ x = x & f

рдЖрд▓рд╕реНрдп рдХреЗ рдХрд╛рд░рдг, рд╣рдо рдкрд╣рд▓реЗ рдЖрд╡реЗрджрди рдХреА рдЧрдгрдирд╛ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рджреВрд╕рд░реЗ рдШрдЯрдХ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рдкрд╣рд▓рд╛ - рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд╛рдоред

рдПрдХ рд╣реА рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдореЗрдВ рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдкреНрд░рдХрд╛рд░ рд╣реИ - рд░рд┐рд╡рд░реНрд╕ :

newtype Reverse f a = Reverse { getReverse :: f a }

рдпрд╣ рдкреАрдЫреЗ рдХреА рдУрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░рд┐рд╡рд░реНрд╕ рдореЗрдВ рдЯреНрд░реИрд╡рд░реНрд╕реЗрдмрд▓ рдореЗрдВ рдкреНрд░рднрд╛рд╡ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ ред рдФрд░ рдЕрдм рдЗрд╕ рдореВрд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реА рдореВрд▓ рд╕рдорд╕реНрдпрд╛ рдкрд░ рд╡рд╛рдкрд╕ рдЖрддреЗ рд╣реИрдВред



рд╣рдо рдореВрдирд╡реЙрдХ рдХреЗ рдорд╛рд╕реНрдЯрд░ рд╣реИрдВ


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

-- |        
themax :: Height -> State Height Height
themax h = modify (max h) *> get

-- |    ,    :
highest_right :: [Height] -> [Height]
highest_right walls = getReverse $ evalState (traverse themax $ Reverse walls) 

рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рдВрдЪрд┐рдд рдкрд╛рдиреА рдХреА рдХреБрд▓ рдорд╛рддреНрд░рд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рд╣реИред рдЙрдЪреНрдЪрддрдо рдмрд╛рдИрдВ рдФрд░ рджрд╛рдИрдВ рджреАрд╡рд╛рд░реЛрдВ рд╕реЗ рд╣рдо рд╕рдмрд╕реЗ рдХрдо рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рд╕реЗ рджреАрд╡рд╛рд░ рдХреА рдКрдВрдЪрд╛рдИ рдШрдЯрд╛рддреЗ рд╣реИрдВ - рдпрд╣ рд╕рдВрдЪрд┐рдд рдкрд╛рдиреА рдХреА рдорд╛рддреНрд░рд╛ рд╣реЛрдЧреА:

walls = [2,5,1,2,3,4,7,7,6]
let hls = highest_left walls = [2,5,5,5,5,5,7,7,7]
let hrs = highest_right walls = [7,7,7,7,7,7,7,7,6]
sum $ zipWith3 (\l x r -> min l r - x) hls walls hrs



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

рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рдЗрд╕ рдкрд╣реЗрд▓реА рдореЗрдВ рдХреБрдЫ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдпрд╣рд╛рдБ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

All Articles