package Ġd cp . day 2 5 2 Ċ // Ġday 2 5 2 . kt Ċ // ĠBy ĠSeb astian ĠRa aph or st , Ġ 2 0 1 9 . Ċ Ċ import Ġio . kot lint est . properties . Gen Ċ import Ġio . kot lint est . properties . for All Ċ import Ġio . kot lint est . specs . String Spec Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġjava . math . BigInteger Ċ import Ġkotlin . test . assertEquals ĊĊ Ċ class ĠRational Gen : ĠGen < Rational > Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġconstants (): ĠIterable < Rational > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( Rational . ZERO , ĠRational . ONE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrandom (): ĠSequence < Rational > Ġ= Ġgenerate Sequence Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġn Ġ= ĠGen . choose ( 1 , Ġ 1 0 0 ). random (). first () ĊĠĠĠĠĠĠĠ Ġval Ġd Ġ= ĠGen . choose ( n + 1 , Ġ 1 0 1 ). random (). first () ĊĠĠĠĠĠĠĠ Ġn Ġdiv By Ġd ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠE gy pt ian Rational Recursive Test : ĠString Spec () Ġ{ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġ" recursive Ġattempt " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor All ( 1 0 0 , ĠRational Gen ()) Ġ{ Ġr Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġegy pt ian Ġ= Ġr . to E gy pt ian Rational () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsum Ġ= Ġegy pt ian . fold ( Rational . ZERO ){ acc , Ġcurr Ġ-> Ġacc Ġ+ Ġcurr } ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr Ġ== Ġsum ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠE gy pt ian Rational Imp er ative Test : ĠString Spec () Ġ{ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġ" imp er ative Ġattempt " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor All ( 1 0 0 , ĠRational Gen ()) Ġ{ Ġr Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġegy pt ian Ġ= Ġr . to E gy pt ian Rational Imp () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsum Ġ= Ġegy pt ian . fold ( Rational . ZERO ){ acc , Ġcurr Ġ-> Ġacc Ġ+ Ġcurr } ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr Ġ== Ġsum ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠE gy pt ian Rational Direct Test : ĠString Spec () Ġ{ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġ" direct Ġattempt " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor All ( 1 0 0 , ĠRational Gen ()) Ġ{ Ġr Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġegy pt ian Ġ= Ġr . to E gy pt ian Rational Direct () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsum Ġ= Ġegy pt ian ?. fold ( Rational . ZERO ){ acc , Ġcurr Ġ-> Ġacc Ġ+ Ġcurr } ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsum Ġ== Ġnull Ġ|| Ġr Ġ== Ġsum ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠUnit Tests Ġ{ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġexample 1 () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals (( 4 Ġdiv By Ġ 1 3 ), ĠlistOf ( 1 Ġdiv By Ġ 4 , Ġ 1 Ġdiv By Ġ 1 8 , Ġ 1 Ġdiv By Ġ 4 6 8 ). sum ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġexample 2 () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġr : ĠRational Ġ= ĠRational ( BigInteger (" 1 "), ĠBigInteger (" 8 6 2 7 5 4 6 9 9 5 8 3 4 ")) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 8 1 5 Ġdiv By Ġ 9 3 4 , ĠlistOf ( 1 Ġdiv By Ġ 2 , Ġ 1 Ġdiv By Ġ 3 , Ġ 1 Ġdiv By Ġ 2 6 , Ġ 1 Ġdiv By Ġ 1 2 5 7 , Ġ 1 Ġdiv By Ġ 1 6 9 5 8 3 3 , Ġr ). sum ()) ĊĠĠĠ Ġ} Ċ }