package Ġru . spb stu . di agrams Ċ Ċ import Ġjava . io . BufferedReader Ċ import Ġjava . io . InputStream Ċ Ċ private Ġfun Ġ< T > ĠMutable List < T >. grow With ( value : ĠT , Ġto Size : ĠInt ) Ġ{ Ġwhile ( size Ġ< Ġto Size ) Ġadd ( value ) Ġ} Ċ Ċ data Ġclass ĠChar Matrix Ġ( val Ġdata : ĠList < Mutable List < Char >> ): ĠIterable < Pair < Cell , ĠChar >> Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġread ( br : ĠBufferedReader ): ĠChar Matrix Ġ= ĠChar Matrix ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbr . line Sequence (). map To ( mutable ListOf ()) Ġ{ Ġit . to Mutable List () Ġ} Ġas ĠList < Mutable List < Char >> ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġfun Ġread (` is `: ĠInputStream ): ĠChar Matrix Ġ= Ġread (` is `. buffered Reader ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġheight Ġget () Ġ= Ġdata . size ĊĠĠĠ Ġval Ġwidth Ġ= Ġdata . as Sequence (). map Ġ{ Ġit . size Ġ}. max () Ġ?: Ġ 0 ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġfor ( line Ġin Ġdata ) Ġline . grow With (' Ġ', Ġwidth ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠThe Iterator ( var Ġx : ĠInt Ġ= Ġ 0 , Ġvar Ġy : ĠInt Ġ= Ġ 0 ) Ġ: ĠIterator < Pair < Cell , ĠChar >> Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhas Next (): ĠBoolean Ġ= Ġy Ġ< Ġheight ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnext (): ĠPair < Cell , ĠChar > Ġ= Ġ( Cell ( x , Ġy ) Ġto Ġget ( x , Ġy )). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ++ x ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( x Ġ>= Ġwidth ) Ġ{ Ġx Ġ= Ġ 0 ; Ġ++ y Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġiterator (): ĠIterator < Pair < Cell , ĠChar >> Ġ= ĠThe Iterator () ĊĊĠĠĠ Ġoperator Ġfun Ġget ( x : ĠInt , Ġy : ĠInt ) Ġ= Ġdata [ y ][ x ] ĊĠĠĠ Ġoperator Ġfun Ġset ( x : ĠInt , Ġy : ĠInt , Ġvalue : ĠChar ) Ġ{ Ġdata [ y ][ x ] Ġ= Ġvalue Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġget ( cell : ĠCell ) Ġ= Ġget ( cell . x , Ġcell . y ) ĊĠĠĠ Ġoperator Ġfun Ġset ( cell : ĠCell , Ġvalue : ĠChar ) Ġ{ Ġset ( cell . x , Ġcell . y , Ġvalue ) Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġdata . join ToString ("\ n ") Ġ{ Ġit . join ToString ("") Ġ} ĊĊĠĠĠ Ġval ĠCell . up Ġget () Ġ= Ġif ( y Ġ> Ġ 0 ) Ġcopy ( y Ġ= Ġy Ġ- Ġ 1 ) Ġelse Ġnull ĊĠĠĠ Ġval ĠCell . down Ġget () Ġ= Ġif ( y Ġ+ Ġ 1 Ġ< Ġheight ) Ġcopy ( y Ġ= Ġy Ġ+ Ġ 1 ) Ġelse Ġnull ĊĠĠĠ Ġval ĠCell . left Ġget () Ġ= Ġif ( x Ġ> Ġ 0 ) Ġcopy ( x Ġ= Ġx Ġ- Ġ 1 ) Ġelse Ġnull ĊĠĠĠ Ġval ĠCell . right Ġget () Ġ= Ġif ( x Ġ+ Ġ 1 Ġ< Ġwidth ) Ġcopy ( x Ġ= Ġx Ġ+ Ġ 1 ) Ġelse Ġnull Ċ } Ċ