package Ġus . j wf . a oc 2 0 1 5 Ċ Ċ import Ġjava . io . Reader Ċ import Ġkotlinx . coroutines . flow . map Ċ import Ġkotlinx . coroutines . flow . toSet Ċ import Ġkotlinx . coroutines . flow . with Index Ċ import Ġus . j wf . a oc . Day Ċ import Ġus . j wf . a oc . toInt Flow Ċ Ċ /** Ċ Ġ* ĠA o C Ġ 2 0 1 5 Ġ- ĠDay Ġ 1 7 Ċ Ġ*/ Ċ class ĠDay 1 7 NoSuch Thing Ġ: ĠDay < Int , ĠInt > Ġ{ ĊĠ Ġoverride Ġsuspend Ġfun Ġexecute Part 1 ( input : ĠReader ): ĠInt Ġ{ ĊĠĠĠ Ġval Ġsizes Ġ= Ġinput . toInt Flow (). with Index (). map Ġ{ Ġv Ġ-> Ġv . index Ġto Ġv . value Ġ}. toSet () ĊĊĠĠĠ Ġval Ġcache Ġ= Ġmutable Map Of < Pair < Int , ĠSet < Pair < Int , ĠInt >> >, ĠInt >() ĊĠĠĠ Ġfun Ġcount ( lit ers : ĠInt , Ġremaining : ĠSet < Pair < Int , ĠInt >> ): ĠInt Ġ{ ĊĠĠĠĠĠ Ġval Ġargs Ġ= Ġlit ers Ġto Ġremaining ĊĠĠĠĠĠ Ġreturn Ġ( cache [ args ]?. let Ġ{ Ġ 0 Ġ} ĊĠĠĠĠĠĠĠ Ġ?: Ġif Ġ( lit ers Ġ== Ġ 0 ) Ġ 1 ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( lit ers Ġ< Ġ 0 ) Ġ 0 ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġremaining . sum Of Ġ{ Ġid And Size Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġid And Size . second ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcount ( lit ers Ġ- Ġsize , Ġremaining Ġ- Ġid And Size ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}). also Ġ{ Ġcache [ args ] Ġ= Ġit Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġcount ( 1 5 0 , Ġsizes ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġexecute Part 2 ( input : ĠReader ): ĠInt Ġ{ ĊĠĠĠ Ġval Ġsizes Ġ= Ġinput . toInt Flow (). with Index (). map Ġ{ Ġv Ġ-> Ġv . index Ġto Ġv . value Ġ}. toSet () ĊĊĠĠĠ Ġval Ġcache Ġ= Ġmutable Map Of < Pair < Int , ĠSet < Pair < Int , ĠInt >> >, ĠInt >() ĊĠĠĠ Ġval Ġanswers Ġ= Ġmutable Set Of < Set < Pair < Int , ĠInt >> >() ĊĠĠĠ Ġfun Ġcount ( lit ers : ĠInt , Ġremaining : ĠSet < Pair < Int , ĠInt >>, Ġso Far : ĠSet < Pair < Int , ĠInt >> ): ĠInt Ġ{ ĊĠĠĠĠĠ Ġval Ġargs Ġ= Ġlit ers Ġto Ġremaining ĊĠĠĠĠĠ Ġreturn Ġ( cache [ args ]?. let Ġ{ Ġ 0 Ġ} ĊĠĠĠĠĠĠĠ Ġ?: Ġif Ġ( lit ers Ġ== Ġ 0 ) Ġ 1 . also Ġ{ Ġanswers . add ( so Far ) Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( lit ers Ġ< Ġ 0 ) Ġ 0 ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġremaining . sum Of Ġ{ Ġid And Size Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġid And Size . second ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcount ( lit ers Ġ- Ġsize , Ġremaining Ġ- Ġid And Size , Ġso Far Ġ+ Ġid And Size ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}). also Ġ{ Ġcache [ args ] Ġ= Ġit Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcount ( 1 5 0 , Ġsizes , Ġempty Set ()) ĊĊĠĠĠ Ġval Ġmin Size Ġ= Ġanswers . min Of Ġ{ Ġit . size Ġ} ĊĠĠĠ Ġreturn Ġanswers . count Ġ{ Ġit . size Ġ== Ġmin Size Ġ} ĊĠ Ġ} Ċ }