|
| 1 | +/** |
| 2 | +* Converts a string from one base to other |
| 3 | +* @param {string} stringInBaseOne String in input base |
| 4 | +* @param {string} baseOneCharacters Character set for the input base |
| 5 | +* @param {string} baseTwoCharacters Character set for the output base |
| 6 | +* @returns {string} |
| 7 | +*/ |
| 8 | +const convertArbitraryBase = (stringInBaseOne, baseOneCharacters, baseTwoCharacters) => { |
| 9 | + if ([stringInBaseOne, baseOneCharacters, baseTwoCharacters].map(arg => typeof arg).some(type => type !== 'string')) { |
| 10 | + throw new TypeError('Only string arguments are allowed') |
| 11 | + } |
| 12 | + [baseOneCharacters, baseTwoCharacters].forEach(baseString => { |
| 13 | + const charactersInBase = [...baseString] |
| 14 | + if (charactersInBase.length !== new Set(charactersInBase).size) { |
| 15 | + throw new TypeError('Duplicate characters in character set are not allowed') |
| 16 | + } |
| 17 | + }) |
| 18 | + const reversedStringOneChars = [...stringInBaseOne].reverse() |
| 19 | + const stringOneBase = baseOneCharacters.length |
| 20 | + let value = 0 |
| 21 | + let placeValue = 1 |
| 22 | + for (const digit of reversedStringOneChars) { |
| 23 | + const digitNumber = baseOneCharacters.indexOf(digit) |
| 24 | + if (digitNumber === -1) { |
| 25 | + throw new TypeError(`Not a valid character: ${digit}`) |
| 26 | + } |
| 27 | + value += (digitNumber * placeValue) |
| 28 | + placeValue *= stringOneBase |
| 29 | + } |
| 30 | + let stringInBaseTwo = '' |
| 31 | + const stringTwoBase = baseTwoCharacters.length |
| 32 | + while (value > 0) { |
| 33 | + const remainder = value % stringTwoBase |
| 34 | + stringInBaseTwo = baseTwoCharacters.charAt(remainder) + stringInBaseTwo |
| 35 | + value /= stringTwoBase |
| 36 | + } |
| 37 | + const baseTwoZero = baseTwoCharacters.charAt(0) |
| 38 | + return stringInBaseTwo.replace(new RegExp(`^${baseTwoZero}+`), '') |
| 39 | +} |
| 40 | + |
| 41 | +(() => { |
| 42 | + console.log(convertArbitraryBase('98', '0123456789', '01234567')) |
| 43 | + console.log(convertArbitraryBase('98', '0123456789', 'abcdefgh')) |
| 44 | + console.log(convertArbitraryBase('129', '0123456789', '01234567')) |
| 45 | +})() |
0 commit comments