package Ġus . j wf . a oc Ċ Ċ import Ġjava . io . File Ċ import Ġjava . io . FileInputStream Ċ import Ġjava . io . InputStream Reader Ċ import Ġjava . io . Reader Ċ import Ġjava . util . Scanner Ċ import Ġjava . util . regex . Pattern Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . flow Ċ import Ġkotlinx . coroutines . flow . fold Ċ Ċ /** Ċ Ġ* ĠF etches Ġan Ġ[ InputStream Reader ] Ġfor Ġthe Ġreceiving Ġ[ String ? ]. Ċ Ġ* Ċ Ġ* ĠIf Ġthe Ġreceiver Ġis Ġnull , Ġa Ġrelative Ġpath Ġto Ġ` input /[ year ]/ day [ day ]. txt ` Ċ Ġ* Ġwill Ġbe Ġconstructed Ġand Ġused . Ċ Ġ*/ Ċ fun ĠString ?. fetch Input ( year : ĠInt , Ġday : ĠInt ): ĠInputStreamReader Ġ{ ĊĠ Ġval Ġday Na ught Ġ= Ġif Ġ( day Ġ< Ġ 1 0 ) Ġ" 0 " Ġelse Ġ"" ĊĠ Ġval Ġfile Ġ= Ġif Ġ( this Ġ== Ġnull ) Ġ{ ĊĠĠĠ ĠFile (" input /$ year / day $ day Na ught $ day . txt ") ĊĠ Ġ} Ġelse Ġ{ ĊĠĠĠ ĠFile ( this ) ĊĠ Ġ} ĊĠ Ġrequire ( file . exists ()) Ġ{ Ġ" No Ġsuch Ġfile Ġfound Ġat Ġ${ file . absolute Path }" Ġ} ĊĠ Ġreturn ĠInputStreamReader ( FileInputStream ( file ), ĠChar sets . UTF _ 8 ) Ċ } Ċ Ċ /** Ċ Ġ* ĠParses Ġthe Ġreceiving Ġ[ Reader ] Ġas Ġa Ġ[ Flow ] Ġof Ġ[ Int ] s Ġdelimited Ġby Ġthe Ġprovided Ġ[ delimiter ]. Ċ Ġ*/ Ċ fun ĠReader . toInt Flow ( delimiter : ĠString Ġ= Ġ"\ n "): ĠFlow < Int > Ġ= Ġflow Ġ{ ĊĠ Ġval Ġscanner Ġ= ĠScanner ( this @ toInt Flow ) ĊĠ Ġscanner . use Delimiter ( Pattern . compile ( delimiter )) ĊĊĠ Ġwhile Ġ( scanner . hasNext ()) Ġ{ ĊĠĠĠ Ġval Ġtoken Ġ= Ġscanner . next () ĊĠĠĠ Ġval Ġint Val Ġ= Ġtoken . toInt ( 1 0 ) Ġ// Ġscanner . nextInt ( 1 0 ) ĊĠĠĠ Ġemit ( int Val ) ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠParses Ġthe Ġreceiving Ġ[ Reader ] Ġas Ġa Ġ[ Flow ] Ġof Ġ[ Int ] s Ġdelimited Ġby Ġthe Ġprovided Ġ[ delimiter ]. Ċ Ġ*/ Ċ fun ĠReader . to Long Flow ( delimiter : ĠString Ġ= Ġ"\ n "): ĠFlow < Long > Ġ= Ġflow Ġ{ ĊĠ Ġval Ġscanner Ġ= ĠScanner ( this @ to Long Flow ) ĊĠ Ġscanner . use Delimiter ( Pattern . compile ( delimiter )) ĊĊĠ Ġwhile Ġ( scanner . hasNext ()) Ġ{ ĊĠĠĠ Ġval Ġtoken Ġ= Ġscanner . next () ĊĠĠĠ Ġval Ġint Val Ġ= Ġtoken . to Long ( 1 0 ) Ġ// Ġscanner . nextInt ( 1 0 ) ĊĠĠĠ Ġemit ( int Val ) ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠParses Ġthe Ġreceiving Ġ[ Reader ] Ġinto Ġmatched - parts Ġof Ġthe Ġprovided Ġ[ pattern ], Ġdelimited Ġby Ġthe Ċ Ġ* Ġprovided Ġ[ delimiter ]. Ċ Ġ*/ Ċ fun ĠReader . toMatch Flow ( ĊĠ Ġpattern : ĠRegex , ĊĠ Ġdelimiter : ĠString Ġ= Ġ"\ n " Ċ ): ĠFlow < List < String >> Ġ= Ġflow Ġ{ ĊĠ Ġval Ġscanner Ġ= ĠScanner ( this @ toMatch Flow ) ĊĠ Ġscanner . use Delimiter ( delimiter ) ĊĊĠ Ġwhile Ġ( scanner . hasNext ()) Ġ{ ĊĠĠĠ Ġval Ġraw Ġ= Ġscanner . next () ĊĠĠĠ Ġval Ġmatch Result Ġ= Ġpattern . find ( raw ) Ġ?: Ġcontinue ĊĠĠĠ Ġemit ( match Result . group Values ) ĊĠ Ġ} Ċ } Ċ Ċ fun ĠReader . to Line Flow ( delimiter : ĠString Ġ= Ġ"\ n "): ĠFlow < String > Ġ= Ġflow Ġ{ ĊĠ Ġval Ġscanner Ġ= ĠScanner ( this @ to Line Flow ) ĊĠ Ġscanner . use Delimiter ( delimiter ) ĊĊĠ Ġwhile Ġ( scanner . hasNext ()) Ġemit ( scanner . next ()) Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġwhether Ġor Ġnot Ġthe Ġreceiving ĠString Ġis Ġa Ġvalid Ġbase - 1 0 Ġinteger Ġwithin Ġthe Ġprovided Ċ Ġ* Ġ[ range ]. Ċ Ġ*/ Ċ fun ĠString . is Int InRange ( range : ĠInt Range ): ĠBoolean Ġ= ĊĠ Ġto Int OrNull ( 1 0 )?. let Ġ{ Ġit Ġin Ġrange Ġ} Ġ== Ġtrue Ċ Ċ fun ĠIterable < Long >. product (): ĠLong Ġ= Ġfold ( 1 L ) Ġ{ Ġacc , Ġvalue Ġ-> Ġvalue Ġ* Ġacc Ġ} Ċ fun Ġ< T > ĠIterable < T >. product ( block : Ġ( T ) Ġ-> ĠLong ): ĠLong Ġ= ĊĠ Ġfold ( 1 L ) Ġ{ Ġacc , Ġvalue Ġ-> Ġblock ( value ) Ġ* Ġacc Ġ} Ċ Ċ data Ġclass ĠPoint ( val Ġx : ĠInt , Ġval Ġy : ĠInt ) Ċ