package Ġkat as . kotlin . hack err ank . short est _ path Ċ Ċ import Ġg uru . n idi . graph viz . attribute . Label Ċ import Ġg uru . n idi . graph viz . attribute . Rank Dir Ċ import Ġg uru . n idi . graph viz . engine . Format Ċ import Ġg uru . n idi . graph viz . engine . Graph viz Ċ import Ġg uru . n idi . graph viz . engine . Renderer Ċ import Ġg uru . n idi . graph viz . model . Factory . mut Graph Ċ import Ġg uru . n idi . graph viz . model . Factory . mut Node Ċ import Ġg uru . n idi . graph viz . model . Link Ċ import Ġkat as . kotlin . hack err ank . Output Recorder Ċ import Ġkat as . kotlin . hack err ank . to ReadLine Function Ċ import Ġnon stdlib . print ed Ċ import Ġdat sok . should Equal Ċ import Ġorg . junit . Test Ċ import Ġjava . io . File Ċ import Ġjava . util .* Ċ import Ġkotlin . collections . Linked HashSet Ċ Ċ /** Ċ Ġ* ĠSee Ġhttps :// www . hack err ank . com / challenges / di jk str ash ort reach Ċ Ġ*/ Ċ fun Ġmain () Ġ{ ĊĠĠĠ Ġval Ġreader Ġ= ĠSystem .` in `. buffered Reader () ĊĠĠĠ Ġmain ({ Ġreader . readLine () Ġ}) Ċ } Ċ Ċ private Ġfun ĠString . parseInt Triple (): ĠTrip le < Int , ĠInt , ĠInt > Ġ{ ĊĠĠĠ Ġval Ġi 1 Ġ= ĠindexOf (' Ġ') ĊĠĠĠ Ġval Ġi 2 Ġ= Ġlast IndexOf (' Ġ') ĊĠĠĠ Ġreturn ĠTrip le ( substring ( 0 , Ġi 1 ). toInt (), Ġsubstring ( i 1 Ġ+ Ġ 1 , Ġi 2 ). toInt (), Ġsubstring ( i 2 Ġ+ Ġ 1 ). toInt ()) Ċ } Ċ Ċ private Ġinline Ġfun Ġmain ( readLine : Ġ() Ġ-> ĠString , Ġwrite Line : Ġ( Any ?) Ġ-> ĠUnit Ġ= Ġ{ Ġprintln ( it ) Ġ}) Ġ{ ĊĠĠĠ Ġval ĠnumberOf Tests Ġ= Ġread Line (). toInt () ĊĠĠĠ Ġ( 1 .. numberOf Tests ). map Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( node Count , Ġedge Count ) Ġ= Ġread Line (). split (" Ġ"). let Ġ{ ĠPair ( it [ 0 ]. toInt (), Ġit [ 1 ]. toInt ()) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġgraph Ġ= ĠGraph ( size Ġ= Ġnode Count ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġ 0 Ġuntil Ġedge Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( from , Ġto , Ġweight ) Ġ= Ġread Line (). parseInt Triple () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgraph . add Edge ( from , Ġto , Ġweight ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġstart Node Ġ= Ġread Line (). toInt () ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġgraph . short est Paths ( start Node ). min Dist . to Mutable List () ĊĠĠĠĠĠĠĠ Ġresult . remove At ( start Node ) ĊĠĠĠĠĠĠĠ Ġresult . remove At ( 0 ) ĊĠĠĠĠĠĠĠ Ġwrite Line ( result . join ToString (" Ġ")) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġdata Ġclass ĠEdge ( val Ġfrom : ĠInt , Ġval Ġto : ĠInt , Ġval Ġweight : ĠInt ) Ċ Ċ private Ġclass ĠGraph ( val Ġsize : ĠInt ) Ġ{ ĊĠĠĠ Ġval Ġnodes : ĠSet < Int > Ġget () Ġ= ĠInt Range ( 1 , Ġsize ). toSet () ĊĠĠĠ Ġval Ġedges : ĠSet < Edge > Ġget () Ġ= Ġad jacency . values . toSet () ĊĊĠĠĠ Ġprivate Ġval Ġad jacency Ġ= ĠLinkedHashMap < Pair < Int , ĠInt >, ĠEdge >() ĊĠĠĠ Ġprivate Ġval Ġne ighbours Ġ= ĠLinkedHashMap < Int , ĠLinked HashSet < Int >>() ĊĊĠĠĠ Ġfun Ġadd Edge ( from : ĠInt , Ġto : ĠInt , Ġweight : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( from Ġ> Ġto ) Ġreturn Ġadd Edge ( to , Ġfrom , Ġweight ) ĊĊĠĠĠĠĠĠĠ Ġval Ġexisting Edge Ġ= Ġad jacency [ Pair ( from , Ġto )] ĊĠĠĠĠĠĠĠ Ġif Ġ( existing Edge Ġ!= Ġnull Ġ&& Ġexisting Edge . weight Ġ<= Ġweight ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġad jacency [ Pair ( from , Ġto )] Ġ= ĠEdge ( from , Ġto , Ġweight ) ĊĠĠĠĠĠĠĠ Ġne ighbours . get Or Put ( from , Ġ{ ĠLinked HashSet () Ġ}). add ( to ) ĊĠĠĠĠĠĠĠ Ġne ighbours . get Or Put ( to , Ġ{ ĠLinked HashSet () Ġ}). add ( from ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġne ighbours Of ( node : ĠInt ): ĠSet < Int > Ġ= Ġne ighbours [ node ] Ġ?: Ġempty Set () ĊĊĠĠĠ Ġfun Ġfind Edge ( from : ĠInt , Ġto : ĠInt ): ĠEdge ? Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( from Ġ> Ġto ) Ġad jacency [ Pair ( to , Ġfrom )] ĊĠĠĠĠĠĠĠ Ġelse Ġad jacency [ Pair ( from , Ġto )] Ċ } Ċ Ċ private Ġdata Ġclass ĠPaths ( val Ġprev Node : ĠList < Int >, Ġval Ġmin Dist : ĠList < Int >) Ċ Ċ private Ġfun ĠGraph . short est Paths ( from Node : ĠInt ): ĠPaths Ġ{ ĊĠĠĠ Ġval Ġprev Ġ= ĠArray ( size Ġ+ Ġ 1 , Ġ{ Ġ- 1 Ġ}). to Mutable List () ĊĠĠĠ Ġval Ġmin Dist Ġ= ĠArray ( size Ġ+ Ġ 1 , Ġ{ ĠInt . MAX _ VALUE Ġ}). to Mutable List () ĊĠĠĠ Ġmin Dist [ from Node ] Ġ= Ġ 0 ĊĊĠĠĠ Ġval Ġqueue Ġ= ĠBinary Heap < Int >( Comparator Ġ{ Ġnode 1 , Ġnode 2 Ġ-> Ġmin Dist [ node 1 ]. compareTo ( min Dist [ node 2 ]) Ġ}) ĊĠĠĠ Ġqueue . addAll ( nodes ) ĊĊĠĠĠ Ġwhile Ġ( queue . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġqueue . remove () ĊĊĠĠĠĠĠĠĠ Ġval Ġis Un reachable Node Ġ= Ġmin Dist [ node ] Ġ== ĠInt . MAX _ VALUE ĊĠĠĠĠĠĠĠ Ġif Ġ( is Un reachable Node ) Ġcontinue ĊĊĠĠĠĠĠĠĠ Ġne ighbours Of ( node ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġqueue . contains ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġneighbour Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdistance Ġ= Ġmin Dist [ node ] Ġ+ Ġfind Edge ( node , Ġneighbour ) !!. weight ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( distance Ġ< Ġmin Dist [ ne ighbour ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Dist [ ne ighbour ] Ġ= Ġdistance ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev [ ne ighbour ] Ġ= Ġnode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueue . update Priority Of ( ne ighbour ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġmin Dist . indices . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( min Dist [ it ] Ġ== ĠInt . MAX _ VALUE ) Ġmin Dist [ it ] Ġ= Ġ- 1 ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠPaths ( prev , Ġmin Dist ) Ċ } Ċ Ċ private Ġfun ĠGraph . render As Graph Viz ( graph Name : ĠString Ġ= Ġ" graph ", Ġheight : ĠInt Ġ= Ġ 5 0 0 ): ĠRenderer Ġ{ ĊĠĠĠ Ġval Ġgraph Viz Ġ= Ġmut Graph ( graph Name ). set Direct ed ( false ) ĊĠĠĠ Ġgraph Viz . graph Attrs (). add ( Rank Dir . LEFT _ TO _ RIGHT ) ĊĊĠĠĠ Ġval Ġgraph Viz Node ById Ġ= Ġnodes ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . toString () Ġ} ĊĠĠĠĠĠĠĠ Ġ. associate Ġ{ ĠPair ( it , Ġmut Node ( it )) Ġ} ĊĊĠĠĠ Ġgraph Viz Node ById . values . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġgraph Viz . add ( it ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġedges . forEach Ġ{ Ġ( from , Ġto , Ġweight ) Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġfrom Node Ġ= Ġgraph Viz Node ById [ from . toString ()] !! ĊĠĠĠĠĠĠĠ Ġval Ġto Node Ġ= Ġgraph Viz Node ById [ to . toString ()] !! ĊĠĠĠĠĠĠĠ Ġval Ġlabel Ġ= ĠLabel . of ( weight . toString ()) ĊĠĠĠĠĠĠĠ Ġfrom Node . add Link ( Link . to ( to Node ). with ( label )) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠGraph viz . from Graph ( graph Viz ). height ( height ). render ( Format . PNG ) Ċ } Ċ Ċ class ĠD ijk stra Short est Path 2 Tests Ġ{ ĊĠĠĠ Ġprivate Ġval ĠbasePath Ġ= Ġ" src / kat as / kotlin / hack err ank / short est _ path " ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` basic Ġexample `() Ġ{ ĊĠĠĠĠĠĠĠ ĠGraph ( size Ġ= Ġ 5 ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Edge ( 1 , Ġ 2 , Ġweight Ġ= Ġ 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Edge ( 2 , Ġ 3 , Ġweight Ġ= Ġ 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Edge ( 3 , Ġ 4 , Ġweight Ġ= Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Edge ( 1 , Ġ 3 , Ġweight Ġ= Ġ 1 5 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmin Dist Ġ= Ġshortest Paths ( from Node Ġ= Ġ 1 ). min Dist . print ed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmin Dist . drop ( 1 ) Ġshould Equal ĠlistOf ( 0 , Ġ 5 , Ġ 1 1 , Ġ 1 3 , Ġ- 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġrender As Graph Viz (). to File ( File (" src / kat as / kotlin / hack err ank / short est _ path / basic - example . png ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` sample Ġtests Ġcase Ġ 0 `() Ġ{ ĊĠĠĠĠĠĠĠ ĠGraph ( size Ġ= Ġ 4 ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Edge ( 1 , Ġ 2 , Ġweight Ġ= Ġ 2 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Edge ( 1 , Ġ 4 , Ġweight Ġ= Ġ 2 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Edge ( 3 , Ġ 1 , Ġweight Ġ= Ġ 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Edge ( 4 , Ġ 3 , Ġweight Ġ= Ġ 1 2 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmin Dist Ġ= Ġshortest Paths ( from Node Ġ= Ġ 1 ). min Dist . print ed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmin Dist . drop ( 1 ) Ġshould Equal ĠlistOf ( 0 , Ġ 2 4 , Ġ 3 , Ġ 1 5 ) Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġrender As Graph Viz (). to File ( File ("$ basePath / sample - test - case - 0 . png ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` sample Ġtests Ġcase Ġ 1 `() Ġ{ ĊĠĠĠĠĠĠĠ ĠGraph ( size Ġ= Ġ 5 ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Edge ( 1 , Ġ 2 , Ġweight Ġ= Ġ 1 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Edge ( 1 , Ġ 3 , Ġweight Ġ= Ġ 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Edge ( 2 , Ġ 4 , Ġweight Ġ= Ġ 8 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmin Dist Ġ= Ġshortest Paths ( from Node Ġ= Ġ 2 ). min Dist . print ed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmin Dist . drop ( 1 ) Ġshould Equal ĠlistOf ( 1 0 , Ġ 0 , Ġ 1 6 , Ġ 8 , Ġ- 1 ) Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġrender As Graph Viz (). to File ( File ("$ basePath / sample - test - case - 1 . png ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` test Ġcases Ġ 2 `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġread Line Ġ= ĠFile ("$ basePath / test - cases - 2 - input . txt "). read Text (). to ReadLine Function () ĊĠĠĠĠĠĠĠ Ġval Ġoutput Recorder Ġ= ĠOutput Recorder () ĊĊĠĠĠĠĠĠĠ Ġmain ( readLine , Ġoutput Recorder ) ĊĊĠĠĠĠĠĠĠ Ġoutput Recorder . text . trim () Ġshould Equal Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 0 Ġ 2 5 Ġ 2 5 Ġ 6 8 Ġ 8 6 Ġ 3 9 Ġ 2 2 Ġ 7 0 Ġ 3 6 Ġ 5 3 Ġ 9 1 Ġ 3 5 Ġ 8 8 Ġ 2 7 Ġ 3 0 Ġ 4 3 Ġ 5 4 Ġ 7 4 Ġ 4 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 9 Ġ 8 Ġ 8 Ġ 8 Ġ 1 2 Ġ 7 Ġ 1 5 Ġ 8 Ġ 4 Ġ 1 Ġ 1 2 Ġ 9 Ġ 7 Ġ 1 0 Ġ 4 Ġ 1 0 Ġ 1 0 Ġ 4 Ġ 1 Ġ 7 Ġ 1 2 Ġ 7 Ġ 1 1 Ġ 1 2 Ġ 1 5 Ġ 1 0 Ġ 5 Ġ 1 1 Ġ 6 Ġ 7 Ġ 9 Ġ 1 1 Ġ 9 Ġ 7 Ġ 7 Ġ 1 4 Ġ 5 Ġ 1 3 Ġ 6 Ġ 8 Ġ 1 0 Ġ 7 Ġ 4 Ġ 9 Ġ 3 Ġ 5 Ġ 5 Ġ 9 Ġ 1 3 Ġ 1 Ġ 8 Ġ 1 1 Ġ 4 Ġ 9 Ġ 6 Ġ 7 Ġ 7 Ġ 8 Ġ 1 1 Ġ 6 Ġ 1 0 Ġ 7 Ġ 8 Ġ 9 Ġ 1 3 Ġ 9 Ġ 1 2 Ġ 8 Ġ 3 Ġ 5 Ġ 7 Ġ 1 5 Ġ 6 Ġ 1 0 Ġ 1 1 Ġ 5 Ġ 1 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 5 4 Ġ 9 0 Ġ 1 8 6 Ġ 1 9 0 Ġ 1 7 8 Ġ 1 1 4 Ġ 1 2 3 Ġ- 1 Ġ- 1 Ġ 1 2 3 Ġ- 1 Ġ 1 0 4 Ġ- 1 Ġ- 1 Ġ- 1 Ġ 2 0 7 Ġ 1 3 4 Ġ 1 2 3 Ġ 9 8 Ġ 1 5 5 Ġ- 1 Ġ 1 9 8 Ġ 6 8 Ġ 9 0 Ġ 1 7 0 Ġ 1 3 5 Ġ- 1 Ġ 1 0 3 Ġ 1 4 5 Ġ- 1 Ġ 5 4 Ġ 1 1 1 Ġ 1 6 3 Ġ 1 7 3 Ġ 1 1 5 Ġ 8 7 Ġ 1 5 9 Ġ 7 5 Ġ- 1 Ġ 9 4 Ġ 1 0 2 Ġ- 1 Ġ 7 6 Ġ 6 7 Ġ 1 6 7 Ġ 1 3 8 Ġ 2 1 6 Ġ- 1 Ġ 1 7 2 Ġ 1 0 2 Ġ 2 1 2 Ġ 1 6 3 Ġ 1 0 3 Ġ 1 1 2 Ġ- 1 Ġ 1 8 2 Ġ 4 9 Ġ 1 4 5 Ġ 9 2 Ġ- 1 Ġ- 1 Ġ 1 9 4 Ġ- 1 Ġ 1 8 2 Ġ- 1 Ġ 2 0 1 Ġ 9 6 Ġ- 1 Ġ 8 5 Ġ 1 2 1 Ġ 1 0 8 Ġ 1 6 1 Ġ 1 3 0 Ġ 1 0 0 Ġ 1 2 0 Ġ- 1 Ġ- 1 Ġ 1 1 8 Ġ 2 1 5 Ġ 9 2 Ġ 1 5 6 Ġ 1 6 2 Ġ 1 6 3 Ġ 1 6 8 Ġ 7 1 Ġ 1 1 0 Ġ- 1 Ġ- 1 Ġ 1 9 0 Ġ 2 1 7 Ġ 1 0 0 Ġ 1 0 5 Ġ 1 7 8 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 3 Ġ 3 0 Ġ 1 7 Ġ 3 3 Ġ 1 6 Ġ 9 Ġ 3 1 Ġ 3 4 Ġ 1 4 Ġ 2 0 Ġ 2 1 Ġ 1 9 Ġ 2 4 Ġ 3 4 Ġ 2 7 Ġ 4 2 Ġ 1 5 Ġ 1 6 Ġ 1 9 Ġ 2 3 Ġ 1 8 Ġ 2 1 Ġ 1 1 Ġ 2 1 Ġ 2 8 Ġ 1 5 Ġ 1 5 Ġ 4 5 Ġ 1 8 Ġ 2 6 Ġ 1 7 Ġ 2 0 Ġ 1 6 Ġ 2 8 Ġ 2 7 Ġ 1 6 Ġ 2 2 Ġ 2 1 Ġ 1 8 Ġ 2 1 Ġ 3 4 Ġ 1 4 Ġ 2 6 Ġ 2 7 Ġ 1 1 Ġ 2 3 Ġ 1 7 Ġ 2 4 Ġ 2 7 Ġ 2 2 Ġ 1 9 Ġ 1 8 Ġ 2 1 Ġ 1 7 Ġ 1 7 Ġ 2 2 Ġ 1 4 Ġ 2 0 Ġ 1 2 Ġ 2 7 Ġ 2 1 Ġ 1 0 Ġ 4 2 Ġ 1 0 Ġ 2 5 Ġ 1 9 Ġ 2 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 3 Ġ 6 Ġ 8 Ġ 1 1 Ġ 7 Ġ 1 2 Ġ 1 0 Ġ 1 8 Ġ 4 Ġ 8 Ġ 3 Ġ 6 Ġ 1 2 Ġ 1 Ġ 2 Ġ 1 0 Ġ 1 Ġ 8 Ġ 5 Ġ 6 Ġ 9 Ġ 9 Ġ 8 Ġ 1 7 Ġ 1 1 Ġ 1 2 Ġ 8 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 3 Ġ 4 Ġ 5 Ġ 3 Ġ 4 Ġ 5 Ġ 5 Ġ 4 Ġ 4 Ġ 7 Ġ 6 Ġ 4 Ġ 1 Ġ 4 Ġ 5 Ġ 5 Ġ 5 Ġ 4 Ġ 5 Ġ 6 Ġ 5 Ġ 6 Ġ 4 Ġ 5 Ġ 3 Ġ 5 Ġ 5 Ġ 6 Ġ 2 Ġ 6 Ġ 3 Ġ 3 Ġ 6 Ġ 5 Ġ 3 Ġ 6 Ġ 3 Ġ 2 Ġ 6 Ġ 4 Ġ 1 Ġ 6 Ġ 3 Ġ 4 Ġ 5 Ġ 6 Ġ 7 Ġ 7 Ġ 3 Ġ 6 Ġ 3 Ġ 5 Ġ 3 Ġ 5 Ġ 4 Ġ 7 Ġ 4 Ġ 4 Ġ 6 Ġ 4 Ġ 5 Ġ 5 Ġ 5 Ġ 4 Ġ 2 Ġ 2 Ġ 3 Ġ 6 Ġ 4 Ġ 6 Ġ 4 Ġ 4 Ġ 5 Ġ 4 Ġ 6 Ġ 3 Ġ 5 Ġ 5 Ġ 4 Ġ 4 Ġ 4 Ġ 2 Ġ 1 Ġ 3 Ġ 3 Ġ 3 Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` test Ġcases Ġ 7 `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġread Line Ġ= ĠFile ("$ basePath / test - cases - 7 - input . txt "). inputStream (). to ReadLine Function () ĊĠĠĠĠĠĠĠ Ġval Ġoutput Recorder Ġ= ĠOutput Recorder () ĊĊĠĠĠĠĠĠĠ Ġmain ( readLine , Ġoutput Recorder ) ĊĊĠĠĠĠĠĠĠ Ġoutput Recorder . text . trim () Ġshould Equal ĠFile ("$ basePath / test - cases - 7 - expected . txt "). read Text () ĊĠĠĠ Ġ} Ċ } Ċ