Calculator, quadratic solver, converter, complex math + smart word parser
// ==UserScript==
// @name Math Multi-Tool Pro (TI-lite)
// @namespace http://tampermonkey.net/
// @version 4.0
// @description Calculator, quadratic solver, converter, complex math + smart word parser
// @match *://*/*
// @grant none
// @author Valhalla_Vikings
// @license All rights reserved. Copyright © 2026 Valhalla_Vikings
// ==/UserScript==
(function() {
'use strict';
/* ---------------- UI ---------------- */
const box = document.createElement("div");
Object.assign(box.style,{
position:"fixed", top:"100px", right:"20px", width:"320px",
background:"#1e1e1e", color:"#fff", padding:"12px",
borderRadius:"10px", zIndex:9999, fontFamily:"Arial",
boxShadow:"0 0 15px rgba(0,0,0,0.6)", cursor:"move"
});
box.innerHTML = `
<div style="display:flex; gap:5px; margin-bottom:10px; flex-wrap:wrap;">
<button class="tab" data="calc">Calc</button>
<button class="tab" data="quad">Quad</button>
<button class="tab" data="conv">Conv</button>
<button class="tab" data="complex">Cplx</button>
<button class="tab" data="word">Word</button>
</div>
<div id="calc">
<input id="expr" placeholder="2*(3+4)" style="width:100%">
<button id="evalBtn">=</button>
<p id="calcOut"></p>
</div>
<div id="quad" style="display:none;">
<input id="qa" placeholder="a">
<input id="qb" placeholder="b">
<input id="qc" placeholder="c">
<button id="solveQ">Solve</button>
<p id="qOut"></p>
</div>
<div id="conv" style="display:none;">
<input id="val" placeholder="value">
<select id="from"></select>
<select id="to"></select>
<button id="doConv">Convert</button>
<p id="convOut"></p>
</div>
<div id="complex" style="display:none;">
<b>z₁</b><br>
<input id="r1" placeholder="real">
<input id="i1" placeholder="imag"><br><br>
<b>z₂</b><br>
<input id="r2" placeholder="real">
<input id="i2" placeholder="imag"><br><br>
<select id="cop">
<option value="add">+</option>
<option value="sub">-</option>
<option value="mul">*</option>
<option value="div">/</option>
<option value="mag">|z₁|</option>
<option value="arg">arg(z₁)</option>
<option value="polar">→ polar</option>
<option value="pow">z₁^n</option>
<option value="root">n-th roots</option>
</select>
<input id="nVal" placeholder="n">
<button id="cRun">Compute</button>
<p id="cOut"></p>
</div>
<div id="word" style="display:none;">
<textarea id="wordInput" placeholder="Paste word problem..." style="width:100%; height:90px;"></textarea>
<button id="solveWord">Solve</button>
<p id="wordOut"></p>
</div>
`;
document.body.appendChild(box);
/* -------- Dragging -------- */
let isDown=false,ox,oy;
box.onmousedown=e=>{isDown=true;ox=e.offsetX;oy=e.offsetY;};
document.onmouseup=()=>isDown=false;
document.onmousemove=e=>{
if(!isDown)return;
box.style.left=(e.pageX-ox)+"px";
box.style.top=(e.pageY-oy)+"px";
};
/* -------- Tabs -------- */
document.querySelectorAll(".tab").forEach(btn=>{
btn.onclick=()=>{
["calc","quad","conv","complex","word"].forEach(id=>{
document.getElementById(id).style.display="none";
});
document.getElementById(btn.dataset.data).style.display="block";
};
});
/* ---------------- Calculator ---------------- */
evalBtn.onclick=()=>{
try{
let expr=exprInput();
if(!expr.trim()) throw "";
expr=expr
.replace(/÷/g,"/")
.replace(/×/g,"*")
.replace(/\^/g,"**")
.replace(/[^-()\d/*+.^]/g,"");
calcOut.textContent=Function(`return (${expr})`)();
}catch{
calcOut.textContent="Error";
}
};
function exprInput(){return document.getElementById("expr").value;}
/* ---------------- Quadratic ---------------- */
solveQ.onclick=()=>{
const a=+qa.value,b=+qb.value,c=+qc.value;
const d=b*b-4*a*c;
if(d>0){
qOut.textContent=
((-b+Math.sqrt(d))/(2*a))+", "+
((-b-Math.sqrt(d))/(2*a));
}else if(d===0){
qOut.textContent=-b/(2*a);
}else{
const re=(-b/(2*a)).toFixed(3);
const im=(Math.sqrt(-d)/(2*a)).toFixed(3);
qOut.textContent=`${re} ± ${im}i`;
}
};
/* ---------------- Converter ---------------- */
const units={m:1,km:1000,cm:0.01,mm:0.001,ft:0.3048,in:0.0254,mi:1609.34,g:1,kg:1000};
Object.keys(units).forEach(u=>{
from.innerHTML+=`<option>${u}</option>`;
to.innerHTML+=`<option>${u}</option>`;
});
doConv.onclick=()=>{
const v=+val.value;
convOut.textContent=(v*units[from.value])/units[to.value];
};
/* ---------------- Complex ---------------- */
function C(r,i){return{r,i};}
const add=(a,b)=>C(a.r+b.r,a.i+b.i);
const sub=(a,b)=>C(a.r-b.r,a.i-b.i);
const mul=(a,b)=>C(a.r*b.r-a.i*b.i,a.r*b.i+a.i*b.r);
const div=(a,b)=>{const d=b.r*b.r+b.i*b.i;return C((a.r*b.r+a.i*b.i)/d,(a.i*b.r-a.r*b.i)/d);};
const mag=z=>Math.hypot(z.r,z.i);
const arg=z=>Math.atan2(z.i,z.r);
cRun.onclick=()=>{
const z1=C(+r1.value||0,+i1.value||0);
const z2=C(+r2.value||0,+i2.value||0);
const op=cop.value,n=+nVal.value;
let out="";
switch(op){
case"add":out=fmt(add(z1,z2));break;
case"sub":out=fmt(sub(z1,z2));break;
case"mul":out=fmt(mul(z1,z2));break;
case"div":out=fmt(div(z1,z2));break;
case"mag":out=mag(z1).toFixed(4);break;
case"arg":out=arg(z1).toFixed(4)+" rad";break;
}
cOut.textContent=out;
};
function fmt(z){return `${z.r.toFixed(3)} ${z.i>=0?"+":"-"} ${Math.abs(z.i).toFixed(3)}i`;}
/* ---------------- Word Solver ---------------- */
solveWord.onclick=()=>{
let t=wordInput.value.toLowerCase();
try{
// detect numbers + units
const nums=[...t.matchAll(/(\d+(\.\d+)?)/g)].map(x=>+x[0]);
// kg → g
if(t.includes("kg")) nums[0]*=1000;
// chocolate bar style (division)
if(t.includes("how many")){
const result=nums[0]/nums[1];
wordOut.textContent=result;
return;
}
// fallback basic math words
t=t.replace(/plus/g,"+")
.replace(/minus/g,"-")
.replace(/times|multiplied/g,"*")
.replace(/divided/g,"/");
let expr=t.replace(/[^-()\d/*+.^]/g,"").replace(/\^/g,"**");
wordOut.textContent=Function(`return (${expr})`)();
}catch{
wordOut.textContent="Couldn't solve";
}
};
})();