Skip to content

Commit 43524fb

Browse files
committed
-
1 parent e7b00ab commit 43524fb

File tree

3 files changed

+46
-1
lines changed

3 files changed

+46
-1
lines changed

source_py3/python_toolbox/number_encoding.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,34 @@
55

66

77
class NumberEncoder:
8+
'''
9+
A very simple encoders between lines and strings.
10+
11+
Example:
12+
13+
>>> my_encoder = number_encoding.NumberEncoder('isogram')
14+
>>> my_encoder.encode(10000)
15+
'rssir'
16+
>>> my_encoder.encode(10000000)
17+
'saimmmgrg'
18+
>>> my_encoder.decode('saimmmgrg')
19+
10000000
20+
21+
'''
822
def __init__(self, characters):
923
self.characters = \
1024
sequence_tools.ensure_iterable_is_immutable_sequence(characters)
1125
recurrences = sequence_tools.get_recurrences(self.characters)
1226
if recurrences:
1327
raise Exception('`characters` must not have recurring characters.')
1428

15-
def encode(number, minimum_length=1):
29+
def encode(self, number, minimum_length=1):
30+
'''
31+
Encode the number into a string.
32+
33+
If `minimum_length > 1`, the string will be padded (with the "zero"
34+
character) if the number isn't big enough.
35+
'''
1636
current_number = number
1737
result = ''
1838
while current_number:
@@ -24,6 +44,12 @@ def encode(number, minimum_length=1):
2444
return result
2545

2646
def decode(self, string):
47+
'''Decode `string` into a number'''
48+
2749
assert isinstance(string, (str, bytes))
2850
return sum((len(self.characters)**i) * self.characters.index(x)
2951
for (i, x) in enumerate(string[::-1]))
52+
53+
def __repr__(self):
54+
return '<%s: %s>' % (type(self).__name__, repr(self.characters))
55+

source_py3/test_python_toolbox/test_number_encoding/__init__.py

Whitespace-only changes.
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Copyright 2009-2015 Ram Rachum.
2+
# This program is distributed under the MIT license.
3+
4+
from python_toolbox import cute_testing
5+
from python_toolbox import number_encoding
6+
7+
numbers = (234123, 63435, 2222, 643534, 34, 233)
8+
9+
def test_number_encoding():
10+
my_encoder = number_encoding.NumberEncoder('isogram')
11+
12+
for number in numbers:
13+
string = my_encoder.encode(number)
14+
assert my_encoder.decode(string) == number
15+
assert set(string) <= set(my_encoder.characters)
16+
17+
padded_string = my_encoder.encode(number, 100)
18+
assert len(padded_string) >= 100
19+
assert padded_string.endswith(string)

0 commit comments

Comments
 (0)