Repository: TheAlgorithms/Python

Issue:
Delete base85 algorithm
### Describe your change:
Re #6216

Normally, I'm not in favour of just deleting algorithms, but I would make the argument that this is not an algorithm, rather just a snippet of code that utilises another library.

Per `CONTRIBTUING.md`
> Algorithms in this repo should not be how-to examples for existing Python packages. Instead, they should perform internal calculations or manipulations to convert input values into different output values
This `base85` algorithm has essentially got two lines of code that purely utilise a singular library. The doctests only test an external library

This repository should not contains examples on how to use a certain library, that would be the library documentation here
https://docs.python.org/3/library/base64.html


* [ ] Add an algorithm?
* [ ] Fix a bug or typo in an existing algorithm?
* [ ] Documentation change?
* [x] Delete an algorithm

### Checklist:
* [x] I have read [CONTRIBUTING.md](https://github.com/TheAlgorithms/Python/blob/master/CONTRIBUTING.md).
* [x] This pull request is all my own work -- I have not plagiarized.
* [x] I know that pull requests will not be merged if they fail the automated tests.
* [x] This PR only changes one algorithm file.  To ease review, please open separate PRs for separate algorithms.
* [x] All new Python files are placed inside an existing directory.
* [x] All filenames are in all lowercase characters with no spaces or dashes.
* [x] All functions and variable names follow Python naming conventions.
* [x] All function parameters and return values are annotated with Python [type hints](https://docs.python.org/3/library/typing.html).
* [x] All functions have [doctests](https://docs.python.org/3/library/doctest.html) that pass the automated testing.
* [x] All new algorithms include at least one URL that points to Wikipedia or another similar explanation.
* [x] If this pull request resolves one or more open issues then the description above includes the issue number(s) with a [closing keyword](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue): "Fixes #ISSUE-NUMBER".



Discussion:
@tianyizheng02 Opinion?

Will also create a pr to delete 
https://github.com/TheAlgorithms/Python/blob/master/ciphers/base32.py

However, I like the [base16](https://github.com/TheAlgorithms/Python/blob/master/ciphers/base16.py) and the [base64](https://github.com/TheAlgorithms/Python/blob/master/ciphers/base64.py) because they actually use calculations, not a library

Also very open to further implementations of `base32` and `base85`, just an actual algorithm that does not solely use a library
Obviously I agree that we can't have this "algorithm" simply utilize a library, but personally I'd rather we keep the file around and encourage other contributors to reimplement the algorithm instead. Unless one of us reimplements the algorithm right after this file is deleted, there's no guarantee that someone else will contribute the same algorithm again. Having the file around could at least serve as a reminder of an ongoing issue.

Resolving patch:
diff --git a/ciphers/base32.py b/ciphers/base32.py
--- a/ciphers/base32.py
+++ b/ciphers/base32.py
@@ -1,42 +1,45 @@
-import base64
+"""
+Base32 encoding and decoding
 
+https://en.wikipedia.org/wiki/Base32
+"""
+B32_CHARSET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"
 
-def base32_encode(string: str) -> bytes:
+
+def base32_encode(data: bytes) -> bytes:
     """
-    Encodes a given string to base32, returning a bytes-like object
-    >>> base32_encode("Hello World!")
+    >>> base32_encode(b"Hello World!")
     b'JBSWY3DPEBLW64TMMQQQ===='
-    >>> base32_encode("123456")
+    >>> base32_encode(b"123456")
     b'GEZDGNBVGY======'
-    >>> base32_encode("some long complex string")
+    >>> base32_encode(b"some long complex string")
     b'ONXW2ZJANRXW4ZZAMNXW24DMMV4CA43UOJUW4ZY='
     """
-
-    # encoded the input (we need a bytes like object)
-    # then, b32encoded the bytes-like object
-    return base64.b32encode(string.encode("utf-8"))
+    binary_data = "".join(bin(ord(d))[2:].zfill(8) for d in data.decode("utf-8"))
+    binary_data = binary_data.ljust(5 * ((len(binary_data) // 5) + 1), "0")
+    b32_chunks = map("".join, zip(*[iter(binary_data)] * 5))
+    b32_result = "".join(B32_CHARSET[int(chunk, 2)] for chunk in b32_chunks)
+    return bytes(b32_result.ljust(8 * ((len(b32_result) // 8) + 1), "="), "utf-8")
 
 
-def base32_decode(encoded_bytes: bytes) -> str:
+def base32_decode(data: bytes) -> bytes:
     """
-    Decodes a given bytes-like object to a string, returning a string
     >>> base32_decode(b'JBSWY3DPEBLW64TMMQQQ====')
-    'Hello World!'
+    b'Hello World!'
     >>> base32_decode(b'GEZDGNBVGY======')
-    '123456'
+    b'123456'
     >>> base32_decode(b'ONXW2ZJANRXW4ZZAMNXW24DMMV4CA43UOJUW4ZY=')
-    'some long complex string'
+    b'some long complex string'
     """
-
-    # decode the bytes from base32
-    # then, decode the bytes-like object to return as a string
-    return base64.b32decode(encoded_bytes).decode("utf-8")
+    binary_chunks = "".join(
+        bin(B32_CHARSET.index(_d))[2:].zfill(5)
+        for _d in data.decode("utf-8").strip("=")
+    )
+    binary_data = list(map("".join, zip(*[iter(binary_chunks)] * 8)))
+    return bytes("".join([chr(int(_d, 2)) for _d in binary_data]), "utf-8")
 
 
 if __name__ == "__main__":
-    test = "Hello World!"
-    encoded = base32_encode(test)
-    print(encoded)
+    import doctest
 
-    decoded = base32_decode(encoded)
-    print(decoded)
+    doctest.testmod()


Test patch: