randRange(3, 8)
randRange(2, 4)
randRange(3, 8)
randRange(2, 4)
shuffle([function(e,r,n,a){return["+",["*",e,n],a]},function(e,r,n,a){return["-",["*",e,n],a]},function(e,r,n,a){return["+",n,["*",e,a]]},function(e,r,n,a){return["-",n,["*",e,a]]},function(e,r,n,a){return["-",["*",e,n],["*",r,a]]},function(e,r,n,a){return["-",["*",r,n],["*",e,a]]},function(e,r,n,a){return["*",n,["-",a,e]]},function(e,r,n,a){return["*",["-",e,n],a]},function(e,r,n,a){return["+",["^",n,2],["*",r,["^",a,2]]]},function(e,r,n,a){return["+",["*",r,["^",n,2]],["^",a,2]]},function(e,r,n,a){return["-",["^",n,2],["*",r,["^",a,2]]]},function(e,r,n,a){return["-",["*",r,["^",n,2]],["^",a,2]]},function(e,r,n){return["-",["*",r,n],e]},function(e,r,n,a){return["+",["*",e,a],r]},function(e,r,n,a){return["+",["*",n,a],["*",r,n],["-",a]]}],2)
!isNaN(expr(FUN1(A, B, 0, NaN), true))
!isNaN(expr(FUN1(A, B, NaN, 0), true))
randRange(-6, 6)
randRange(-6, 6)
randRange(-6, 6)
expr(FUN2(C, D, "x", "y"))
expr(FUN2(C, D, Y, Z))
expr(FUN2(C, D, Y, Z), true)
expr(FUN1(A, B, "x", "y"))
shuffle(["<code>x "+binop(1)+" y = "+TEXT1+"</code>","<code>x "+binop(2)+" y = "+TEXT2+"</code>"]).join(" and ")
expr(FUN1(A, B, X, VALU2))
expr(FUN1(A, B, X, VALU2), true)
!FUN1_XONLY
"left"
Si TEXTS, encuentra X binop(1) (Y binop(2) Z).
VALU1
Ahora, encuentra X binop(1) VALU2:
Encuentra X binop(1) y:
\qquad X binop(1) NEED_VALU1 ? VALU2 : "y" = SUBS1
\qquad \hphantom{X binop(1) VALU2} = VALU1.
\qquad \hphantom{X binop(1) y} = VALU1.
expr(FUN1(A, B, VALU2, X))
expr(FUN1(A, B, VALU2, X), true)
!FUN1_YONLY
"right"
Si TEXTS, encuentra (Y binop(2) Z) binop(1) X.
VALU1
Ahora, encuentra VALU2 binop(1) X:
Encuentra x binop(1) X:
\qquad NEED_VALU1 ? VALU2 : "x" binop(1) X = SUBS1
\qquad \hphantom{VALU2 binop(1) X} = VALU1.
\qquad \hphantom{x binop(1) X} = VALU1.
Primero encuentra Y binop(2) Z:
\qquad Y binop(2) Z = SUBS2
\qquad \hphantom{Y binop(2) Z} = VALU2.
No necesitamos encontrar Y binop(2) Z pues x binop(1) y depende solamente del operando NEED_VALU1_ONLY.