package Ġday 2 0 Ċ Ċ import Ġparse Input Ċ import Ġsplit To Lines Ċ import Ġjava . util . stream . Long Stream Ċ Ċ /** Ċ --- ĠDay Ġ 2 0 : ĠFire wall ĠRules Ġ--- Ċ Ċ You 'd Ġlike Ġto Ġset Ġup Ġa Ġsmall Ġhidden Ġcomputer Ġhere Ġso Ġyou Ġcan Ġuse Ġit Ġto Ġget Ġback Ġinto Ġthe Ġnetwork Ġlater . ĠHowever , Ġthe Ġcorpor ate Ġfirewall Ġonly Ġallows Ġcommunication Ġwith Ġcertain Ġexternal ĠIP Ġaddresses . Ċ Ċ You 've Ġretrieved Ġthe Ġlist Ġof Ġblocked ĠIP s Ġfrom Ġthe Ġfirewall , Ġbut Ġthe Ġlist Ġseems Ġto Ġbe Ġmess y Ġand Ġpoor ly Ġmaintained , Ġand Ġit 's Ġnot Ġclear Ġwhich ĠIP s Ġare Ġallowed . ĠAlso , Ġrather Ġthan Ġbeing Ġwritten Ġin Ġdot - decimal Ġnotation , Ġthey Ġare Ġwritten Ġas Ġplain Ġ 3 2 - bit Ġintegers , Ġwhich Ġcan Ġhave Ġany Ġvalue Ġfrom Ġ 0 Ġthrough Ġ 4 2 9 4 9 6 7 2 9 5 , Ġinclusive . Ċ Ċ For Ġexample , Ġsuppose Ġonly Ġthe Ġvalues Ġ 0 Ġthrough Ġ 9 Ġwere Ġvalid , Ġand Ġthat Ġyou Ġretrieved Ġthe Ġfollowing Ġblacklist : ĊĊ 5 - 8 Ċ 0 - 2 Ċ 4 - 7 Ċ The Ġblacklist Ġspecifies Ġranges Ġof ĠIP s Ġ( inclusive Ġof Ġboth Ġthe Ġstart Ġand Ġend Ġvalue ) Ġthat Ġare Ġnot Ġallowed . ĠThen , Ġthe Ġonly ĠIP s Ġthat Ġthis Ġfirewall Ġallows Ġare Ġ 3 Ġand Ġ 9 , Ġsince Ġthose Ġare Ġthe Ġonly Ġnumbers Ġnot Ġin Ġany Ġrange . Ċ Ċ Given Ġthe Ġlist Ġof Ġblocked ĠIP s Ġyou Ġretrieved Ġfrom Ġthe Ġfirewall Ġ( your Ġpuzzle Ġinput ), Ġwhat Ġis Ġthe Ġlowest - valu ed ĠIP Ġthat Ġis Ġnot Ġblocked ? Ċ Ċ --- ĠPart ĠTwo Ġ--- Ċ Ċ How Ġmany ĠIP s Ġare Ġallowed Ġby Ġthe Ġblacklist ? ĊĊ Ġ*/ Ċ Ċ fun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠĠĠ Ġval Ġtest Ġ= Ġ""" 5 - 8 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| 0 - 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| 4 - 7 """. trim Margin () ĊĠĠĠ Ġval Ġinput Ġ= Ġparse Input (" day 2 0 - input . txt ") ĊĊĠĠĠ Ġprintln ( find Low est IP ( test ) Ġ== Ġ 3 L ) ĊĠĠĠ Ġprintln ( count Wh itelisted ( test )) ĊĠĠĠ Ġprintln ( find Low est IP ( input )) ĊĠĠĠ Ġprintln ( count Wh itelisted ( input )) Ċ } Ċ Ċ fun Ġfind Low est IP ( input : ĠString ): ĠLong ? Ġ{ ĊĠĠĠ Ġval Ġranges Ġ= Ġparse Ranges ( input ) ĊĊĠĠĠ Ġreturn Ġ( 0 .. 4 2 9 4 9 6 7 2 9 5 ). first Ġ{ Ġnumber Ġ-> Ġranges . none Ġ{ Ġrange Ġ-> Ġrange . contains ( number ) Ġ} Ġ} Ċ } Ċ Ċ fun Ġcount Wh itelisted ( input : ĠString ): ĠLong Ġ{ ĊĠĠĠ Ġval Ġranges Ġ= Ġparse Ranges ( input ) ĊĊĠĠĠ Ġ// ĠFor Ġspeed up ĊĠĠĠ Ġreturn ĠLong Stream . range Closed ( 0 , Ġ 4 2 9 4 9 6 7 2 9 5 L ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. parallel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġnumber Ġ-> Ġranges . none Ġ{ Ġrange Ġ-> Ġrange . contains ( number ) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. count () Ċ } Ċ Ċ private Ġfun Ġparse Ranges ( input : ĠString ) Ġ= Ġinput . split To Lines () ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( min , Ġmax ) Ġ= Ġit . split ("- ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmin . to Long () .. max . to Long () ĊĠĠĠĠĠĠĠ Ġ} Ċ