baseAnything - encode/decode any integer into/from a series of symbols of a custom palette.
Project description
baseAnything
What
A library for encoding integers into a series of symbols. The symbols can be anything. And it decodes too, of course.
Testing
Run test.py
.
Howto
Install it (eg pip install baseAnything
), and then from baseAnything import baseX
.
Examples, from the doctests:
Basic use
>>> bxbinary = baseX('01') # Instantiates a baseX object with a Base-2 aka binary string-symbol alphabet
>>> bxbinary % 7
'111'
Proof: A roundtrip
>>> bxhexadecimal = baseX('0123456789ABCDEF') # Base-16 aka hexadecimal
>>> 9000 == int(bxhexadecimal % 9000, base=16)
True
Arbitrary symbols
One can use arbitrary symbols. Anything. ['bla', 2, object(), object()]
is a valid symbol alphabet.
It may be desirable to get a symbol list back rather than a string, so that the symbol framing is kept
intact — because, for instance, a symbol alphabet of ['a', 'aa']
yields ambiguity in its output when it's
mashed into a string; 'aaa'
has 3 possible interpretations.
The %
operator yields strings when encoding an integer.
The /
operator makes a baseX object return the encoding as a list of symbols instead.
>>> bxfunky = baseX(['Do', 'Re', 'Mi', 'Fa', 'Sol', 'La', 'Ti'])
>>> bxfunky % 10 # Emits a warning, because the result may not be decodable!
'ReFa'
>>> bxfunky / 10 # Symbols returned as a list rather than concatenated into a string.
['Re', 'Fa']
>>> 10 == bxfunky / (bxfunky / 10)
True
Bizarre encodings
Speaking of arbitrary symbols... how about this visually compact encoding:
>>> bxbizarre = baseX(list(map(chr, range(0x0300, 0x036f)))) # unicode diacritical marks
>>> wut = 'O' + bxbizarre % 1234567890
>>> wut
'Ơ̡͎̈̎'
>>> bxbizarre / wut[1:]
1234567890
I don't like the operator overloading interface
Then use baseX.decode(input: Sequence)
and baseX.encode(num: int)
.
Bugs
There are problems when using large numbers.
>>> base22 = baseX(list(range(22)))
>>> largenumber = (base22 / base22.alphabet) # that's 774212873841767703847271481
>>> base22 / (base22 / largenumber) == largenumber
False # But it should be true.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for baseAnything-0.1.0-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | f250fc873ccd679b69f6ceb691bd9e0e26bbcacf9cc36074d183ea8a386a158a |
|
MD5 | cd0b4d0b6758e624aa97218f1ea6159c |
|
BLAKE2b-256 | 34b3a5f1025d3f456a8ff7adaf0b6ce4e3a453c7ceee83037f641a4930ba18de |