package Ġstudio . paper cube . ip probe Ċ Ċ import Ġjava . util .* Ċ Ċ class ĠIp 4 Address ( address : ĠInt Array ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠParses Ġeither Ġfull Ġip Ġor Ġpartial Ġip . ĊĠĠĠĠĠĠĠĠ Ġ* ĠPartial Ġip Ġrefers Ġto Ġthose Ġwhose Ġseveral Ġparts Ġin Ġthe Ġend Ġare Ġomitted . ĊĠĠĠĠĠĠĠĠ Ġ* ĠThis Ġmethod Ġwill Ġreturn Ġthe Ġsmallest Ġpossible Ġip . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠFor Ġexample , Ġit Ġwill Ġreturn Ġ 1 7 2 . 2 8 . 7 1 . 0 Ġwith Ġan Ġinput Ġvalue Ġ 1 7 2 . 2 8 . 7 1 ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġip Ġan Ġip Ġaddress Ġrepresented Ġin Ġstring ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġan Ġ[ Ip 4 Address ] Ġcorresponding Ġto Ġinput ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġparse Min ( ip : ĠString ): ĠIp 4 Address Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparts Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip . split ('. '). to IntArray () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNumber FormatException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ("$ ip Ġis Ġnot Ġa Ġvalid Ġip ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġparts . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIp 4 Address ( parts ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠList < String >. to IntArray (): ĠInt Array Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠInt Array ( size ) Ġ{ Ġi Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ i ]. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠParses Ġeither Ġfull Ġip Ġor Ġpartial Ġip . ĊĠĠĠĠĠĠĠĠ Ġ* ĠPartial Ġip Ġrefers Ġto Ġthose Ġwhose Ġseveral Ġparts Ġin Ġthe Ġend Ġare Ġomitted . ĊĠĠĠĠĠĠĠĠ Ġ* ĠThis Ġmethod Ġwill Ġreturn Ġthe Ġlargest Ġpossible Ġip . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠFor Ġexample , Ġit Ġwill Ġreturn Ġ 1 7 2 . 2 8 . 7 1 . 0 Ġwith Ġan Ġinput Ġvalue Ġ 1 7 2 . 2 8 . 7 1 ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġip Ġan Ġip Ġaddress Ġrepresented Ġin Ġstring ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġan Ġ[ Ip 4 Address ] Ġcorresponding Ġto Ġinput ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġparse Max ( ip : ĠString ): ĠIp 4 Address Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparts Ġ= Ġip . split ('. '). to IntArray () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġparts . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaddress Array Ġ= ĠInt Array ( 4 ) Ġ{ Ġi Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ>= Ġsize ) Ġ 2 5 5 Ġelse Ġparts [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIp 4 Address ( address Array ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġaddress Ġ= ĠInt Array ( 4 ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . address [ i ] Ġ= Ġaddress . get OrNull ( i ) Ġ?: Ġbreak ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( p 1 : ĠInt , Ġp 2 : ĠInt , Ġp 3 : ĠInt , Ġp 4 : ĠInt ) Ġ: Ġthis ( int ArrayOf ( p 1 , Ġp 2 , Ġp 3 , Ġp 4 )) ĊĊĠĠĠ Ġoperator Ġfun Ġplus ( inc : ĠInt ): ĠIp 4 Address Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Address Ġ= ĠIp 4 Address ( address ) ĊĠĠĠĠĠĠĠ Ġvar Ġincrement Ġ= Ġinc ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 3 Ġdown To Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġaddress [ i ] Ġ+ Ġincrement ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Address . address [ i ] Ġ= Ġvalue Ġ% Ġ 2 5 6 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġincrement Ġ= Ġvalue Ġ/ Ġ 2 5 6 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( increment Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( increment Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIp 4 Address ( 0 , Ġ 0 , Ġ 0 , Ġ 0 ) Ġ+ Ġ( increment Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnew Address ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġcompare To ( another : ĠIp 4 Address ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠInteger . compare ( toInt (), Ġanother . toInt ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġto Int (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( address [ 0 ] Ġand Ġ 0 xFF Ġshl Ġ 2 4 ) Ġor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( address [ 1 ] Ġand Ġ 0 xFF Ġshl Ġ 1 6 ) Ġor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( address [ 2 ] Ġand Ġ 0 xFF Ġshl Ġ 8 ) Ġor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( address [ 3 ] Ġand Ġ 0 xFF ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġaddress . join ToString ( separator Ġ= Ġ". ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( other Ġis ĠIp 4 Address ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArrays . equals ( address , Ġother . address ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠArrays . hashCode ( address ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġrange To ( end : ĠIp 4 Address ): ĠIp 4 Address Range Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠIp 4 Address Range ( this , Ġend ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġget ( index : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . address [ index ] ĊĠĠĠ Ġ} Ċ }