import Ġutils . Parser Ċ import Ġutils . Solution Ċ import Ġutils . cut Ċ import Ġutils . map Items Ċ Ċ fun Ġmain () Ġ{ ĊĠ ĠDay 8 Func . run () Ċ } Ċ Ċ object ĠDay 8 Func Ġ: ĠSolution < List < Day 8 Func . Key >>() Ġ{ ĊĠ Ġoverride Ġval Ġname Ġ= Ġ" day 8 " ĊĠ Ġoverride Ġval Ġparser Ġ= ĠParser . lines . map Items Ġ{ ĊĠĠĠ Ġit . cut ("| ") Ġ{ Ġinput , Ġoutput Ġ-> ĠKey ( input . split (' Ġ'), Ġoutput . split (' Ġ')) Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġpart 1 ( keys : ĠList < Key >): ĠInt Ġ{ ĊĠĠĠ Ġreturn Ġkeys . flatMap Ġ{ ĊĠĠĠĠĠ Ġit . output . filter Ġ{ Ġout Ġ-> Ġout . length Ġin Ġset Of ( 2 , Ġ 3 , Ġ 4 , Ġ 7 ) Ġ} ĊĠĠĠ Ġ}. count () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġpart 2 ( input : ĠList < Key >): ĠNumber ? Ġ{ ĊĠĠĠ Ġreturn Ġinput . map Ġ{ ĊĠĠĠĠĠ Ġval Ġp Ġ= Ġsolve ( it . digits ) ĊĠĠĠĠĠ Ġit . output . map Ġ{ ĠA [ remap ( it , Ġp )] Ġ}. join ToString ( separator Ġ= Ġ""). toInt () ĊĠĠĠ Ġ}. sum () ĊĠ Ġ} ĊĊĠ Ġfun Ġper mutations ( input : ĠString ): ĠList < String > Ġ{ ĊĠĠĠ Ġif Ġ( input . length Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠ Ġreturn ĠlistOf ( input ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġinput . toCharArray (). flatMap Indexed Ġ{ Ġindex , Ġchar Ġ-> ĊĠĠĠĠĠ Ġper mutations ( input . substring ( 0 Ġuntil Ġindex ) Ġ+ Ġinput . substring ( index Ġ+ Ġ 1 )). map Ġ{ ĊĠĠĠĠĠĠĠ Ġchar Ġ+ Ġit ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġval ĠP Ġ= Ġper mutations (" abcdef g ") ĊĠ Ġval ĠA Ġ= Ġmap Of ( ĊĠĠĠ Ġ" ab ce fg " Ġto Ġ' 0 ', ĊĠĠĠ Ġ" cf " Ġto Ġ' 1 ', ĊĠĠĠ Ġ" ac deg " Ġto Ġ' 2 ', ĊĠĠĠ Ġ" ac df g " Ġto Ġ' 3 ', ĊĠĠĠ Ġ" bc df " Ġto Ġ' 4 ', ĊĠĠĠ Ġ" ab df g " Ġto Ġ' 5 ', ĊĠĠĠ Ġ" ab def g " Ġto Ġ' 6 ', ĊĠĠĠ Ġ" acf " Ġto Ġ' 7 ', ĊĠĠĠ Ġ" abcdef g " Ġto Ġ' 8 ', ĊĠĠĠ Ġ" abc df g " Ġto Ġ' 9 ' ĊĠ Ġ) ĊĊĠ Ġfun Ġremap ( key : ĠString , Ġperm : ĠString ): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġkey . toCharArray (). map Ġ{ ĊĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ' a ' Ġ-> Ġperm [ 0 ] ĊĠĠĠĠĠĠĠ Ġ' b ' Ġ-> Ġperm [ 1 ] ĊĠĠĠĠĠĠĠ Ġ' c ' Ġ-> Ġperm [ 2 ] ĊĠĠĠĠĠĠĠ Ġ' d ' Ġ-> Ġperm [ 3 ] ĊĠĠĠĠĠĠĠ Ġ' e ' Ġ-> Ġperm [ 4 ] ĊĠĠĠĠĠĠĠ Ġ' f ' Ġ-> Ġperm [ 5 ] ĊĠĠĠĠĠĠĠ Ġ' g ' Ġ-> Ġperm [ 6 ] ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalStateException (" Bad Ġinput , Ġbad !") ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. sorted (). join ToString ( separator Ġ= Ġ"") ĊĠ Ġ} ĊĊĠ Ġfun Ġsolve ( digits : ĠList < String >): ĠString Ġ{ ĊĠĠĠ Ġval Ġsolved Ġ= ĠP . filter Ġ{ Ġp Ġ-> Ġdigits . map Ġ{ Ġremap ( it , Ġp ) Ġ}. toSet () Ġ== ĠA . keys Ġ} ĊĠĠĠ Ġreturn Ġsolved . first () ĊĠ Ġ} ĊĊĠ Ġdata Ġclass ĠKey ( val Ġdigits : ĠList < String >, Ġval Ġoutput : ĠList < String >) Ċ } Ċ