JSFiddle - React, Tailwind, and code Playground
JavaScript
const ArrayOps = {
wholeToArnum(n){
return n.split('').reverse().map(e=>e>>0);
},
decToArnum(n){
//return with level
n = n.split('').reverse();
let decLength = n.indexOf('.');
n.splice(decLength, 1);
n = n.map(e=>e>>0);
while(n[n.length - 1] === 0) n.pop();
let denom = [1];
let brake = handBrake(20);
let loopCount = decLength;
while(loopCount-- && brake()){
denom.unshift(0);
}
return {numer: n, denom, decLength};
},
repDecToArnum(n, precedingDigits = 0){
let numer = this.wholeToArnum(n);
let denom = [];
let ninesCount = numer.length;
let brake = handBrake(20);
while(ninesCount-- && brake()){
denom.unshift(9);
}
brake = handBrake(200);
while(precedingDigits-- && brake()){
denom.unshift(0);
}
return {numer, denom};
},
add(...nums){
nums = nums.filter(e=>{
e = e.join('');
return !is.zero(e);
});
if(nums.length === 0) return [0];
function compressor(arnum){
compress = false;
for(let i = 0; i < arnum.length; i++){
let curr = arnum[i] || 0;
if(curr >= 10){
let next = arnum[i+1] || 0;
next += drop(curr/10);
curr %= 10;
arnum[i] = curr;
arnum[i+1] = next;
}
}
}
let compress = false;
let drop = Math.floor;
let COMP_POINT = drop(Number.MAX_SAFE_INTEGER / 100);
let sum = nums.shift();
while(nums.length > 0){
let N = nums.shift();
N.forEach((e,i)=>{
let s = sum[i] || 0;
let temp = s + e;
if(temp > COMP_POINT) compress = true;
sum[i] = temp;
});
if(compress) compressor(sum);
}
compressor(sum);
return sum;
},
subtract(minuend, ...subtrahends){
let sub = this.add(...subtrahends);
minuend.forEach((e,i,arr)=>{
let s = sub[i] || 0;
let diff = e - s;
if(diff < 0){
diff += 10;
arr[i+1]--;
}
arr[i] = diff;
});
let lastDigit = minuend[minuend.length - 1];
if(lastDigit < 0 ||...