Skip to main content
5 of 11
Changed opening from implying this was a first of it's kind, to clarifying the difference
Mwr247
  • 3.6k
  • 18
  • 39

Base Conversion With Strings

#Introduction

We've have a few base conversion challenges here in the past, but not many designed to tackle arbitrary length numbers (that is to say, numbers that are long enough that they overflow the integer datatype), and of those, most felt a little complicated. I'm curious how golfed down a change of base code like this can get.

#Challenge

Write a program or function in the language of your choice that can convert a string of one base to a string of another base. Input should be the number to be converted (string), from-base (base-10 integer), to-base (base-10 integer), and the character set (string). Output should be the converted number (string).

Some further details and rules are as follows:

  • The number to be converted will be a non-negative integer (since - and . may be in the character set). So too will be the output.
  • Leading zeroes (the first character in the character set) should be trimmed.
  • The minimum supported base range is from 2 to 95, consisting of the printable ascii characters.
  • The input for the number to be converted, the character set, and the output must all be of the string datatype. The bases must be of the base-10 integer datatype (or integer floats).
  • The length of the input number string can be very large. It's hard to quantify a sensible minimum, but expect it to be able to handle at least 1000 characters, and complete 100 characters input in less than 10 seconds on a decent machine (very generous for this sort of problem, but I don't want speed to be the focus).
  • You cannot use built in change-of-base functions to convert the entire input string/number at once (not sure if a language has this, but here just in case).
  • The character set must be able to handle any character arrangement.
  • Characters in the character set must be unique. Conversion to a base and back must be deterministic and one-to-one for value.
  • Naturally, the length of the character set (when input) must be greater than or equal to the size of the larger base, and must at least contain the set of characters found in the string to be converted. Likewise, the input and output number strings must only contain characters found within the character set.
  • We shall assume that only valid input will be accepted. Don't worry about error handling.

The winner will be determined by the shortest code that accomplishes the criteria. They will be selected in at least 7 base-10 days, or if/when there have been enough submissions. In the event of a tie, the code that runs faster will be the winner. If close enough in speed/performance, the answer that came earlier wins.

#Examples

Here's a few examples of input and output that your code should be able to handle:

F("1010101", 2, 10, "0123456789")
> 85

F("0001010101", 2, 10, "0123456789")
> 85

F("85", 10, 2, "0123456789")
> 1010101

F("1010101", 10, 2, "0123456789")
> 11110110100110110101

F("bababab", 2, 10, "abcdefghij")
> if

F("10", 3, 2, "0123456789")
> 11

F("<('.'<)(v'.'v)(>'.'>)(^'.'^)", 31, 2, "~!@#$%^&*()_+-=`[]{}|';:,./<>? ")
> !~!!!~~!~!!!~~~~!!!!~!~~!~!~~~~~~!!!~~!~~~!!~~~~!~~~!!~~~~~~~!~!~~!~!~~!~!!~~~~!~~!~!!!!~!~!~~!~~~!~~~~!~~!~!!!!!!~!!~~!!~!~~~~~!!~!!~~~~~~

F("~~~~~~~~~~", 31, 2, "~!@#$%^&*()_+-=`[]{}|';:,./<>? ")
> ~

F("9876543210123456789", 10, 36, "0123456789abcdefghijklmnopqrstuvwxyz")
> 231ceddo6msr9

F("ALLYOURBASEAREBELONGTOUS", 62, 10, "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
> 1673258303784773936466602397800821

F("howmuchwoodcouldawoodchuckchuckifawoodchuckcouldchuckwood", 36, 95, "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ~`!@#$%^&*()_-+=[{]}\\|;:'\",<.>/? ")
> o3K9e(r_lgal0$;?w0[`<$n~</SUk(r#9W@."0&}_2?[n

F("1100111100011010101010101011001111011010101101001111101000000001010010100101111110000010001001111100000001011000000001001101110101", 2, 95, "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ~`!@#$%^&*()_-+=[{]}\\|;:'\",<.>/? ")
> this is much shorter
Mwr247
  • 3.6k
  • 18
  • 39