import Ġjava . io . File Ċ Ċ val Ġall er gen Start Ġ=" ( contains Ġ" Ċ Ċ fun Ġmain ( args Ġ: ĠArray < String >) Ġ{ ĊĠ Ġval Ġinput Ġ= ĠFile ( args . first ()). read Lines () ĊĠ Ġprintln (" Solution Ġ 1 : Ġ${ solution 1 ( input )} ") ĊĠ Ġprintln (" Solution Ġ 2 : Ġ${ solution 2 ( input )} ") Ċ } Ċ Ċ private Ġfun Ġsolution 1 ( input Ġ: List < String >) Ġ: Int Ġ{ ĊĠ Ġvar Ġall er gen To Candidates Ġ= Ġmutable Map Of < String , ĠMutable Set < String >>() ĊĠ Ġvar Ġingredients Lists Ġ= Ġmutable ListOf < List < String >>() ĊĊĠ Ġfor Ġ( line Ġin Ġinput ) Ġ{ ĊĠĠĠ Ġif Ġ( line . contains ( aller gen Start )) Ġ{ ĊĠĠĠĠĠ Ġval Ġall erg ens Ġ= Ġline . substring ( line . indexOf ( aller gen Start ) Ġ+ Ġall er gen Start . length , Ġline . lastIndexOf (" ) ")). split (", Ġ") ĊĠĠĠĠĠ Ġfor Ġ( aller gen Ġin Ġall erg ens ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġingredients Ġ= Ġline . substring ( 0 , Ġline . indexOf ( aller gen Start ) Ġ- Ġ 1 ). split (" Ġ"). toSet () ĊĠĠĠĠĠĠĠ Ġif Ġ( aller gen To Candidates . contains ( aller gen )) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġvar Ġexisting Ing redients Ġ= Ġall er gen To Candidates . get ( aller gen ) !! ĊĠĠĠĠĠĠĠĠĠ Ġall er gen To Candidates . put ( aller gen , Ġexisting Ing redients . intersect ( ingredients ). to Mutable Set ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġall er gen To Candidates . put ( aller gen , Ġingredients . to Mutable Set ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġingredients Lists . add ( line . substring ( 0 , Ġline . indexOf ( aller gen Start ) Ġ- Ġ 1 ). split (" Ġ")) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġingredients Lists . add ( line . split (" Ġ")) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġvar Ġkeep Filtering Ġ= Ġtrue ĊĠ Ġwhile Ġ( keep Filtering ) Ġ Ġ{ ĊĠĠĠ Ġfor Ġ(( k , Ġv ) Ġin Ġall er gen To Candidates ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( v . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġknown Ġ= Ġv . first () ĊĠĠĠĠĠĠĠ Ġfor Ġ(( _, Ġv 2 ) Ġin Ġall er gen To Candidates . minus ( k )) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( v 2 . contains ( known )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv 2 . remove ( known ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfor Ġ( v Ġin Ġall er gen To Candidates . values ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( v . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġkeep Filtering Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġreturn Ġingredients Lists . map { Ġit . minus ( aller gen To Candidates . values . filter { Ġ! it . isEmpty () Ġ}. map { Ġit . first () Ġ} Ġ) }. flatten (). size Ċ } Ċ Ċ private Ġfun Ġsolution 2 ( input Ġ: List < String >) Ġ: String Ġ{ ĊĠ Ġvar Ġall er gen To Candidates Ġ= Ġmutable Map Of < String , ĠMutable Set < String >>() ĊĊĠ Ġfor Ġ( line Ġin Ġinput ) Ġ{ ĊĠĠĠ Ġif Ġ( line . contains ( aller gen Start )) Ġ{ ĊĠĠĠĠĠ Ġval Ġall erg ens Ġ= Ġline . substring ( line . indexOf ( aller gen Start ) Ġ+ Ġall er gen Start . length , Ġline . lastIndexOf (" ) ")). split (", Ġ") ĊĠĠĠĠĠ Ġfor Ġ( aller gen Ġin Ġall erg ens ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġingredients Ġ= Ġline . substring ( 0 , Ġline . indexOf ( aller gen Start ) Ġ- Ġ 1 ). split (" Ġ"). toSet () ĊĠĠĠĠĠĠĠ Ġif Ġ( aller gen To Candidates . contains ( aller gen )) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġvar Ġexisting Ing redients Ġ= Ġall er gen To Candidates . get ( aller gen ) !! ĊĠĠĠĠĠĠĠĠĠ Ġall er gen To Candidates . put ( aller gen , Ġexisting Ing redients . intersect ( ingredients ). to Mutable Set ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġall er gen To Candidates . put ( aller gen , Ġingredients . to Mutable Set ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġvar Ġkeep Filtering Ġ= Ġtrue ĊĠ Ġwhile Ġ( keep Filtering ) Ġ Ġ{ ĊĠĠĠ Ġfor Ġ(( k , Ġv ) Ġin Ġall er gen To Candidates ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( v . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġknown Ġ= Ġv . first () ĊĠĠĠĠĠĠĠ Ġfor Ġ(( _, Ġv 2 ) Ġin Ġall er gen To Candidates . minus ( k )) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( v 2 . contains ( known )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv 2 . remove ( known ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfor Ġ( v Ġin Ġall er gen To Candidates . values ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( v . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġkeep Filtering Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġvar Ġsorted Ġ= Ġall er gen To Candidates . keys . sorted By Ġ{ Ġit Ġ} ĊĠ Ġvar Ġdangerous Ġ= Ġmutable ListOf < String >() ĊĠ Ġfor Ġ( k Ġin Ġsorted ) Ġ{ ĊĠĠĠ Ġdangerous . add ( aller gen To Candidates . get ( k ) !!. first ()) ĊĠ Ġ} ĊĊĠ Ġreturn Ġdangerous . join ToString ( separator Ġ= Ġ", ") Ċ }