Spaces:
Running
Running
numToLez = '''(input_text) => { | |
const million = 1e6; // 10^6; | |
const billion = 1e9; // 10^9; | |
const trillion = 1e12; // 10^12; | |
const quadrillion = 1e15; // 10^15; | |
const quintillion = 1e18; // 10^18; | |
const sextillion = 1e21; // 10^21; | |
const septillion = 1e24; // 10^24; | |
const octillion = 1e27; // 10^27; | |
const nonillion = 1e30; // 10^30; | |
const atomic = { | |
0: 'нул', | |
1: 'сад', | |
2: 'кьвед', | |
3: 'пуд', | |
4: 'кьуд', | |
5: 'вад', | |
6: 'ругуд', | |
7: 'ирид', | |
8: 'муьжуьд', | |
9: 'кIуьд', | |
10: 'цIуд', | |
20: 'къад', | |
40: 'яхцIур', | |
// 10^2 | |
100: 'виш', | |
// 10^3 | |
1000: 'агъзур', | |
// 10^6 | |
[million]: 'миллион', | |
// 10^9 | |
[billion]: 'миллиард', | |
// 10^12 | |
[trillion]: 'триллион', | |
// 10^15 | |
[quadrillion]: 'квадриллион', | |
// 10^18 | |
[quintillion]: 'квинтиллион', | |
// 10^21 | |
[sextillion]: 'секстиллион', | |
// 10^24 | |
[septillion]: 'септиллион', | |
// 10^27 | |
[octillion]: 'октиллион', | |
// 10^30 | |
[nonillion]: 'нониллион', | |
}; | |
const MINUS = 'минус'; | |
function separateNumberIntoUnits(n) { | |
if (n == 0) | |
return [0]; | |
const arr = []; | |
let i = 1; | |
while (n > 0) { | |
arr.unshift((n % 10) * i); | |
n = Math.floor(n / 10); | |
i *= 10; | |
} | |
const result = groupNumberUnitsToLezgiRange(arr); | |
return result; | |
} | |
const ranges = [ | |
{ start: nonillion, end: octillion }, // nonillion to octillion | |
{ start: octillion, end: septillion }, // octillion to septillion | |
{ start: septillion, end: sextillion }, // septillion to sextillion | |
{ start: sextillion, end: quintillion }, // sextillion to quintillion | |
{ start: quadrillion, end: quintillion }, // quadrillion to quintillion | |
{ start: trillion, end: quadrillion }, // trillion to quadrillion | |
{ start: billion, end: trillion }, // billion to trillion | |
{ start: million, end: billion }, // million to billion | |
{ start: 1000, end: million }, // thousand to million | |
]; | |
function groupNumberUnitsToLezgiRange(arr) { | |
let result = []; | |
for (let range of ranges) { | |
let sum = arr.reduce((acc, num) => { | |
if (num >= range.start && num < range.end) { | |
return acc + num; | |
} | |
return acc; | |
}, 0); | |
if (sum !== 0) { | |
result.push(sum); | |
} | |
// Filter out the numbers that were added to sum | |
arr = arr.filter((num) => num < range.start || num >= range.end); | |
} | |
// Concatenate the remaining numbers to the result | |
result = result.concat(arr); | |
return result; | |
} | |
function getTenPlusBase(num) { | |
if (num < 10 || num >= 20) { | |
throw new Error('Invalid number'); | |
} | |
if (num === 10) { | |
return [atomic[10]]; | |
} | |
const base10 = atomic[10].slice(0, -2); | |
if (num === 11 || num === 15 || num === 16) { | |
return [base10 + 'у']; | |
} | |
else if (num < 15) { | |
return [base10 + 'и']; | |
} | |
return [base10 + 'е']; | |
} | |
function getTwentyPlusBase(num) { | |
return num === 20 ? [atomic[20]] : ['къанни']; | |
} | |
function getThirtyPlusBase(num) { | |
return [...getTwentyPlusBase(num), ...getTenPlusBase(num - 20)]; | |
} | |
function getFourtyPlusBase(num) { | |
return num === 40 ? [atomic[40]] : [atomic[40], 'ни']; | |
} | |
function getFiftyPlusBase(num) { | |
return [...getFourtyPlusBase(num), ...getTenPlusBase(num - 40)]; | |
} | |
function getSixtyPlusBase(num) { | |
return num === 60 ? [atomic[3], atomic[20]] : [atomic[3], ...getTwentyPlusBase(num)]; | |
} | |
function getSeventyPlusBase(num) { | |
return [...getSixtyPlusBase(61), ...getTenPlusBase(num - 60)]; | |
} | |
function getEightyPlusBase(num) { | |
return num === 80 ? [atomic[4], atomic[20]] : [atomic[4], ...getTwentyPlusBase(num)]; | |
} | |
function getNinetyPlusBase(num) { | |
return [...getEightyPlusBase(81), ...getTenPlusBase(num - 80)]; | |
} | |
function getHundredPlusBase(num) { | |
return num % 100 === 0 ? [atomic[100]] : [atomic[100], 'ни']; | |
} | |
function getHundredPlusNumCount(numCount) { | |
if (atomic[numCount] !== undefined) { | |
return numCount === 2 ? [atomic[numCount].slice(0, -1)] : [atomic[numCount]]; | |
} | |
return undefined; | |
} | |
function getBetweenHundredAndThousand(num, followUpNumber) { | |
const hundredsCount = num % 100 != 0 ? num - (num % 100) : num / 100; | |
const hundredsCountInLezgi = getHundredPlusNumCount(hundredsCount); | |
return [...hundredsCountInLezgi, ' ', ...getHundredPlusBase(num + followUpNumber)]; | |
} | |
function getThousandPlusBase(num) { | |
return num % 1000 === 0 ? [atomic[1000]] : [atomic[1000], 'ни']; | |
} | |
function getBetweenThousandAndMillion(num, followUpNumber) { | |
var _a; | |
const thousandsCount = num % 1000 != 0 ? num - (num % 1000) : num / 1000; | |
const thousandsCountInLezgi = (_a = getHundredPlusNumCount(thousandsCount)) !== null && _a !== void 0 ? _a : getCompound(thousandsCount); | |
return [...thousandsCountInLezgi, ' ', ...getThousandPlusBase(num + followUpNumber)]; | |
} | |
function getMillionPlusBase(num) { | |
return num % million === 0 ? [atomic[million]] : [atomic[million], 'ни']; | |
} | |
function getBetweenMillionAndBillion(num, followUpNumber) { | |
var _a; | |
const millionsCount = num % million != 0 ? num - (num % million) : num / million; | |
const millionsCountInLezgi = (_a = getHundredPlusNumCount(millionsCount)) !== null && _a !== void 0 ? _a : getCompound(millionsCount); | |
return [...millionsCountInLezgi, ' ', ...getMillionPlusBase(num + followUpNumber)]; | |
} | |
function getBillionPlusBase(num) { | |
return num % billion === 0 ? [atomic[billion]] : [atomic[billion], 'ни']; | |
} | |
function getBetweenBillionAndTrillion(num, followUpNumber) { | |
var _a; | |
const billionsCount = num % billion != 0 ? num - (num % billion) : num / billion; | |
const billionsCountInLezgi = (_a = getHundredPlusNumCount(billionsCount)) !== null && _a !== void 0 ? _a : getCompound(billionsCount); | |
return [...billionsCountInLezgi, ' ', ...getBillionPlusBase(num + followUpNumber)]; | |
} | |
function getTrillionPlusBase(num) { | |
return num % trillion === 0 ? [atomic[trillion]] : [atomic[trillion], 'ни']; | |
} | |
function getBetweenTrillionAndQuadrillion(num, followUpNumber) { | |
var _a; | |
const trillionsCount = num % trillion != 0 ? num - (num % trillion) : num / trillion; | |
const trillionsCountInLezgi = (_a = getHundredPlusNumCount(trillionsCount)) !== null && _a !== void 0 ? _a : getCompound(trillionsCount); | |
return [...trillionsCountInLezgi, ' ', ...getTrillionPlusBase(num + followUpNumber)]; | |
} | |
function getQuadrillionPlusBase(num) { | |
return num % quadrillion === 0 ? [atomic[quadrillion]] : [atomic[quadrillion], 'ни']; | |
} | |
function getBetweenQuadrillionAndQuintillion(num, followUpNumber) { | |
var _a; | |
const quadrillionsCount = num % quadrillion != 0 ? num - (num % quadrillion) : num / quadrillion; | |
const quadrillionsCountInLezgi = (_a = getHundredPlusNumCount(quadrillionsCount)) !== null && _a !== void 0 ? _a : getCompound(quadrillionsCount); | |
return [...quadrillionsCountInLezgi, ' ', ...getQuadrillionPlusBase(num + followUpNumber)]; | |
} | |
function getQuintillionPlusBase(num) { | |
return num % quintillion === 0 ? [atomic[quintillion]] : [atomic[quintillion], 'ни']; | |
} | |
function getBetweenQuintillionAndSextillion(num, followUpNumber) { | |
var _a; | |
const quintillionsCount = num % quintillion != 0 ? num - (num % quintillion) : num / quintillion; | |
const quintillionsCountInLezgi = (_a = getHundredPlusNumCount(quintillionsCount)) !== null && _a !== void 0 ? _a : getCompound(quintillionsCount); | |
return [...quintillionsCountInLezgi, ' ', ...getQuintillionPlusBase(num + followUpNumber)]; | |
} | |
function getSextillionPlusBase(num) { | |
return num % sextillion === 0 ? [atomic[sextillion]] : [atomic[sextillion], 'ни']; | |
} | |
function getBetweenSextillionAndSeptillion(num, followUpNumber) { | |
var _a; | |
const sextillionsCount = num % sextillion != 0 ? num - (num % sextillion) : num / sextillion; | |
const sextillionsCountInLezgi = (_a = getHundredPlusNumCount(sextillionsCount)) !== null && _a !== void 0 ? _a : getCompound(sextillionsCount); | |
return [...sextillionsCountInLezgi, ' ', ...getSextillionPlusBase(num + followUpNumber)]; | |
} | |
function getSeptillionPlusBase(num) { | |
return num % septillion === 0 ? [atomic[septillion]] : [atomic[septillion], 'ни']; | |
} | |
function getBetweenSeptillionAndOctillion(num, followUpNumber) { | |
var _a; | |
const septillionsCount = num % septillion != 0 ? num - (num % septillion) : num / septillion; | |
const septillionsCountInLezgi = (_a = getHundredPlusNumCount(septillionsCount)) !== null && _a !== void 0 ? _a : getCompound(septillionsCount); | |
return [...septillionsCountInLezgi, ' ', ...getSeptillionPlusBase(num + followUpNumber)]; | |
} | |
function getOctillionPlusBase(num) { | |
return num % octillion === 0 ? [atomic[octillion]] : [atomic[octillion], 'ни']; | |
} | |
function getBetweenOctillionAndNonillion(num, followUpNumber) { | |
var _a; | |
const octillionsCount = num % octillion != 0 ? num - (num % octillion) : num / octillion; | |
const octillionsCountInLezgi = (_a = getHundredPlusNumCount(octillionsCount)) !== null && _a !== void 0 ? _a : getCompound(octillionsCount); | |
return [...octillionsCountInLezgi, ' ', ...getOctillionPlusBase(num + followUpNumber)]; | |
} | |
function getNonillionPlusBase(num) { | |
return num % nonillion === 0 ? [atomic[nonillion]] : [atomic[nonillion], 'ни']; | |
} | |
function getCompound(num) { | |
const units = separateNumberIntoUnits(num); | |
const result = units.map((unit, i) => { | |
if (i > 0 && | |
unit === 7 && | |
(units[i - 1] === 10 || | |
units[i - 1] === 30 || | |
units[i - 1] === 50 || | |
units[i - 1] === 70 || | |
units[i - 1] === 90)) { | |
return [atomic[7].slice(1)]; | |
} | |
const followUpNumber = units.slice(i + 1).reduce((acc, num) => acc + num, 0); | |
if (unit === 10) { | |
return getTenPlusBase(unit + followUpNumber); | |
} | |
if (unit === 20) { | |
return getTwentyPlusBase(unit + followUpNumber); | |
} | |
if (unit === 30) { | |
return getThirtyPlusBase(unit + followUpNumber); | |
} | |
if (unit === 40) { | |
return getFourtyPlusBase(unit + followUpNumber); | |
} | |
if (unit === 50) { | |
return getFiftyPlusBase(unit + followUpNumber); | |
} | |
if (unit === 60) { | |
return getSixtyPlusBase(unit + followUpNumber); | |
} | |
if (unit === 70) { | |
return getSeventyPlusBase(unit + followUpNumber); | |
} | |
if (unit === 80) { | |
return getEightyPlusBase(unit + followUpNumber); | |
} | |
if (unit === 90) { | |
return getNinetyPlusBase(unit + followUpNumber); | |
} | |
if (unit === 100) { | |
return getHundredPlusBase(unit + followUpNumber); | |
} | |
if (unit > 100 && unit < 1000) { | |
return getBetweenHundredAndThousand(unit, followUpNumber); | |
} | |
if (unit === 1000) { | |
return getThousandPlusBase(unit + followUpNumber); | |
} | |
if (unit > 1000 && unit < million) { | |
return getBetweenThousandAndMillion(unit, followUpNumber); | |
} | |
if (unit === million) { | |
return getMillionPlusBase(unit + followUpNumber); | |
} | |
if (unit > million && unit < billion) { | |
return getBetweenMillionAndBillion(unit, followUpNumber); | |
} | |
if (unit === billion) { | |
return getBillionPlusBase(unit + followUpNumber); | |
} | |
if (unit > billion && unit < trillion) { | |
return getBetweenBillionAndTrillion(unit, followUpNumber); | |
} | |
if (unit === trillion) { | |
return getTrillionPlusBase(unit + followUpNumber); | |
} | |
if (unit > trillion && unit < quadrillion) { | |
return getBetweenTrillionAndQuadrillion(unit, followUpNumber); | |
} | |
if (unit === quadrillion) { | |
return getQuadrillionPlusBase(unit + followUpNumber); | |
} | |
if (unit > quadrillion && unit < quintillion) { | |
return getBetweenQuadrillionAndQuintillion(unit, followUpNumber); | |
} | |
if (unit === quintillion) { | |
return getQuintillionPlusBase(unit + followUpNumber); | |
} | |
if (unit > quintillion && unit < sextillion) { | |
return getBetweenQuintillionAndSextillion(unit, followUpNumber); | |
} | |
if (unit === sextillion) { | |
return getSextillionPlusBase(unit + followUpNumber); | |
} | |
if (unit > sextillion && unit < septillion) { | |
return getBetweenSextillionAndSeptillion(unit, followUpNumber); | |
} | |
if (unit === septillion) { | |
return getSeptillionPlusBase(unit + followUpNumber); | |
} | |
if (unit > septillion && unit < octillion) { | |
return getBetweenSeptillionAndOctillion(unit, followUpNumber); | |
} | |
if (unit === octillion) { | |
return getOctillionPlusBase(unit + followUpNumber); | |
} | |
if (unit > octillion && unit < nonillion) { | |
return getBetweenOctillionAndNonillion(unit, followUpNumber); | |
} | |
if (unit === nonillion) { | |
return getNonillionPlusBase(unit + followUpNumber); | |
} | |
return units.length > 1 && unit === 0 ? [''] : [atomic[unit] || unit.toString()]; | |
}); | |
return result.flat(); //.join('').replaceAll(' ', ' ').trim(); | |
} | |
function getAtomicOrCompound(num) { | |
if (atomic[num]) { | |
return [atomic[num]]; | |
} | |
else { | |
return getCompound(num); | |
} | |
} | |
function numToLezgiArray(num) { | |
if (isNaN(num)) { | |
throw new Error('Provided value is not a number'); | |
} | |
if (!Number.isInteger(num)) { | |
throw new Error('Provided number is not an integer. Currently only integers are supported!'); | |
} | |
const isNegative = num < 0; | |
num = Math.abs(num); | |
const result = getAtomicOrCompound(num) | |
.filter((word) => word !== '') | |
.map((word) => (word.endsWith('ни') ? [word, ' '] : word)) | |
.flat(); | |
return isNegative ? [MINUS, ' ', ...result] : result; | |
} | |
function numToLezgi(num) { | |
const resultArray = numToLezgiArray(num); | |
return (resultArray | |
// .map((word) => (word.endsWith('ни') || word === MINUS ? word + ' ' : word)) | |
.join('') | |
.replaceAll(' ', ' ') | |
.trim()); | |
} | |
function replaceNumbersWithWords(inputString) { | |
return inputString.replaceAll(/\d+/g, (num) => numToLezgi(parseInt(num, 10))); | |
} | |
console.log(replaceNumbersWithWords(input_text)) | |
return replaceNumbersWithWords(input_text) | |
}''' | |