( stringInBaseOne, baseOneCharacterString, baseTwoCharacterString )
| 71 | * @returns {string} |
| 72 | */ |
| 73 | const convertArbitraryBaseBigIntVersion = ( |
| 74 | stringInBaseOne, |
| 75 | baseOneCharacterString, |
| 76 | baseTwoCharacterString |
| 77 | ) => { |
| 78 | if ( |
| 79 | [stringInBaseOne, baseOneCharacterString, baseTwoCharacterString] |
| 80 | .map((arg) => typeof arg) |
| 81 | .some((type) => type !== 'string') |
| 82 | ) { |
| 83 | throw new TypeError('Only string arguments are allowed') |
| 84 | } |
| 85 | |
| 86 | const baseOneCharacters = [...baseOneCharacterString] |
| 87 | const baseTwoCharacters = [...baseTwoCharacterString] |
| 88 | |
| 89 | for (const charactersInBase of [baseOneCharacters, baseTwoCharacters]) { |
| 90 | if (charactersInBase.length !== new Set(charactersInBase).size) { |
| 91 | throw new TypeError( |
| 92 | 'Duplicate characters in character set are not allowed' |
| 93 | ) |
| 94 | } |
| 95 | } |
| 96 | const reversedStringOneChars = [...stringInBaseOne].reverse() |
| 97 | const stringOneBase = BigInt(baseOneCharacters.length) |
| 98 | let value = 0n |
| 99 | let placeValue = 1n |
| 100 | for (const digit of reversedStringOneChars) { |
| 101 | const digitNumber = BigInt(baseOneCharacters.indexOf(digit)) |
| 102 | if (digitNumber === -1n) { |
| 103 | throw new TypeError(`Not a valid character: ${digit}`) |
| 104 | } |
| 105 | value += digitNumber * placeValue |
| 106 | placeValue *= stringOneBase |
| 107 | } |
| 108 | const outputChars = [] |
| 109 | const stringTwoBase = BigInt(baseTwoCharacters.length) |
| 110 | while (value > 0n) { |
| 111 | const divisionResult = value / stringTwoBase |
| 112 | const remainder = value % stringTwoBase |
| 113 | outputChars.push(baseTwoCharacters[remainder]) |
| 114 | value = divisionResult |
| 115 | } |
| 116 | return outputChars.reverse().join('') || baseTwoCharacters[0] |
| 117 | } |
| 118 | |
| 119 | export { convertArbitraryBase, convertArbitraryBaseBigIntVersion } |
no test coverage detected