package Ġcode . day 8 Ċ Ċ import Ġjava . io . File Ċ Ċ fun Ġmain () Ġ{ ĊĠĠĠ Ġdo It (" Day Ġ 8 ĠPart Ġ 1 : ĠTest ĠInput ", Ġ" src / code / day 8 / test . input ", Ġpart 1 ) ĊĠĠĠ Ġdo It (" Day Ġ 8 ĠPart Ġ 1 : ĠReal ĠInput ", Ġ" src / code / day 8 / part 1 . input ", Ġpart 1 ) ĊĠĠĠ Ġdo It (" Day Ġ 8 ĠPart Ġ 2 : ĠTest ĠInput ", Ġ" src / code / day 8 / test . input ", Ġpart 2 ); ĊĠĠĠ Ġdo It (" Day Ġ 8 ĠPart Ġ 2 : ĠReal ĠInput ", Ġ" src / code / day 8 / part 1 . input ", Ġpart 2 ); Ċ } Ċ Ċ fun Ġdo It ( msg : ĠString , Ġinput : ĠString , Ġcalc : Ġ( nums : ĠList < String >) Ġ-> ĠInt ) Ġ{ ĊĠĠĠ Ġval Ġlines Ġ= Ġarray ListOf < String >() ĊĠĠĠ ĠFile ( input ). forEach Line Ġ{ Ġlines . add ( it ) Ġ} ĊĊĠĠĠ Ġprintln ( String . format ("% s : ĠAn s : Ġ% d ", Ġmsg Ġ, Ġcalc ( lines ))) Ċ } Ċ Ċ val Ġpart 1 : Ġ( List < String >) Ġ-> ĠInt Ġ= Ġ{ Ġlines ĠĠ Ġ-> ĊĠĠĠ Ġval Ġinputs Ġ= Ġparse ( lines ). inputs Ċ /* Ċ Ġ* Ġ 1 Ġ-> Ġ 2 Ċ Ġ* Ġ 4 Ġ-> Ġ 4 Ċ Ġ* Ġ 7 Ġ-> Ġ 3 Ċ Ġ* Ġ 8 Ġ-> Ġ 7 Ċ Ġ* Ġ 2 , Ġ 3 , Ġ 5 Ġ-> Ġ 5 Ċ Ġ* Ġ 0 , Ġ 6 , Ġ 9 Ġ-> Ġ 6 Ċ Ġ*/ ĊĠĠĠ Ġvar Ġsum Ġ= Ġ 0 ĊĠĠĠ Ġfor Ġ( i Ġin Ġinputs . indices ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsum Ġ+= Ġinputs [ i ]. second . filter Ġ{ ĠlistOf ( 2 , Ġ 3 , Ġ 4 , Ġ 7 ). contains ( it . length ) Ġ}. size ĊĠĠĠ Ġ} ĊĠĠĠ Ġsum Ċ } Ċ Ċ val Ġvalid s Ġ= Ġmap Of ( 0 Ġto Ġ" ab ce fg ", Ġ 1 Ġto Ġ" cf ", Ġ 2 Ġto Ġ" ac deg ", Ġ 3 Ġto Ġ" ac df g ", Ġ 4 Ġto Ġ" bc df ", Ġ 5 Ġto Ġ" ab df g ", Ġ 6 Ġto Ġ" ab def g ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 7 Ġto Ġ" acf ", Ġ 8 Ġto Ġ" abcdef g ", Ġ 9 Ġto Ġ" abc df g ") Ċ Ċ val Ġpart 2 : Ġ( List < String >) Ġ-> ĠInt Ġ= Ġ{ Ġlines Ġ-> ĊĠĠĠ Ġval Ġinputs Ġ= Ġparse ( lines ). inputs ĊĊĠĠĠ Ġvar Ġsum Ġ= Ġ 0 ĊĠĠĠ Ġfor Ġ( i Ġin Ġinputs . indices ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdecrypt or Ġ= Ġdecrypt ( inputs [ i ]. first ) ĊĠĠĠĠĠĠĠ Ġvar Ġnum Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġfor Ġ( elem Ġin Ġinputs [ i ]. second ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnum Ġ= Ġnum . plus ( decrypt or [ key ( elem )]) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsum Ġ+= Ġnum . toInt () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsum Ċ } Ċ Ċ fun Ġkey ( str : ĠString ): ĠString Ġ{ ĊĠĠĠ Ġreturn ĠString ( str . toCharArray (). apply Ġ{ Ġsort () Ġ}) Ċ } Ċ Ċ val Ġdecrypt : Ġ( List < String >) Ġ-> ĠMap < String , ĠString > Ġ= Ġ{ Ġencoded Ġ-> ĊĠĠĠ Ġval Ġdigit Ġ= ĠMutable List < String >( 1 0 ) Ġ{ "" } ĊĊĠĠĠ Ġdigit [ 7 ] Ġ= Ġencoded . first Ġ{ Ġit . length Ġ== Ġ 3 Ġ} ĊĠĠĠ Ġdigit [ 1 ] Ġ= Ġencoded . first Ġ{ Ġit . length Ġ== Ġ 2 Ġ} ĊĠĠĠ Ġdigit [ 4 ] Ġ= Ġencoded . first Ġ{ Ġit . length Ġ== Ġ 4 Ġ} ĊĠĠĠ Ġdigit [ 8 ] Ġ= Ġencoded . first Ġ{ Ġit . length Ġ== Ġ 7 Ġ} ĊĠĠĠ Ġdigit [ 9 ] Ġ= Ġencoded . first Ġ{ Ġit . length Ġ== Ġ 6 Ġ&& Ġcontains All ( digit [ 4 ], Ġit ) Ġ} ĊĠĠĠ Ġdigit [ 0 ] Ġ= Ġencoded . first Ġ{ Ġit . length Ġ== Ġ 6 Ġ&& Ġ! contains All ( digit [ 4 ], Ġit ) Ġ&& Ġcontains All ( digit [ 1 ], Ġit ) Ġ} ĊĠĠĠ Ġdigit [ 6 ] Ġ= Ġencoded . first Ġ{ Ġit . length Ġ== Ġ 6 Ġ&& Ġit Ġ!= Ġdigit [ 9 ] Ġ&& Ġit Ġ!= Ġdigit [ 0 ] Ġ} ĊĠĠĠ Ġdigit [ 3 ] Ġ= Ġencoded . first Ġ{ Ġit . length Ġ== Ġ 5 Ġ&& Ġcontains All ( digit [ 7 ], Ġit ) Ġ} ĊĠĠĠ Ġdigit [ 5 ] Ġ= Ġencoded . first Ġ{ Ġit . length Ġ== Ġ 5 Ġ&& Ġcontains All ( it , Ġdigit [ 6 ]) Ġ} ĊĠĠĠ Ġdigit [ 2 ] Ġ= Ġencoded . first Ġ{ Ġit . length Ġ== Ġ 5 Ġ&& Ġit Ġ!= Ġdigit [ 5 ] Ġ&& Ġit Ġ!= Ġdigit [ 3 ] Ġ} ĊĊĠĠĠ Ġval Ġret Ġ= Ġmutable Map Of < String , ĠString >() ĊĠĠĠ Ġfor Ġ( i Ġin Ġdigit . indices ) Ġ{ ĊĠĠĠĠĠĠĠ Ġret [ key ( digit [ i ])] Ġ= Ġi . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġret Ċ } Ċ Ċ fun Ġcontains All ( chars : ĠString , Ġstr : ĠString ): ĠBoolean Ġ{ ĊĠĠĠ Ġvar Ġret Ġ= Ġtrue ĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġchars . length ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! str . contains ( chars [ i ])) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġret Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġret Ċ } Ċ Ċ val Ġparse : Ġ( List < String >) Ġ-> ĠInput Ġ= Ġ{ Ġlines Ġ-> ĊĠĠĠ Ġval Ġparsed Ġ= ĠMutable List < Pair < List < String >, ĠList < String >> >( lines . size ) Ġ{ ĠPair ( mutable ListOf (), Ġmutable ListOf ()) Ġ} ĊĠĠĠ Ġfor Ġ( i Ġin Ġlines . indices ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġraw Ġ= Ġlines [ i ]. split ("| "). map Ġ{ Ġit . trim () Ġ} ĊĠĠĠĠĠĠĠ Ġparsed [ i ] Ġ= ĠPair ( raw [ 0 ]. split (" Ġ"), Ġraw [ 1 ]. split (" Ġ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠInput ( parsed ) Ċ } ĊĊ Ċ class ĠInput ( val Ġinputs : ĠList < Pair < List < String >, ĠList < String >> >) Ċ