Skip to content

Commit 105b8f1

Browse files
committed
[Feature] Added convert base function.
1 parent a36bc3d commit 105b8f1

File tree

3 files changed

+49
-0
lines changed

3 files changed

+49
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ Different algorithmic programs. Grouped by general topic.
7373
#### Mathematical Algorithms
7474
* [Fibonacci](algorithms/math/fibonacci.py)
7575
* [Factorial](algorithms/math/factorial.py)
76+
* [Convert Base](algorithms/math/convert_base.py)
7677

7778
#### String Based Algorithms
7879
* [Fizz Buzz](algorithms/string/fizz_buzz.py)

algorithms/math/convert_base.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
def convert_base(val: str, base: int):
2+
if base < 0 or (base > 10 and base !=16):
3+
return -1
4+
value = 0
5+
for i, digit in enumerate(val):
6+
digit_val = convert_digit_to_int(digit)
7+
if digit_val < 0 or digit_val > base:
8+
return -1
9+
# print(digit_val, base ** (len(val)-i-1))
10+
value += digit_val * (base ** (len(val)-i-1))
11+
return value
12+
13+
14+
def convert_digit_to_int(char: str):
15+
if len(char) != 1 or ord(char) > ord('f'):
16+
return -1
17+
return int(char,16)

tests/test_convert_base.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import unittest
2+
from algorithms.math.convert_base import convert_base, convert_digit_to_int
3+
4+
class TestConvertBase(unittest.TestCase):
5+
6+
def test_convert_digit_valid(self):
7+
for i in range(10):
8+
self.assertEqual(i, convert_digit_to_int(str(i)))
9+
for c,v in [('a',10),('b',11),('c',12),('d',13),('e',14),('f',15)]:
10+
self.assertEqual(v, convert_digit_to_int(c))
11+
for c in 'ghijklmnopqrstuvwxyz':
12+
self.assertEqual(-1, convert_digit_to_int(c))
13+
14+
def test_convert_base_2(self):
15+
self.assertEqual(5, convert_base('101',2))
16+
self.assertEqual(11,convert_base('1011',2))
17+
18+
def test_convert_base_10(self):
19+
self.assertEqual(20, convert_base('20',10))
20+
self.assertEqual(135, convert_base('135',10))
21+
self.assertEqual(7, convert_base('7',10))
22+
23+
def test_convert_base_16(self):
24+
self.assertEqual(int('4e',16), convert_base('4e',16))
25+
26+
def test_convert_base_outside_range(self):
27+
self.assertEqual(-1, convert_base('63',4))
28+
29+
def test_convert_base_invalid_base(self):
30+
self.assertEqual(-1, convert_base('101',-3))
31+
self.assertEqual(-1, convert_base('101', 12))

0 commit comments

Comments
 (0)