package Ġdiv ine . bro thers . qual Ċ Ċ import Ġcom . google . common . collect . Bi Map Ċ import Ġcom . google . common . collect . Hash Bi Map ĊĊ Ċ @ Jvm Inline Ċ value Ġclass ĠSkill ( val Ġid : ĠInt ) Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġid . toString () Ċ } Ċ Ċ @ Jvm Inline Ċ value Ġclass ĠContributor Id ( val Ġid : ĠInt ) Ċ Ċ @ Jvm Inline Ċ value Ġclass ĠProject Id ( val Ġid : ĠInt ) Ċ Ċ data Ġclass ĠSkill Level ( ĊĠĠĠ Ġval Ġskill : ĠSkill , ĊĠĠĠ Ġvar Ġlevel : ĠInt , Ċ ) Ċ Ċ data Ġclass ĠContributor ( ĊĠĠĠ Ġval Ġid : ĠContributor Id , ĊĠĠĠ Ġval Ġname : ĠString , ĊĠĠĠ Ġval Ġskills : ĠMutable List < Skill Level >, Ċ ) Ġ{ ĊĠĠĠ Ġoperator Ġfun Ġget ( skill : ĠSkill ): ĠInt Ġ= Ġskills . first OrNull Ġ{ Ġit . skill Ġ== Ġskill Ġ} ?. level Ġ?: Ġ 0 ĊĠĠĠ Ġin fix Ġfun Ġcan Fill ( requirement : ĠSkill Level ): ĠBoolean Ġ= Ġget ( requirement . skill ) Ġ>= Ġrequirement . level ĊĠĠĠ Ġin fix Ġfun Ġlearn ( skill : ĠSkill ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġskill Level Ġ= Ġskills . first OrNull Ġ{ Ġit . skill Ġ== Ġskill Ġ} Ġ?: ĠSkill Level ( skill , Ġ 0 ). also Ġ{ Ġskills Ġ+= Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġskill Level . level ++ ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠProject ( ĊĠĠĠ Ġval Ġid : ĠProject Id , ĊĠĠĠ Ġval Ġname : ĠString , ĊĠĠĠ Ġval Ġduration : ĠInt , ĊĠĠĠ Ġval Ġbest Before : ĠInt , ĊĠĠĠ Ġval Ġscore : ĠInt , ĊĠĠĠ Ġval Ġroles : ĠList < Skill Level >, Ċ ) Ċ Ċ data Ġclass ĠInput ( ĊĠĠĠ Ġval Ġcontributors : ĠList < Contributor >, ĊĠĠĠ Ġval Ġprojects : ĠList < Project >, ĊĠĠĠ Ġ// id Ġto Ġname ĊĠĠĠ Ġval Ġskills : ĠBi Map < Skill , ĠString >, Ċ ) Ċ Ċ fun Ġparse ( lines : ĠSequence < String >): ĠInput Ġ{ ĊĠĠĠ Ġval Ġiter Ġ= Ġlines . iterator () ĊĠĠĠ Ġval Ġ( num Contribut ors , Ġnum Projects ) Ġ= Ġiter . next (). split (" Ġ"). map Ġ{ Ġit . toInt () Ġ} ĊĊĠĠĠ Ġvar Ġskill Counter Ġ= Ġ 0 ĊĠĠĠ Ġval Ġskill Aliases : ĠBi Map < Skill , ĠString > Ġ= ĠHash Bi Map . create () ĊĠĠĠ Ġval Ġskill Name To Id Ġ= Ġskill Aliases . inverse () ĊĊĠĠĠ Ġfun Ġread Skills ( count : ĠInt ): ĠArrayList < Skill Level > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġret Ġ= ĠArrayList < Skill Level >( count ) ĊĠĠĠĠĠĠĠ Ġrepeat ( count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġskill Header Ġ= Ġiter . next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġskill Name Ġ= Ġskill Header . substring Before (" Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġskill Level Ġ= Ġskill Header . substring After (" Ġ"). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġskill Ġ= Ġskill Name To Id . compute If Absent ( skill Name ) Ġ{ ĠSkill ( skill Counter ++) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġret Ġ+= ĠSkill Level ( skill , Ġskill Level ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġret ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġcontributors Ġ= ĠArrayList < Contributor >( num Contribut ors ) ĊĠĠĠ Ġfor Ġ( contributor Id Ġin Ġ 0 Ġuntil Ġnum Contribut ors ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontributor Header Ġ= Ġiter . next () ĊĠĠĠĠĠĠĠ Ġval Ġcontributor Name Ġ= Ġcontributor Header . substring Before (" Ġ") ĊĠĠĠĠĠĠĠ Ġval Ġcontributor Skill Count Ġ= Ġcontributor Header . substring After (" Ġ"). toInt () ĊĠĠĠĠĠĠĠ Ġval Ġskills Ġ= Ġread Skills ( contributor Skill Count ) ĊĠĠĠĠĠĠĠ Ġcontributors Ġ+= ĠContributor ( Contributor Id ( contributor Id ), Ġcontributor Name , Ġskills ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġval Ġprojects Ġ= ĠArrayList < Project >( num Projects ) ĊĠĠĠ Ġfor Ġ( projectId Ġin Ġ 0 Ġuntil Ġnum Projects ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproject Header Ġ= Ġiter . next (). split (" Ġ") ĊĠĠĠĠĠĠĠ Ġval ĠprojectName Ġ= Ġproject Header [ 0 ] ĊĠĠĠĠĠĠĠ Ġval Ġproject Duration Ġ= Ġproject Header [ 1 ]. toInt () ĊĠĠĠĠĠĠĠ Ġval Ġproject Score Ġ= Ġproject Header [ 2 ]. toInt () ĊĠĠĠĠĠĠĠ Ġval Ġproject Best By Ġ= Ġproject Header [ 3 ]. toInt () ĊĠĠĠĠĠĠĠ Ġval Ġproject Num Roles Ġ= Ġproject Header [ 4 ]. toInt () ĊĊĠĠĠĠĠĠĠ Ġval Ġroles Ġ= Ġread Skills ( project Num Roles ) ĊĠĠĠĠĠĠĠ Ġprojects Ġ+= ĠProject ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= ĠProject Id ( projectId ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠprojectName , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġproject Duration , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbest Before Ġ= Ġproject Best By , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscore Ġ= Ġproject Score , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroles Ġ= Ġroles ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġreturn ĠInput ( ĊĠĠĠĠĠĠĠ Ġcontributors Ġ= Ġcontributors , ĊĠĠĠĠĠĠĠ Ġprojects Ġ= Ġprojects , ĊĠĠĠĠĠĠĠ Ġskills Ġ= Ġskill Aliases , ĊĠĠĠ Ġ) Ċ } ĊĊ