xxx_coder_noscope
xxx_coder_noscope

Reputation: 85

Encode numbers with letters with fixed lentgh?

I have two unique numbers, 100000 - 999999 (fixed 6 chars length [0-9]), second 1000000 - 9999999 (fixed 7 char length [0-9]). How can i encode/decode this numbers (they need to remain separate after decoding), using only uppercase letters [A-Z] and [0-9] digits and have a fixed length of 8 chars in total?

Example:

input -> num_1: 242404, num_2 : 1002000

encode -> AX3B O3XZ

decode -> 2424041002000

Is there any algorithm for this type of problem?

Upvotes: 0

Views: 292

Answers (1)

Peter
Peter

Reputation: 31701

This is just a simple mapping from one set of values to another set of values. The procedure is always the same:

  • List all possible input and output values.
  • Find the index of the input.
  • Return the value of the output list at that index.

Note that it's often not necessary to make an actual list (i.e. loading all values into some data structure). You can typically compute the value for any index on-demand. This case is no different.

Imagine a list of all possible input pairs:

0    100'000, 1'000'000
1    100'000, 1'000'001
2    100'000, 1'000'002
...
K    100'000, 9'999'999
K+1  100'001, 1'000'000
K+2  100'001, 1'000'001
...
N-1  999'999, 9'999'998
N    999'999, 9'999'999

For any given pair (a, b), you can compute its index i in this list like so:

// Make a and b zero-based
a -= 100'000
b -= 1'000'000

i = a*1'000'000 + b

Convert i to base 36 (A-Z and 0-9 gives you 36 symbols), pad on the left with zeros as necessary1, and insert a space after the fourth digit.

encoded = addSpace(zeroPad(base36(i)))

To get back to the input pair:

Convert the 8-character base 36 string to base 10 (this is the index into the list, remember), then derive a and b from the index.

i = base10(removeSpace(encoded))

a = i/1'000'000 + 100'000    // integer divison (i.e. ignore remainder)
b = i%1'000'000 + 1'000'000

Here is an implementation in Go: https://play.golang.org/p/KQu9Hcoz5UH


1 If you don't like the idea of zero padding you can also offset i at this point. The target set of values is plenty big enough, you need only about 32% of all base 36 numbers with eight digits or less.

Upvotes: 1

Related Questions