import Ġjava . io . File Ċ Ċ // Ġtag :: aller gen _ 2 [] Ċ fun Ġall er gen _ 2 (): ĠString Ġ{ ĊĊ ĉ // Ġtag :: read _ pu zzle [] ĉĊ ĉ var Ġfood _ ingredients Ġ= Ġmutable Map Of < Int , ĠList < String >>() Ċ ĉ var Ġfood _ all erg ens Ġ= Ġmutable Map Of < Int , ĠList < String >>() Ċ ĉ var Ġall er gen _ list Ġ= Ġmutable Map Of < String , ĠString >() Ċ ĉ var Ġfood : ĠInt Ġ= Ġ 0 ĊĊ ĉ File (" day 2 0 2 1 _ pu zzle _ input . txt "). forEach Line Ġ{ Ċĉ ĉ var Ġinstruction Ġ= Ġit . replace (",", Ġ""). replace (" )", Ġ""). split (" Ġ( contains Ġ") Ċĉ ĉ food _ ingredients . put ( food , Ġinstruction [ 0 ]. split (" Ġ")) Ċĉ ĉ food _ all erg ens . put ( food , Ġinstruction [ 1 ]. split (" Ġ")) Ċĉ ĉ instruction [ 1 ]. split (" Ġ"). forEach Ġ{ Ċĉĉ ĉ aller gen _ list . put ( it , Ġ"- ") Ċĉ ĉ } Ċĉ ĉ food ++ Ċ ĉ } Ċ ĉ // Ġend :: read _ pu zzle [] ĊĊ ĉ // Ġtag :: search [] Ċ ĉ var Ġi : ĠInt Ċ ĉ var Ġtemp _ list 1 Ġ= Ġmutable ListOf < String >() Ċ ĉ var Ġtemp _ list 2 Ġ= Ġmutable ListOf < String >() Ċ ĉ var Ġnew _ list : ĠString Ġ= Ġ"" ĊĊ ĉ for Ġ( m Ġin Ġ 0 .. 5 ) Ġ{ Ċĉ ĉ aller gen _ list . forEach Ġ{ Ċĉĉ ĉ if Ġ( it . value . equals ("- ")) Ġ{ Ċĉĉĉ ĉ var Ġall er gen Ġ= Ġit . key Ċĉĉĉ ĉ i Ġ= Ġ 0 Ċĉĉĉ ĉ while Ġ(! food _ all erg ens . getValue ( i ). contains ( aller gen )) Ġ{ Ċĉĉĉĉ ĉ i ++ Ċĉĉĉ ĉ } Ċĉĉĉ ĉ temp _ list 1 . clear () Ċĉĉĉ ĉ temp _ list 1 . addAll ( food _ ingredients . getValue ( i )) Ċĉĉĉ ĉ for Ġ( j Ġin Ġi Ġ+ Ġ 1 .. food Ġ- Ġ 1 ) Ġ{ Ċĉĉĉĉ ĉ temp _ list 2 . clear () Ċĉĉĉĉ ĉ temp _ list 2 . addAll ( food _ ingredients . getValue ( j )) Ċĉĉĉĉ ĉ if Ġ( food _ all erg ens . getValue ( j ). contains ( aller gen )) Ġ{ Ċĉĉĉĉĉ ĉ temp _ list 1 . retain All ( temp _ list 2 ) Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉĉ ĉ if Ġ( temp _ list 1 . size Ġ== Ġ 1 ) Ġ{ Ċĉĉĉĉ ĉ aller gen _ list . put ( aller gen , Ġtemp _ list 1 [ 0 ]) Ċĉĉĉĉ ĉ food _ ingredients . forEach Ġ{ Ċĉĉĉĉĉ ĉ for Ġ( k Ġin Ġ 0 .. it . value . size Ġ- Ġ 1 ) Ġ{ Ċĉĉĉĉĉĉ ĉ if Ġ( it . value [ k ] Ġ!= Ġtemp _ list 1 [ 0 ]) Ġ{ Ċĉĉĉĉĉĉĉ ĉ new _ list Ġ= Ġnew _ list Ġ+ Ġit . value [ k ] Ġ+ Ġ" Ġ" Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ food _ ingredients . put ( it . key , Ġnew _ list . drop Last ( 1 ). split (" Ġ")) Ċĉĉĉĉĉ ĉ new _ list Ġ= Ġ"" Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ġ// Ġend Ġif Ċĉ ĉ } Ċ ĉ } Ċ ĉ // Ġend :: search [] ĉ ĊĊ ĉ // Ġtag :: order _ result [] Ċ ĉ var Ġresult : ĠString Ġ= Ġ"" Ċ ĉ val Ġsorted Ġ= Ġall er gen _ list . to Sorted Map () Ċ ĉ sorted . forEach Ġ{ Ċĉ ĉ result Ġ= Ġresult Ġ+ Ġit . value Ġ+ Ġ"," ĊĠĠĠ Ġ} ĊĠĠĠ Ġresult Ġ= Ġresult . drop Last ( 1 ) Ċ ĉ // Ġend :: order _ result [] ĊĊ ĉ return Ġresult Ċ } Ċ // Ġend :: aller gen _ 2 [] Ċ Ċ // Ġtag :: aller gen [] Ċ fun Ġall er gen (): ĠInt Ġ{ ĊĊ ĉ // Ġtag :: read _ pu zzle [] ĉĊ ĉ var Ġfood _ ingredients Ġ= Ġmutable Map Of < Int , ĠList < String >>() Ċ ĉ var Ġfood _ all erg ens Ġ= Ġmutable Map Of < Int , ĠList < String >>() Ċ ĉ var Ġall er gen _ list Ġ= Ġmutable Map Of < String , ĠString >() Ċ ĉ var Ġfood : ĠInt Ġ= Ġ 0 ĊĊ ĉ File (" day 2 0 2 1 _ pu zzle _ input . txt "). forEach Line Ġ{ Ċĉ ĉ var Ġinstruction Ġ= Ġit . replace (",", Ġ""). replace (" )", Ġ""). split (" Ġ( contains Ġ") Ċĉ ĉ food _ ingredients . put ( food , Ġinstruction [ 0 ]. split (" Ġ")) Ċĉ ĉ food _ all erg ens . put ( food , Ġinstruction [ 1 ]. split (" Ġ")) Ċĉ ĉ instruction [ 1 ]. split (" Ġ"). forEach Ġ{ Ċĉĉ ĉ aller gen _ list . put ( it , Ġ"- ") Ċĉ ĉ } Ċĉ ĉ food ++ Ċ ĉ } Ċ ĉ // Ġend :: read _ pu zzle [] ĊĊ ĉ // Ġtag :: search [] Ċ ĉ var Ġi : ĠInt Ċ ĉ var Ġtemp _ list 1 Ġ= Ġmutable ListOf < String >() Ċ ĉ var Ġtemp _ list 2 Ġ= Ġmutable ListOf < String >() Ċ ĉ var Ġnew _ list : ĠString Ġ= Ġ"" ĊĊ ĉ for Ġ( m Ġin Ġ 0 .. 5 ) Ġ{ ĠĠ Ġ// Ġbetter Ġto Ġreplace Ġwith Ġwhile Ġloop Ġand Ġa Ġproper Ġexit condition Ċĉ ĉ aller gen _ list . forEach Ġ{ Ċĉĉ ĉ if Ġ( it . value . equals ("- ")) Ġ{ Ċĉĉĉ ĉ var Ġall er gen Ġ= Ġit . key Ċĉĉĉ ĉ i Ġ= Ġ 0 Ċĉĉĉ ĉ while Ġ(! food _ all erg ens . getValue ( i ). contains ( aller gen )) Ġ{ Ċĉĉĉĉ ĉ i ++ Ċĉĉĉ ĉ } Ċĉĉĉ ĉ temp _ list 1 . clear () Ċĉĉĉ ĉ temp _ list 1 . addAll ( food _ ingredients . getValue ( i )) Ċĉĉĉ ĉ for Ġ( j Ġin Ġi Ġ+ Ġ 1 .. food Ġ- Ġ 1 ) Ġ{ Ċĉĉĉĉ ĉ temp _ list 2 . clear () Ċĉĉĉĉ ĉ temp _ list 2 . addAll ( food _ ingredients . getValue ( j )) Ċĉĉĉĉ ĉ if Ġ( food _ all erg ens . getValue ( j ). contains ( aller gen )) Ġ{ Ċĉĉĉĉĉ ĉ temp _ list 1 . retain All ( temp _ list 2 ) Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉĉ ĉ if Ġ( temp _ list 1 . size Ġ== Ġ 1 ) Ġ{ Ċĉĉĉĉ ĉ aller gen _ list . put ( aller gen , Ġtemp _ list 1 [ 0 ]) Ċĉĉĉĉ ĉ food _ ingredients . forEach Ġ{ Ċĉĉĉĉĉ ĉ for Ġ( k Ġin Ġ 0 .. it . value . size Ġ- Ġ 1 ) Ġ{ Ċĉĉĉĉĉĉ ĉ if Ġ( it . value [ k ] Ġ!= Ġtemp _ list 1 [ 0 ]) Ġ{ Ċĉĉĉĉĉĉĉ ĉ new _ list Ġ= Ġnew _ list Ġ+ Ġit . value [ k ] Ġ+ Ġ" Ġ" Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ food _ ingredients . put ( it . key , Ġnew _ list . drop Last ( 1 ). split (" Ġ")) Ċĉĉĉĉĉ ĉ new _ list Ġ= Ġ"" Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } Ċ ĉ // Ġend :: search [] ĉ ĊĊ ĉ // Ġtag :: count _ result [] Ċ ĉ var Ġresult : ĠInt Ġ= Ġ 0 Ċ ĉ food _ ingredients . forEach Ġ{ Ċĉ ĉ result Ġ= Ġresult Ġ+ Ġit . value . size Ċ ĉ } Ċ ĉ // Ġend :: count _ result [] ĊĊ ĉ return Ġresult Ċ } Ċ // Ġend :: aller gen [] Ċ Ċ // fun Ġmain ( args : ĠArray < String >) Ġ{ Ċ Ċ // Ġtag :: part _ 1 [] Ċ ĉ var Ġt 1 Ġ= ĠSystem . currentTimeMillis () Ċ ĉ var Ġsolution 1 Ġ= Ġall er gen () Ċ ĉ t 1 Ġ= ĠSystem . currentTimeMillis () Ġ- Ġt 1 Ċ ĉ println () Ċ ĉ println (" part Ġ 1 Ġsolved Ġin Ġ$ t 1 Ġms Ġ-> Ġ$ solution 1 ") Ċ // Ġend :: part _ 1 [] Ċ Ċ // Ġtag :: part _ 2 [] Ċ ĉ var Ġt 2 Ġ= ĠSystem . currentTimeMillis () Ċ ĉ var Ġsolution 2 Ġ= Ġall er gen _ 2 () Ċ ĉ t 2 Ġ= ĠSystem . currentTimeMillis () Ġ- Ġt 2 Ċ ĉ println () Ċ ĉ println (" part Ġ 2 Ġsolved Ġin Ġ$ t 2 Ġms Ġ-> Ġ$ solution 2 ") Ċ // Ġend :: part _ 2 [] Ċ Ċ // Ġtag :: output [] Ċ // Ġprint Ġsolution Ġfor Ġpart Ġ 1 Ċ ĉ println (" ******************************** *** ") Ċ ĉ println (" --- ĠDay Ġ 2 1 : ĠAll er gen ĠAssessment Ġ--- ") Ċ ĉ println (" ******************************** *** ") Ċ ĉ println (" Solution Ġfor Ġpart 1 ") Ċ ĉ println (" ĠĠ Ġ$ solution 1 Ġtimes Ġdo Ġany Ġof Ġthose Ġingredients Ġappear ") Ċ ĉ println () Ċ // Ġprint Ġsolution Ġfor Ġpart Ġ 2 Ċ ĉ println (" ************************ **** ") Ċ ĉ println (" Solution Ġfor Ġpart 2 ") Ċ ĉ println (" ĠĠ Ġ$ solution 2 Ġis Ġyour Ġcanonical Ġdangerous Ġingredient Ġlist ") Ċ ĉ println () Ċ // Ġend :: output [] Ċ //} ĉ