package Ġhe b . apps . math trainer . data . quiz . factory . cre ators . ar ithmetic Ċ Ċ import Ġandroid . content . Context Ċ import Ġhe b . apps . math trainer . data . math . Math Evaluate Ab le Ċ import Ġhe b . apps . math trainer . data . math . function . binary . Binary Operation Ċ import Ġhe b . apps . math trainer . data . math . type . Int Num Ċ import Ġhe b . apps . math trainer . data . math . utils . Integer Range Ċ import Ġhe b . apps . math trainer . data . math . utils . Random Helper Ċ import Ġkotlin . math . floor Ċ Ċ // Ġbinary Ġarithmetic ĠQ TC Ċ abstract Ġclass ĠBinary Ar th Q tc ( ctx : ĠContext , Ġtopic Id : ĠInt ) Ġ: ĠArithmetic Q tc ( ctx , Ġtopic Id ) Ġ{ ĊĊĠĠĠ Ġ// Ġrelation Ġof Ġmaximum Ġoperand Ġper Ġlevel Ġdifficulty ĊĠĠĠ Ġprotected Ġopen Ġval Ġmax Operand Per Ld Ġ= ĠDEF _ MAX _ OPER AND _ PER _ LD ĊĠĠĠ Ġ// Ġminimum Ġof Ġoperands ĊĠĠĠ Ġprotected Ġopen Ġval Ġmin Oper ands Ġ= ĠDEF _ MIN _ OPER AND S ĊĠĠĠ Ġ// Ġrelation Ġof Ġnumber Ġof Ġoperands Ġper Ġlevel Ġdifficulty ĊĠĠĠ Ġprotected Ġopen Ġval ĠnumOf Oper ands Per Ld Ġ= ĠDEF _ NUM _ OPER AND S _ PER _ LD ĊĠĠĠ Ġ// Ġminimum Ġoperand Ġnumber ĊĠĠĠ Ġprotected Ġopen Ġval Ġmin Operand Num Ġ= ĠDEF _ OPER AND _ MIN _ NUM ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġprint Info . is Parent heses Used Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġrandom Ġr ational Ġnumber ĊĠĠĠ Ġoverride Ġfun Ġrand Correct Answer ( level Diff : ĠInt ) Ġ: ĠBinary Operation < Int ?, ĠInt > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoperands Ġ= Ġrand Oper ands Checked ( level Diff ). map Ġ{ ĠInt Num ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcreate Binary Function ( operands ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġcreate Ġfunction Ġof ĠN Ġoperands ĊĠĠĠ Ġprivate Ġfun Ġcreate Binary Function ( operands : ĠList < Math Evaluate Ab le < Int ?, ĠInt >>) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ: ĠBinary Operation < Int ?, ĠInt > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoperands . size Ġ< ĠDEF _ MIN _ OPER AND S Ġ-> Ġthrow ĠIllegalArgumentException (" Cannot Ġbuild Ġbinary Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" function Ġwith Ġsmaller Ġthen Ġ$ DEF _ MIN _ OPER AND S Ġoperands ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoperands . size Ġ== ĠDEF _ MIN _ OPER AND S Ġ-> Ġcreate Binary Function ( operands [ 0 ], Ġoperands [ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleft Operand Ġ= Ġcreate Binary Function ( operands . drop Last ( 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġright Operand Ġ= Ġoperands . last () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Binary Function ( left Operand , Ġright Operand ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġcreate Ġfunction Ġof Ġ 2 Ġoperands ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġcreate Binary Function ( left Operand : ĠMath Evaluate Ab le < Int ?, ĠInt >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġright Operand : ĠMath Evaluate Ab le < Int ?, ĠInt >) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ: ĠBinary Operation < Int ?, ĠInt > ĊĊĠĠĠ Ġ// Ġget Ġnumber Ġof Ġoperands ĊĠĠĠ Ġprivate Ġfun ĠgetNum Of Oper ands ( level Diff : ĠInt ) Ġ: ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġfloor (( level Diff . toFloat ()* num Of Oper ands Per Ld ) Ġ+ Ġmin Oper ands ). toInt () ĊĊĠĠĠ Ġ// Ġget Ġoperand Ġrange ĊĠĠĠ Ġprivate Ġfun Ġget Operand Range ( level Diff : ĠInt ) Ġ: ĠInteger Range ĊĠĠĠĠĠĠĠ Ġ= ĠInteger Range ( min Operand Num , ĠgetMax Operand Num ( level Diff )+ 1 ) ĊĊĠĠĠ Ġ// Ġcalculate Ġresult Ġof Ġoperands ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġcalc Result ( operands : ĠList < Int >) Ġ: ĠInt ĊĊĠĠĠ Ġ// Ġrandom Ġlist Ġof Ġoperands Ġwith Ġchecking ĊĠĠĠ Ġprivate Ġfun Ġrand Oper ands Checked ( level Diff : ĠInt ) Ġ: ĠList < Int > Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠnumOf Oper ands Ġ= ĠgetNum Of Oper ands ( level Diff ) ĊĠĠĠĠĠĠĠ Ġval Ġoperand Range Ġ= Ġget Operand Range ( level Diff ) ĊĠĠĠĠĠĠĠ Ġval Ġrand Func : Ġ() Ġ-> ĠList < Int > Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrand Oper ands Unchecked ( level Diff , ĠnumOf Oper ands , Ġoperand Range ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcheck Func : Ġ( List < Int >) Ġ-> ĠBoolean Ġ= Ġ{ Ġoperands Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanswer Ġ= Ġcalc Result ( operands ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcan Be Res Num ( level Diff , Ġanswer ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtry Rand With Limit ( rand Func , Ġcheck Func ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġrandom Ġoperands Ġwithout Ġchecking ĊĠĠĠ Ġprotected Ġopen Ġfun Ġrand Oper ands Unchecked ( level Diff : ĠInt , ĠnumOf Oper ands : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoperand Range : ĠInteger Range ) Ġ: ĠList < Int > ĊĠĠĠĠĠĠĠ Ġ= ĠRandom Helper . next Arr ( num Of Oper ands , Ġoperand Range ) ĊĊĠĠĠ Ġ// Ġcalculate Ġmaximum Ġoperand Ġnumber ĊĠĠĠ Ġprivate Ġfun ĠgetMax Operand Num ( level Diff : ĠInt ) Ġ: ĠInt Ġ= Ġmax Operand Per Ld * level Diff ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġdefault Ġrelation Ġof Ġmaximum Ġoperand Ġper Ġlevel Ġdifficulty ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDEF _ MAX _ OPER AND _ PER _ LD Ġ= Ġ 5 ĊĠĠĠĠĠĠĠ Ġ// Ġdefault Ġminimum Ġof Ġoperands ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDEF _ MIN _ OPER AND S Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġ// Ġdefault Ġrelation Ġof Ġnumber Ġof Ġoperands Ġper Ġlevel Ġdifficulty ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDEF _ NUM _ OPER AND S _ PER _ LD Ġ= Ġ 0 . 2 f ĊĠĠĠĠĠĠĠ Ġ// Ġdefault Ġoperand Ġminimum Ġnumber ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDEF _ OPER AND _ MIN _ NUM Ġ= Ġ 1 ĊĠĠĠ Ġ} Ċ }