package Ġme . pe ck b . a oc ._ 2 0 1 5 . calendar . day 0 9 Ċ Ċ import Ġme . pe ck b . a oc . generators . Input Generator . Input Generator Factory Ċ import Ġme . pe ck b . a oc . generators . Per mutation Generator Ċ import Ġjavax . inject . Inject Ċ import Ġkotlin . Int . Companion . MAX _ VALUE Ċ import Ġkotlin . math . max Ċ import Ġkotlin . math . min Ċ Ċ class ĠDay 0 9 Ġ@ Inject Ġconstructor ( ĊĠ Ġprivate Ġval Ġpermutation Generator : ĠPer mutation Generator , ĊĠ Ġprivate Ġval Ġgenerator Factory : ĠInput Generator Factory , Ċ ) Ġ{ ĊĠ Ġfun Ġpart One ( filename : ĠString ) Ġ= Ġgenerator Factory . for File ( filename ). read Ġ{ Ġinput Ġ-> ĊĠĠĠ Ġgenerate Dist ances ( input . toList (), Ġ:: min ) ĊĠ Ġ} ĊĊĠ Ġfun Ġpart Two ( filename : ĠString ) Ġ= Ġgenerator Factory . for File ( filename ). read Ġ{ Ġinput Ġ-> ĊĠĠĠ Ġgenerate Dist ances ( input . toList (), Ġ:: max ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġgenerate Dist ances ( data : ĠList < String >, Ġcomparator : Ġ( Long , ĠLong ) Ġ-> ĠLong ): ĠLong Ġ{ ĊĠĠĠ Ġval Ġall C ities Ġ= Ġmutable Set Of < String >() ĊĊĠĠĠ Ġdata . forEach Ġ{ ĊĠĠĠĠĠ Ġval Ġcities Ġ= Ġit . substring Before (" Ġ= Ġ") ĊĠĠĠĠĠ Ġval Ġ( source , Ġdestination ) Ġ= Ġcities . split (" Ġto Ġ") ĊĠĠĠĠĠ Ġall C ities . add ( source ) ĊĠĠĠĠĠ Ġall C ities . add ( destination ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġcities With Indices Ġ= Ġall C ities . toList () ĊĠĠĠ Ġval Ġindex Mapping Ġ= Ġmutable Map Of < String , ĠInt >() ĊĊĠĠĠ Ġcities With Indices . forEach Indexed Ġ{ Ġi , Ġcity Ġ-> Ġindex Mapping [ city ] Ġ= Ġi Ġ} ĊĊĠĠĠ Ġval Ġdistances Ġ= ĠArray ( all C ities . size ) Ġ{ ĠArray ( all C ities . size ) Ġ{ ĠMAX _ VALUE . to Long () Ġ} Ġ}. apply Ġ{ ĊĠĠĠĠĠ Ġindices . forEach Ġ{ Ġthis [ it ][ it ] Ġ= Ġ 0 Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata . forEach Ġ{ ĊĠĠĠĠĠ Ġval Ġdistance Ġ= Ġit . substring After (" Ġ= Ġ"). to Long () ĊĠĠĠĠĠ Ġval Ġcities Ġ= Ġit . substring Before (" Ġ= Ġ") ĊĠĠĠĠĠ Ġval Ġ( source , Ġdestination ) Ġ= Ġcities . split (" Ġto Ġ") ĊĠĠĠĠĠ Ġdistances [ index Mapping [ source ] !! ][ index Mapping [ destination ] !! ] Ġ= Ġdistance ĊĠĠĠĠĠ Ġdistances [ index Mapping [ destination ] !! ][ index Mapping [ source ] !! ] Ġ= Ġdistance ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġmut ating Data Ġ= ĠArray ( distances . size ) Ġ{ ĠMAX _ VALUE Ġ}. apply Ġ{ ĊĠĠĠĠĠ Ġ( 0 Ġuntil Ġsize ). forEach Ġ{ Ġthis [ it ] Ġ= Ġit Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġper mutations Ġ= Ġpermutation Generator . generate Per mutations ( mut ating Data ) ĊĊĠĠĠ Ġvar Ġbest Cost Ġ= Ġper mutations . first (). toList (). window ed ( 2 ). sum Of Ġ{ Ġ( s , Ġd ) Ġ-> Ġdistances [ s ][ d ] Ġ} ĊĠĠĠ Ġper mutations . drop ( 1 ). map Ġ{ Ġpermutation Ġ-> ĊĠĠĠĠĠ Ġval Ġcost Ġ= Ġpermutation . toList (). window ed ( 2 ). sum Of Ġ{ Ġ( s , Ġd ) Ġ-> Ġdistances [ s ][ d ] Ġ} ĊĠĠĠĠĠ Ġbest Cost Ġ= Ġcomparator ( best Cost , Ġcost ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġbest Cost ĊĠ Ġ} Ċ } Ċ