From 54db87e6c781bb2c61895420baf4ef45f0eefd8c Mon Sep 17 00:00:00 2001 From: Grzegorz Kucmierz Date: Sun, 1 Dec 2019 16:50:18 +0100 Subject: [PATCH] Decimal to Factorial and Back --- decimal-to-factorial-and-back/index.js | 35 ++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 decimal-to-factorial-and-back/index.js diff --git a/decimal-to-factorial-and-back/index.js b/decimal-to-factorial-and-back/index.js new file mode 100644 index 0000000..a9d10bd --- /dev/null +++ b/decimal-to-factorial-and-back/index.js @@ -0,0 +1,35 @@ +// https://www.codewars.com/kata/decimal-to-factorial-and-back/javascript + +const [ + dec2FactString, + factString2Dec +] = (() => { + const bases = [1, 1]; + let fact = 1; + for (let i = 2; i < 36; ++i) { + fact *= i; + bases[i] = fact; + } + let chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; + return [ + nb => { + const res = []; + for (let i = bases.length-1; 0 <= i; --i) { + if (1 <= nb/bases[i]) { + const tmp = Math.floor(nb/bases[i]); + nb = nb - tmp * bases[i]; + res.push(tmp); + } else { + res.push(0); + } + } + return res.map(n=>chars[n]).join``.replace(/^0+/, '') || '0'; + }, + str => { + const r = [...str].reduceRight((acc, ch, i, arr) => { + return acc + bases[arr.length - i - 1] * chars.indexOf(ch); + }, 0); + return r; + } + ]; +})();