import Ġjava . io . File Ċ Ċ class ĠCity Plan ( inputFile : ĠString , Ġprivate Ġval ĠoutputFile : ĠString ) Ġ{ ĊĠĠĠ Ġprivate Ġval ĠD : ĠInt ĊĠĠĠ Ġprivate Ġval ĠI : ĠInt ĊĠĠĠ Ġprivate Ġval ĠS : ĠInt ĊĠĠĠ Ġprivate Ġval ĠV : ĠInt ĊĠĠĠ Ġprivate Ġval ĠF : ĠInt ĊĠĠĠ Ġprivate Ġval Ġst re ets : ĠMutable List < Street > ĊĠĠĠ Ġprivate Ġvar Ġcars : ĠMutable List < Car > ĊĠĠĠ Ġprivate Ġval Ġinter sections : ĠMutable List < Intersection > ĊĠĠĠ Ġprivate Ġval Ġschedule : ĠMutable List < Intersection Schedule > ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠParse Ġinput Ġdata ĊĠĠĠĠĠĠĠ Ġvar Ġindex Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġlines Ġ= ĠFile ( inputFile ). read Lines () ĊĠĠĠĠĠĠĠ Ġfun Ġparse Line As List (): ĠMutable List < String > Ġ= Ġlines [ index ++ ]. split (' Ġ'). to Mutable List () ĊĠĠĠĠĠĠĠ Ġval Ġfirst Line Ġ= Ġparse Line As List () ĊĠĠĠĠĠĠĠ ĠD Ġ= Ġfirst Line [ 0 ]. toInt () ĊĠĠĠĠĠĠĠ ĠI Ġ= Ġfirst Line [ 1 ]. toInt () ĊĠĠĠĠĠĠĠ ĠS Ġ= Ġfirst Line [ 2 ]. toInt () ĊĠĠĠĠĠĠĠ ĠV Ġ= Ġfirst Line [ 3 ]. toInt () ĊĠĠĠĠĠĠĠ ĠF Ġ= Ġfirst Line [ 4 ]. toInt () ĊĠĠĠĠĠĠĠ Ġprintln (" Duration : Ġ$ D Ġseconds ") ĊĠĠĠĠĠĠĠ Ġprintln (" Inter sections : Ġ$ I ") ĊĠĠĠĠĠĠĠ Ġprintln (" St re ets : Ġ$ S ") ĊĠĠĠĠĠĠĠ Ġprintln (" C ars : Ġ$ V ") ĊĠĠĠĠĠĠĠ Ġprintln (" Bonus Ġper Ġcar : Ġ$ F \ n ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠParse ĠSt re ets ĊĠĠĠĠĠĠĠ Ġst re ets Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠ Ġfor Ġ( s Ġin Ġ 0 Ġuntil ĠS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstreet Ġ= Ġparse Line As List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġst re ets . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStreet ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstreet [ 2 ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntersection ( street [ 0 ]. toInt ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntersection ( street [ 1 ]. toInt ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstreet [ 3 ]. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠParse ĠC ars ĊĠĠĠĠĠĠĠ Ġcars Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠ Ġfor Ġ( c Ġin Ġ 0 Ġuntil ĠV ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcar Ġ= Ġparse Line As List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcars . add ( Car ( c , Ġcar [ 0 ]. toInt (), Ġcar . sub List ( 1 , Ġcar [ 0 ]. toInt () Ġ+ Ġ 1 ))) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠDefine ĠInter sections Ġwith Ġtheir Ġincoming Ġand Ġoutgoing Ġst re ets ĊĠĠĠĠĠĠĠ Ġinter sections Ġ= Ġget Inter sections () ĊĊĠĠĠĠĠĠĠ Ġ// ĠInit ĠSchedule ĊĠĠĠĠĠĠĠ Ġschedule Ġ= Ġmutable ListOf () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Inter sections (): ĠMutable List < Intersection > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinter sections Ġ= Ġmutable ListOf < Intersection >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil ĠI ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinter Ġ= ĠIntersection ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinter . incoming Ġ= Ġget Incoming St re ets ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinter . outgoing Ġ= Ġget Outgoing St re ets ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinter sections . add ( inter ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġinter sections ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Incoming St re ets ( i : ĠInt ): ĠList < Street > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġst re ets . filter Ġ{ Ġit . end . id Ġ== Ġi Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Outgoing St re ets ( i : ĠInt ): ĠList < Street > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġst re ets . filter Ġ{ Ġit . start . id Ġ== Ġi Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcompute Travel Times () Ġ{ ĊĠĠĠĠĠĠĠ Ġcars . map Ġ{ Ġcar Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcar . travel Time Ġ= Ġcar . path . sub List ( 1 , Ġcar . path . size ). sum By Ġ{ Ġstreet Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġst re ets . find Ġ{ Ġit . name Ġ== Ġstreet Ġ} !!. time ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// println (" Car Ġ${ car . id } Ġtravel Ġtime Ġ= Ġ${ car . travel Time }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠOptimization : Ġcompletely Ġignore Ġcars Ġthat Ġwill Ġnever Ġmake Ġit Ġin Ġtime ĊĠĠĠĠĠĠĠ Ġcars Ġ= Ġcars . filter Ġ{ Ġit . travel Time Ġ<= ĠD Ġ}. to Mutable List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget St re ets Load () Ġ{ ĊĠĠĠĠĠĠĠ Ġst re ets . forEach Ġ{ Ġstreet Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstreet . load Ġ= Ġcars . count Ġ{ Ġstreet . name Ġin Ġit . path Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstreet . average Load Ġ= Ġcars . count Ġ{ Ġstreet . name Ġin Ġit . path Ġ} Ġ/ ĠD ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġinter sections . forEach Ġ{ Ġintersection Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintersection . load Ġ= Ġintersection . incoming . sum Of Ġ{ Ġit . load Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġschedule ( index : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġiteration Ġ= ĠlistOf ( D , ĠD Ġ/ Ġ 2 0 , ĠD Ġ/ Ġ 2 2 , Ġ 1 , ĠD Ġ/ Ġ 5 0 , ĠD Ġ/ Ġ 5 0 ) ĊĠĠĠĠĠĠĠ Ġcompute Travel Times () ĊĠĠĠĠĠĠĠ Ġget St re ets Load () ĊĠĠĠĠĠĠĠ Ġinter sections . forEach Ġ{ Ġintersection Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġincoming St re ets Sorted By Load Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintersection . incoming . filter Ġ{ Ġit . load Ġ> Ġ 0 Ġ}. sorted By Ġ{ Ġstreet Ġ-> Ġstreet . load Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtraffic Light Schedules Ġ= Ġmutable ListOf < Traffic Light Schedule >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġincoming St re ets Sorted By Load . forEach Ġ{ Ġstreet Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtraffic Light Schedule Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTraffic Light Schedule ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstreet . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( iteration [ index ] Ġ/ Ġincoming St re ets Sorted By Load . size Ġ/ Ġintersection . load Ġ* Ġstreet . load ). coerce At Least ( 1 ). coerce At Most ( D ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( traffic Light Schedule . time Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtraffic Light Schedules . add ( traffic Light Schedule ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// println (" Street Ġ${ street . name } Ġload : Ġ${ street . load } Ġseconds : Ġ${ ( cycle / Ġintersection . load Ġ* Ġstreet . load )} ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintersection Schedule Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntersection Schedule ( intersection . id , Ġincoming St re ets Sorted By Load . size , Ġtraffic Light Schedules ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( intersection Schedule . traffic Light Schedules . isNotEmpty () Ġ&& Ġintersection Schedule . not Everything Is Red ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġschedule . add ( intersection Schedule ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠIntersection Schedule . not Everything Is Red (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . traffic Light Schedules . sum Of Ġ{ Ġit . time Ġ} Ġ!= Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġoutput () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( outputFile ) ĊĠĠĠĠĠĠĠ Ġfile . print Writer (). use Ġ{ Ġout Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . println ( schedule . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġschedule . forEach Ġ{ Ġintersection Schedule Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . println ( intersection Schedule . id . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . println ( intersection Schedule . incoming . toString ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintersection Schedule . traffic Light Schedules . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . print ( it . street Ġ+ Ġ" Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . println ( it . time . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprintln (" Schedule Ġfor Ġdataset Ġ$ outputFile Ġdone ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġmain () Ġ{ ĊĠĠĠ Ġval Ġdatasets Ġ= ĠlistOf (" a ", Ġ" b ", Ġ" c ", Ġ" d ", Ġ" e ", Ġ" f ") ĊĠĠĠ Ġdatasets . forEach Ġ{ Ġds Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġ" data /$ ds . txt " ĊĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġ" data / out _$ ds . txt " ĊĊĠĠĠĠĠĠĠ Ġ// ĠSchedule Ġtraffic Ġlights Ġfor Ġthe Ġcity Ġand Ġoutput Ġthe Ġschedule ĊĠĠĠĠĠĠĠ ĠCity Plan ( input , Ġoutput ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . schedule ( datasets . indexOf ( ds )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . output () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }