Files
instacode-app/multiplying-numbers-as-strings-part-ii/index.js

54 lines
1.6 KiB
JavaScript

// https://www.codewars.com/kata/multiplying-numbers-as-strings-part-ii/train/javascript
function multiply(aa, bb) {
let [a, b] = [aa, bb].map(str => str.match(/(\-?)([0-9]+)\.?([0-9]*)$/));
let m = a[3].length + b[3].length;
let res = multiplySimple(a[2]+a[3], b[2]+b[3]);
let zeros = '0'.repeat(Math.max(0, m-res.length));
if (m) res = (zeros+res).substr(0,res.length-m) + '.'+ (zeros+res).substr(-m);
let r = (a[1]+b[1]).replace(/\-\-/, '') + (res.replace(/\.([0-9]*?)0*$/, '.$1').replace(/\.$/, '').replace(/^\./, '0.') || '0')
return r === '-0' ? '0' : r;
}
// https://www.codewars.com/kata/multiplying-numbers-as-strings/solutions/javascript
function multiplySimple(a, b) {
return a.split('').reduceRight((sum, d, i, arr) => {
return sumStrings(mul(b, +d) + '0'.repeat(arr.length - i - 1), sum);
}, '0');
}
// mltiple any big int (string) by one digit (0-9)
function mul(str, d) {
return d.toString(2).split('').reduceRight((obj, b) => {
let {res, last} = obj;
if (b === '1') res = sumStrings(res, last);
last = sumStrings(last, last);
return {res, last}
}, {res: '0', last: str}).res;
}
// https://www.codewars.com/kata/sum-strings-as-numbers
function sumStrings(aa,bb) {
let a = aa.split('').reverse();
let b = bb.split('').reverse();
let c = 0;
let r = [];
for (let i = 0; i < Math.max(a.length, b.length); ++i) {
let sum = (+a[i]|0) + (+b[i]|0) + c;
if (sum >= 10) {
r[i] = (sum - 10) + '';
c = 1;
} else {
r[i] = sum + '';
c = 0;
}
}
if (c) {
r.push('1');
}
return r.reverse().join('').replace(/^0*/, '') || '0';
}