From c18596661f554783ebc9c6986b58aeafda757f75 Mon Sep 17 00:00:00 2001 From: Andrea Cavalli Date: Sat, 23 Dec 2017 14:09:42 +0100 Subject: [PATCH] Added division rule removed also some old and unused resources --- .../org/warp/picalculator/ScriptUtils.java | 23 ++++++ .../java/org/warp/picalculator/Utils.java | 21 ----- .../warp/picalculator/math/rules/Rule.java | 2 + .../draft unknown variable choice.png | Bin 6019 -> 0 bytes src/main/resources/palettetmp.bmp | Bin 4234 -> 0 bytes src/main/resources/rules.csv | 1 + .../resources/rules/functions/Division.js | 74 ++++++++++++++++++ .../resources/rules/functions/Expression.js | 7 +- 8 files changed, 103 insertions(+), 25 deletions(-) delete mode 100755 src/main/resources/draft unknown variable choice.png delete mode 100755 src/main/resources/palettetmp.bmp create mode 100644 src/main/resources/rules/functions/Division.js diff --git a/src/main/java/org/warp/picalculator/ScriptUtils.java b/src/main/java/org/warp/picalculator/ScriptUtils.java index b71e6b19..e4fbe35c 100644 --- a/src/main/java/org/warp/picalculator/ScriptUtils.java +++ b/src/main/java/org/warp/picalculator/ScriptUtils.java @@ -1,7 +1,30 @@ package org.warp.picalculator; +import java.math.BigInteger; +import java.util.Iterator; +import java.util.LinkedList; + public class ScriptUtils { public static boolean instanceOf(Object a, Class b) { return b.isInstance(a); } + + public static LinkedList mcm(LinkedList factors1, LinkedList factors2) { + LinkedList mcm = new LinkedList<>(); + Iterator i1 = factors1.iterator(); + while(i1.hasNext()) { + BigInteger int1 = i1.next(); + Iterator i2 = factors2.iterator(); + while(i2.hasNext()) { + BigInteger int2 = i2.next(); + if (int1.equals(int2)) { + i1.remove(); + i2.remove(); + mcm.add(int1); + break; + } + } + } + return mcm; + } } diff --git a/src/main/java/org/warp/picalculator/Utils.java b/src/main/java/org/warp/picalculator/Utils.java index 5bef4fe5..2cb57243 100755 --- a/src/main/java/org/warp/picalculator/Utils.java +++ b/src/main/java/org/warp/picalculator/Utils.java @@ -30,8 +30,6 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.Collections; import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -728,25 +726,6 @@ public class Utils { return (OS.indexOf("win") >= 0); } - public static LinkedList mcm(LinkedList factors1, LinkedList factors2) { - LinkedList mcm = new LinkedList<>(); - Iterator i1 = factors1.iterator(); - while(i1.hasNext()) { - BigInteger int1 = i1.next(); - Iterator i2 = factors2.iterator(); - while(i2.hasNext()) { - BigInteger int2 = i2.next(); - if (int1.equals(int2)) { - i1.remove(); - i2.remove(); - mcm.add(int1); - break; - } - } - } - return mcm; - } - public static void gc() { Object obj = new Object(); final WeakReference ref = new WeakReference<>(obj); diff --git a/src/main/java/org/warp/picalculator/math/rules/Rule.java b/src/main/java/org/warp/picalculator/math/rules/Rule.java index ea1befd3..821bd3b3 100644 --- a/src/main/java/org/warp/picalculator/math/rules/Rule.java +++ b/src/main/java/org/warp/picalculator/math/rules/Rule.java @@ -3,6 +3,7 @@ package org.warp.picalculator.math.rules; import org.warp.picalculator.math.Function; import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import jdk.nashorn.internal.objects.annotations.SpecializedFunction; /** * Rule interface @@ -22,6 +23,7 @@ public interface Rule { * Get rule type * @return */ + @SpecializedFunction public RuleType getRuleType(); /** diff --git a/src/main/resources/draft unknown variable choice.png b/src/main/resources/draft unknown variable choice.png deleted file mode 100755 index 973440c9c479ed6694ec4cd3e9b543b7a5af45ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6019 zcmbt&WmFVS)IPOKEul0^H`3j)Qj3%z-LV29B`mn~vI%rY zsoT}n6AVCp2hOdK@W~{m*BbWS#6RdcUw;He3LoL0bG&BIlospe?uT+1-Hfc?CJmMq z?@iB|&DQyxoewEvic7Z5&2BG`i<0+VZe=h3CSjvJoT%S?TNR*h)OC^hvtNq;N#VFhcx|6-AZ?e+F=I`7f#=He#B`AmCr`p z9;K=pPk-D_r6%0l7<}>o{eU_Zu}DKV+2Fg_mKAq>9i}iEEoAXs+`$b&FS4PRE*iU* z>#05F4~KU&1x#&#^R1Qr+}!C!+}+>CDVa61rktPuUH=r)7~%?qvRfDb{4k9eLIH=5 zk&9m~m#?q>4oU?k&D6ip2w)NS({bKJefLLqt?a#QJ{$jKG)wiX`cl(`y_#xW@Lxi9vf7vS7Z0B7P>y#|<03oJf*Y2vUPw2=Ayix1{E;fnCyU7d zlW{L}{;$ksvGzZ$?3QKb*KCh*0@L3Kl8C7?so^}@2#}~94wVHv8W~WUuY&+#a&_pA4|N8MeCKbL_Qg-LCTdKk?61a*Qey^j2ST}^o(Ok?d|P4>|v&cukF8Bvq2@+TyOxD;@mH$#xPHZ zd;XXH4k_r#x$~)spar53DO!oa)(cRAM~s~euGBSB*ABrG3Jd+7JigTr|!C>Uk%O`8v-M+3CW zD^s^UomQ31*}2jHHkX%|2_CTO@Wo+3S(=NFPqHzMdQ*~Ij&ggJA1fBGNY$~PJb=8` zd54i59qqJ<8lMYR7Oc=Jo#3=7dVyiQvm+R*vz#WFWI%ch)zy-Y2+6AssKvDU8dJrM z26%vGN`6M6K9{upJvK>~VV}g>@|M%aQ96RKJ~x(VIZw8&`#DEsmUb+^6`f>)BR}XXmW@9+Vlm2{B)Xu^)xa~L;P~j7y z!w03e1`oPifLj5x#Ej4Ezxydx+yK#_z(qAQ8P+4U1X@s66}ODq(|u8{F_xLRVJ|hT z)e^{2gV$7GDBP_%2GTZ{@`apzE1huC*=D3OE`G_F`_eUBt8^YzdsHdF05>8FW)*Q* zrwoqiX=uL`Bg(Xq2_@m|ObQn-W*GMYKKA$Pl)xj6Q)Z%NfJYzqnbPJAslC5-a~r;ZoW(HkXy8=l7^?ka#y{11bdEp!C0O$I zOIfS(%de$wOQ^jbEEZo38lAh_tsO#Y?Zymd0m(mL-Z|XjEHTCwCS@x4N3WMZfpu2W zh;C$C?xz^DR<1R?Cn}R-^;8)JStce(xF{_Pc;@Ml*y2=%PF^DP&!irDWQY6|BN>~r zu!e0HxFR1w?K;_?3MG+a_|JuWszWA>qT0fqTHJIdXJ6~@hr)7QY-DSM@8ZAt4Dl)9 zn{6~~s#BbcSf|<5q5lB$!t!zk|ko&)8YzAs$XX4Y=%B7yh+1GFLR)Jhzr^45KvU#tj=JbWaXymX<`|_ATO18n1IdVv zg5n}7n>x_$%70L$OJ$!n5DR|(!1AxKs1l**hA6_tAPRAw{e25AhfxvT&~p)8#SGB@ zr|z$o*|J^7%lC!UwP!q2l5QNJe~DIFM9mTC=;%BcNz^NuP277;9!y@SeRg{Kc??tv z-Ys|W>Hw(72CCTg-F_@zn@K#@w#A|E|8(h_G?--YU|bztppa(6Zs82ezZSmj6u}Dc zN0A5flokvvv)Wt^0oeE4TLCJ-NUyzOSL734aQ7ya$}#TxY)CKSGMueGx2yI0%>MOo z3F{v9Ld=5sqEkWJoja{#XF4n3c z>VxzQaNVTj}`CxZN zwfoK}XO|104Oo@(x3Tc$YmaTrc_VVz1(qZQcopEi)?o{J9nwUtG29-;vLrc~K`g1o zy>(-#C!3R2mQ}uhx0a#uu>3X3^>i(^wzB;T>~ww_=@C!%YdHDJ?s0+q2j9JRU)dUz zYdu%cC4Gz4H1}!v%05a_LtTP`$6X%xyLpC6-jL9AS{+qODUD`vgBI3C5|t5VmW;(2 z$MYyGkC0~Oxy%_7ewAzWm3_`sga$notF58~*`9uU*W^4`)u!r_MeCV=hk4bJ2L#j+ z(2{PGER(^=_$pGJk&xjFAYr;)jCbkhsFE9$uF4i|sz;s-WV?PRikyM5=2eHrW#pi+d&W5!*}r`=RI}bSIhV*A9nIT}h;)o(y!y zh}bbz`eXR*hB5eCEM9vMElsuk5GMw*-*kF$*f5sC{x8LQ|L3t8TYQQ$-cDUk=+M#G zW2w*=3JjCyd^`1T=iXFPIm#zHqt>3$)fZNb=ZP-P?uYJ=$EdlE3EO1lTfGrAs~FI> zkg*w|WDG%pHxr?kc+r0uHF1w-p$|iHr_{RwL)M==xG54wgfx*+u)Q^dSxhilPAKf@ zES)Y?K4kC=uLuZyhLTy%7EqlzAX`y0P~ zK+!Ynu3A|iGvs_Ei&_2XTbtp(7Br+hvQC>i)f*?BW2K59B{<~CK9iY>wt9h$VbOM& zbwsrB{{c^HwrApc1@_20d%gcSfT}ZQoaGdQxUr2BR6A*pFa2Cp87#7_WE+=3D7 z2iZtuv(cOxCA<}d!v zsQ>wL;f$&kjp^u!R$$AYB{{ZsD*$`?O9}U5a#yL5|4K_{eOP7{!73h20{uNej`B%=Uabg|)=2%pqPsAR% z)+k8q&9CAImS;b!nstVu+&N<&bnIl_t}kV$T01|d=Du$SC`2o)?TUpldE5+D;7!+QgS+OFNos`EEag zUD*s1P&`!+^;}3NwSoOWd7tl}MRz7i5m}0LGd~-HJ3i;lb9`QWK3Y`!Y4TKzMz-r4 zQJEn>2#l^x>>Yg<3b#yF;M*X4GyY02V~u62d*ALi;eS3V5KWkf)_YUf>_sEy0~pE@ z;Y?QVo8ctYklT0PJ(z438P!Vv5~B1MiSmai5fc+{B%@Y5iZR%uA_%r2H%8-IifNA~ zQs20(i#;OKLa63Qvok1PEsblH801y~hfMqtXN`_GlO#I5F-A{2S_KGSVTsvOS#w>I z$f)#hOn#(_ZiH@mTKYY*P5AmIf9ECi_y(KAJPYhA*4SYXvrlE^l#i+ub&p)MYA@FQ z&_pAGKT<^h2B>3Z;?V~FNy~D-XURu0(vB3Z&7fww{ufH%*e5vobSA+MLJk^aHkUE8 zVtYeR)k{VJOfVjmu1t3}A~yGbD2_~2Zm_tPdzv}7pyxZ73viqSh=~8}vt&@%)4B8rF#0auSr;)Dti1{uW=8#9 zwHItEa7eE-)>cU4t2SBC^6lQJ1?iiJA$nlLVmVP{*7MQ0?y5G7P~10I>wn33Z~m#> z97rMPEP)>VzHQIVq#K$3DLdC(?U>G${hC+;|5F4tm{j&q=o6EBI zbYST9;V3$ZIARz(^cg@qOSrby3^%g+h4V63(FaqJ%G>*?8x`bJPN&&R{o-fXYL30r zSCSf=`oaY3x*&6Qb)GlU<{EzV6^0M}1T+RsJV7*{LU(?otca1-ww}7GKfX_N6Ww}H z^km$6nxAmQfG*814HeBqsmbDrQ=}an1)9a$hd7oopk|aHnl3UtZuqgrOWw9ekn%zk zCi{p0-t%~rNJUc-GL`c{jwlviepYnZ{G)eqMQRo8@so&Ca3pGZ*RADNNZ+dh_|cdy z;Ss4d)LJr{B2uQNH~v@Iqo;@_DAtR~v1f~cxrl%nADE{aZNfd%K6MH62xx1{q zq%jGKv6?}p1*+G-N`&2uWiapV&MCdSiMZJMqth%^?YAgk|A0nCj;T{XXBeYBLrFh9 zl&3X(m=NoQUIzm0x$xVgIfOPJ0YBH?0C5gZh>4Uo!e}Wd4EwWgRIzw!aQ-T8uM7O7 z+~rq+eK`^SDPfS6l8C9>Ow8hgPQEG(%=80aPzXoooQuc8d&4B>Dpbs|7x}GAa2RVGEjK1w5fmxPYvRH~ z;%var4XA0Rw1JU8_+u2hR?cn?!NpTR1F3*G%Mo+Mge`levAkks>L%)LIVMuuetOwn zYLp?Re^Srv+5GHnhR|1Ql8a@vf2DDjb%QqtXP+=Y_q>5+(<-vJ62;R06s`oq+rnKM zzd)0u$?x7wadOw6s=pN^aqy~^NFx0y)@_Q$Vm_4Z9fbqlH8BXipI2h@6q=>e+J9#f zJ{wKyX)8=?^AIx*IDSO|bqzH771pd`)knwYev&B{}fTYOuFzDSY+yMt%w%xvD3jxfO|J3sZB>yT69ugT7u7G z1rzfI*~&(LuJZ~~vVduNPWKJr$Nu*%Nw)3vcvAFfJHK~L6tPbZsVIf>>#)k|d;vZS zsL4+b;3p#b1+EokMpkH=nJ=N}C((iV{8^_z)zZg|;5f+twA3rYo`y?l5 zjY-J%64s^a(%(jM;>SnlCG0=XGg?jt=bH}I%5QqWlR>M~o5_;|^q2>=yIWbRVb*~h zkFF=?6+0sHtKY9g=D(+~o8V1{w)(2*%O%ohlX$+p@AV^1Yj$jkEGFWnrR86VT*S>4 zRlsGG!$pWdM$E)pXJYkIvF3kVgxiHf6w+nZ42&VeIQb4=*gjL^<~#j&u>4q&0Y={Xj?~^WjQK&h_(J=mp>xJnPKcl%T z^fQRmPhQ7p!h6#cfuA=)cerSIWZeBbx(Yn{fFS1zSfzf1do066#h4SehsE&X$pmUe=xyMxUy_0F3XKykA`bt{Cc^vt>4jfk50B#^wk>;h*h8x5qSRaKa3ino-* zG_;TW)&x+D*@tba5y-U5x)nDh{+hMZoG)DVn7U071?FjevPx9uRxyU0<=4-afkVu_ zXX-2K>S9t)HFTH-C-qSp@AFE}lNn0o+D9-|e^CR*;sd=w7_ao)2_@;>lUcJy35BpP zc64wbR-fv6rMR)PKUHo|-RcC6L|RyB;9!14!S0?WWA|0EI06Gkd5>2LA>4yELTm_c zN9c~VU3L@$o%01YTm=WmNCV@Je8^=6krLHR+Pe>fyk(4u5KZJGD#Zgf^$F z%LAVIr8{vHbuh2g@CIp(8veBuDnXPFFhxpUt2xYW>%W#n1!l%BpaNZ^$frKhiMqR) m*XL$gE&e|W?U}~2ThgD+p*~Ly;_p7r@pQEeHNQV}MEwsCdUrek diff --git a/src/main/resources/palettetmp.bmp b/src/main/resources/palettetmp.bmp deleted file mode 100755 index db22ad4f58d6074a246c9c282cc785c7b23d245e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4234 zcmZ?r?Gj)BgDxOh1H=kY%m`#L1KA8fd0}n{25}+aKLY~Xeyt- z{r`UeF~b1bJ&^t$wR>RG-Dvm^jqv|`?#5?QFs1QIid~edg}Iedb12dOpTzK`#4c=l z2iksYZWERZbJun(*H^_csFfo27 z#vEid|B194Sr3Sf>=tynQ9g0;ITFI@UEiX2FibE1!tBFElj06sW>7;M><*;xp@x|# qW`q{Kdxs4p+4%~IjiMJOj; if it did something + */ + execute: function(f) { + if (ScriptUtils.instanceOf(f, Division.class)) { + var result = new ObjectArrayList(); + var variable1 = f.getParameter1(); + var variable2 = f.getParameter2(); + var mathContext = f.getMathContext(); + if (ScriptUtils.instanceOf(variable1, Number.class) && ScriptUtils.instanceOf(variable2, Number.class)) { + if (mathContext.exactMode) { + if (variable1.isInteger() && variable2.isInteger()) { + var factors1, factors2, mcm; + try { + factors1 = variable1.getFactors(); + factors2 = variable2.getFactors(); + mcm = ScriptUtils.mcm(factors1, factors2); + } catch (error) { + return null; + } + if (mcm.size() > 0) { //true if there is at least one common factor + //divide by the common factor (ab/cb = a/c) + var nmb1 = variable1.term.toBigIntegerExact(); + var nmb2 = variable2.term.toBigIntegerExact(); + mcm.forEach(function(integerNumber) { + nmb1 = nmb1.divide(integerNumber); + nmb2 = nmb2.divide(integerNumber); + }); + result.add(new Division(mathContext, new Number(mathContext, nmb1), new Number(mathContext, nmb2))); + } + } + } else { + //divide a by b (a/b = c) + result.add(variable1.divide(variable2)); + } + } + } + return null; + } +} + +//Add this rule to the list of rules +RulesManager.addRule(engine.getInterface(rule, Rule.class)); \ No newline at end of file diff --git a/src/main/resources/rules/functions/Expression.js b/src/main/resources/rules/functions/Expression.js index 7c85ffff..62457c39 100644 --- a/src/main/resources/rules/functions/Expression.js +++ b/src/main/resources/rules/functions/Expression.js @@ -12,9 +12,8 @@ var Number = org.warp.picalculator.math.functions.Number; var Expression = org.warp.picalculator.math.functions.Expression; /** - * Expand rule - * -(+a+b) = -a-b - * -(+a-b) = -a+b + * Expression + * (x) = x * * @author Andrea Cavalli * @@ -26,7 +25,7 @@ var rule = { }, // Rule type getRuleType: function() { - return RuleType.EXPANSION; + return RuleType.CALCULATION; }, /* Rule function Returns: