package Ġcom . github . cor ne il . a oc 2 0 1 9 . day 1 2 Ċ Ċ import Ġassert k . assertThat Ċ import Ġassert k . assertions . isEqualTo Ċ import Ġorg . junit . Test Ċ Ċ class ĠTest N Body Problem Ġ{ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` test 1 `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ< x =- 1 , Ġy = 0 , Ġz = 2 > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ< x = 2 , Ġy =- 1 0 , Ġz =- 7 > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ< x = 4 , Ġy =- 8 , Ġz = 8 > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ< x = 3 , Ġy = 5 , Ġz =- 1 > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġval Ġor bits Ġ= Ġread Or bits ( input . split ('\ n ')) ĊĠĠĠĠĠĠĠ Ġval Ġstep 0 Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpos =< x =- 1 , Ġy = ĠĠ 0 , Ġz = Ġ 2 >, Ġvel =< x = Ġ 0 , Ġy = Ġ 0 , Ġz = Ġ 0 > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpos =< x = Ġ 2 , Ġy =- 1 0 , Ġz =- 7 >, Ġvel =< x = Ġ 0 , Ġy = Ġ 0 , Ġz = Ġ 0 > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpos =< x = Ġ 4 , Ġy = Ġ- 8 , Ġz = Ġ 8 >, Ġvel =< x = Ġ 0 , Ġy = Ġ 0 , Ġz = Ġ 0 > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpos =< x = Ġ 3 , Ġy = ĠĠ 5 , Ġz =- 1 >, Ġvel =< x = Ġ 0 , Ġy = Ġ 0 , Ġz = Ġ 0 > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġassert Position And Velocity ( or bits , Ġstep 0 . split ('\ n '). map Ġ{ Ġread Position ( it ) Ġ}) ĊĊĠĠĠĠĠĠĠ Ġor bits . advance Orbit () ĊĠĠĠĠĠĠĠ Ġval Ġstep 1 Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpos =< x = Ġ 2 , Ġy =- 1 , Ġz = Ġ 1 >, Ġvel =< x = Ġ 3 , Ġy =- 1 , Ġz =- 1 > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpos =< x = Ġ 3 , Ġy =- 7 , Ġz =- 4 >, Ġvel =< x = Ġ 1 , Ġy = Ġ 3 , Ġz = Ġ 3 > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpos =< x = Ġ 1 , Ġy =- 7 , Ġz = Ġ 5 >, Ġvel =< x =- 3 , Ġy = Ġ 1 , Ġz =- 3 > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpos =< x = Ġ 2 , Ġy = Ġ 2 , Ġz = Ġ 0 >, Ġvel =< x =- 1 , Ġy =- 3 , Ġz = Ġ 1 > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġassert Position And Velocity ( or bits , Ġstep 1 . split ('\ n '). map Ġ{ Ġread Position ( it ) Ġ}) ĊĊĠĠĠĠĠĠĠ Ġor bits . advance Orbit () ĊĠĠĠĠĠĠĠ Ġval Ġstep 2 Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpos =< x = Ġ 5 , Ġy =- 3 , Ġz =- 1 >, Ġvel =< x = Ġ 3 , Ġy =- 2 , Ġz =- 2 > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpos =< x = Ġ 1 , Ġy =- 2 , Ġz = Ġ 2 >, Ġvel =< x =- 2 , Ġy = Ġ 5 , Ġz = Ġ 6 > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpos =< x = Ġ 1 , Ġy =- 4 , Ġz =- 1 >, Ġvel =< x = Ġ 0 , Ġy = Ġ 3 , Ġz =- 6 > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpos =< x = Ġ 1 , Ġy =- 4 , Ġz = Ġ 2 >, Ġvel =< x =- 1 , Ġy =- 6 , Ġz = Ġ 2 > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġassert Position And Velocity ( or bits , Ġstep 2 . split ('\ n '). map Ġ{ Ġread Position ( it ) Ġ}) ĊĊĠĠĠĠĠĠĠ Ġor bits . advance Orbit () ĊĠĠĠĠĠĠĠ Ġval Ġstep 3 Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpos =< x = Ġ 5 , Ġy =- 6 , Ġz =- 1 >, Ġvel =< x = Ġ 0 , Ġy =- 3 , Ġz = Ġ 0 > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpos =< x = Ġ 0 , Ġy = Ġ 0 , Ġz = Ġ 6 >, Ġvel =< x =- 1 , Ġy = Ġ 2 , Ġz = Ġ 4 > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpos =< x = Ġ 2 , Ġy = Ġ 1 , Ġz =- 5 >, Ġvel =< x = Ġ 1 , Ġy = Ġ 5 , Ġz =- 4 > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpos =< x = Ġ 1 , Ġy =- 8 , Ġz = Ġ 2 >, Ġvel =< x = Ġ 0 , Ġy =- 4 , Ġz = Ġ 0 > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġassert Position And Velocity ( or bits , Ġstep 3 . split ('\ n '). map Ġ{ Ġread Position ( it ) Ġ}) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 4 .. 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġor bits . advance Orbit () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġstep 1 0 Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpos =< x = Ġ 2 , Ġy = Ġ 1 , Ġz =- 3 >, Ġvel =< x =- 3 , Ġy =- 2 , Ġz = Ġ 1 > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpos =< x = Ġ 1 , Ġy =- 8 , Ġz = Ġ 0 >, Ġvel =< x =- 1 , Ġy = Ġ 1 , Ġz = Ġ 3 > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpos =< x = Ġ 3 , Ġy =- 6 , Ġz = Ġ 1 >, Ġvel =< x = Ġ 3 , Ġy = Ġ 2 , Ġz =- 3 > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpos =< x = Ġ 2 , Ġy = Ġ 0 , Ġz = Ġ 4 >, Ġvel =< x = Ġ 1 , Ġy =- 1 , Ġz =- 1 > ĊĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġassert Position And Velocity ( or bits , Ġstep 1 0 . split ('\ n '). map Ġ{ Ġread Position ( it ) Ġ}) ĊĠĠĠĠĠĠĠ Ġval Ġtotal Energy Ġ= Ġor bits . total Energy () ĊĠĠĠĠĠĠĠ ĠassertThat ( total Energy ). isEqualTo ( 1 7 9 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` test 2 `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġ""" < x =- 1 , Ġy = 0 , Ġz = 2 > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ< x = 2 , Ġy =- 1 0 , Ġz =- 7 > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ< x = 4 , Ġy =- 8 , Ġz = 8 > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ< x = 3 , Ġy = 5 , Ġz =- 1 > """. trim Indent () ĊĠĠĠĠĠĠĠ Ġval Ġor bits Ġ= Ġread Or bits ( input . split ('\ n ')) ĊĠĠĠĠĠĠĠ Ġval Ġoriginal Ġ= Ġor bits . copy () ĊĠĠĠĠĠĠĠ Ġvar Ġcount Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġor bits . advance Orbit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcount ++ ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ(! or bits . same As ( original )) ĊĊĠĠĠĠĠĠĠ Ġprintln (" Count =$ count ") ĊĠĠĠĠĠĠĠ ĠassertThat ( count ). isEqualTo ( 2 7 7 2 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` test 3 `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġ""" < x =- 1 , Ġy = 0 , Ġz = 2 > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ< x = 2 , Ġy =- 1 0 , Ġz =- 7 > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ< x = 4 , Ġy =- 8 , Ġz = 8 > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ< x = 3 , Ġy = 5 , Ġz =- 1 > """. trim Indent () ĊĠĠĠĠĠĠĠ Ġval Ġor bits Ġ= Ġread Or bits ( input . split ('\ n ')) ĊĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġlowest Common Multiplier ( find Cycles ( or bits ). map Ġ{ Ġit . to BigInteger () Ġ}) ĊĊĠĠĠĠĠĠĠ Ġprintln (" Count =$ count ") ĊĠĠĠĠĠĠĠ ĠassertThat ( count ). isEqualTo ( 2 7 7 2 . to BigInteger ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` test 4 `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ< x =- 8 , Ġy =- 1 0 , Ġz = 0 > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ< x = 5 , Ġy = 5 , Ġz = 1 0 > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ< x = 2 , Ġy =- 7 , Ġz = 3 > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ< x = 9 , Ġy =- 8 , Ġz =- 3 > ĊĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġval Ġor bits Ġ= Ġread Or bits ( input . split ('\ n ')) ĊĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġlowest Common Multiplier ( find Cycles ( or bits ). map Ġ{ Ġit . to BigInteger () Ġ}) ĊĊĠĠĠĠĠĠĠ Ġprintln (" Count =$ count ") ĊĠĠĠĠĠĠĠ ĠassertThat ( count ). isEqualTo ( 4 6 8 6 7 7 4 9 2 4 . to BigInteger ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġassert Position And Velocity ( ĊĠĠĠĠĠĠĠ Ġor bits : ĠO rb its , ĊĠĠĠĠĠĠĠ Ġpositions 1 : ĠList < Pair < Axis , ĠAxis >> ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġor bits . mo ons . forEach Indexed Ġ{ Ġindex , Ġmoon Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( moon . pos ). isEqualTo ( positions 1 [ index ]. first ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( moon . vel ). isEqualTo ( positions 1 [ index ]. second ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ