/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 6 Ġby ĠT odd ĠG ins berg Ċ Ġ*/ Ċ Ċ package Ġcom . gin s berg . ad vent 2 0 1 6 ĊĊ Ċ /** Ċ Ġ* ĠAd vent Ġof ĠCode Ġ- ĠDay Ġ 1 5 : ĠDecember Ġ 1 5 , Ġ 2 0 1 6 Ċ Ġ* Ċ Ġ* ĠFrom Ġhttp :// ad vent of code . com / 2 0 1 6 / day / 1 5 Ċ Ġ* Ċ Ġ*/ Ċ class ĠDay 1 5 ( input : ĠList < String >) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠDIS C _ REGEX Ġ= ĠRegex (""" Disc Ġ# (\ d +) Ġhas Ġ(\ d +) Ġpositions ; Ġat Ġtime = 0 , Ġit Ġis Ġat Ġposition Ġ(\ d + ). """) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġdis cs : ĠList < Disc > Ġ= Ġparse Input ( input ) ĊĊĠĠĠ Ġfun Ġsolve Part 1 (): ĠInt Ġ= Ġsolve () ĊĊĠĠĠ Ġfun Ġsolve Part 2 (): ĠInt Ġ= Ġsolve ( dis cs Ġ+ ĠDis c ( 1 1 , Ġ 0 , Ġdis cs . size + 1 )) ĊĊĠĠĠ Ġprivate Ġfun Ġsolve ( state : ĠList < Disc > Ġ= Ġdis cs ): ĠInt Ġ= ĊĠĠĠĠĠĠĠ Ġgenerate Sequence ( 0 , ĠInt :: inc ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġtime Ġ-> Ġstate . all Ġ{ Ġit . open At Drop Time ( time ) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. first () ĊĊĠĠĠ Ġdata Ġclass ĠDis c ( val Ġpositions : ĠInt , Ġval Ġstart : ĠInt , Ġval Ġdepth : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġopen At Drop Time ( time : ĠInt ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( time Ġ+ Ġdepth Ġ+ Ġstart ) Ġ% Ġpositions Ġ== Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Input ( input : ĠList < String >): ĠList < Disc > Ġ= ĊĠĠĠĠĠĠĠ Ġinput ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠDIS C _ REGEX . match Ent ire ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter NotNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . de structured Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠDis c ( it . component 2 (). toInt (), Ġit . component 3 (). toInt (), Ġit . component 1 (). toInt ()) } ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted By Ġ{ Ġit . depth Ġ} Ċ } Ċ