-
Notifications
You must be signed in to change notification settings - Fork 266
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: Conclusão do Desafio 9 - @JamesStewart-314 (#1153)
* feat: Conclusão do Desafio 9 - @JamesStewart-314 * docs: README criado * refactor: Aperfeiçoamento da lógica de validação dos números * docs: Correção da anotação de tipagem --------- Co-authored-by: Allber Fellype <[email protected]>
- Loading branch information
1 parent
0858fa8
commit 24368d5
Showing
3 changed files
with
111 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
18545f3962b7e6cf084f2f5dc9ab4ad54 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
# Desafio 9 - Big Base! | ||
![Python](https://img.shields.io/badge/Python-512BD4?style=flat&logo=python&logoColor=yellow) | ||
![VS Code](https://img.shields.io/badge/VScode-007ACC?style=flat&logo=visualstudiocode&logoColor=white) | ||
|
||
## Descrição do Projeto: | ||
Este código efetua a leitura de um arquivo contendo uma lista de três informações em cada | ||
linha: `base_entrada`, `base_saída` e `número_entrada`. O objetivo consiste em converter o | ||
número fornecido `número_entrada`, inicialmente na base `base_entrada`, para a nova base | ||
`base_saída` e exibir o resultado da conversão no terminal. | ||
|
||
**Exemplo de Conteúdo do Arquivo:** | ||
``` | ||
10 16 1500 | ||
36 10 GOODBYE | ||
36 16 HELLOWORLD | ||
10 2 32452867 | ||
2 10 1234 | ||
``` | ||
|
||
**Exemplo de Saída Esperada:** | ||
``` | ||
5DC | ||
36320638406 | ||
647B8839EB1B1 | ||
1111011110011000100000011 | ||
??? | ||
``` | ||
|
||
## Requisitos para Execução | ||
- Possuir um ambiente virtual Python instalado localmente em sua máquina com a | ||
versão `3.10` ou superior. | ||
|
||
Para baixar esta e outras versões, visite o site | ||
<a target="_blank" href="https://www.python.org/downloads/" style="color: lightgreen">Python.org</a> | ||
e siga os procedimentos de instalação para o | ||
seu sistema operacional. | ||
|
||
Após a instalação, abra o terminal de comando em sua máquina e digite o comando | ||
`python --version`. O comando deverá informar a versão atual do interpretador de | ||
Python caso o download tenha sido feito corretamente. Certifique-se de possuir uma | ||
versão igual ou superior à `3.10`, caso contrário, o código não funcionará. | ||
|
||
## Instruções para Executar o Código | ||
- Certificando-se de ter instalado corretamente o `Python` em sua | ||
máquina, abra o terminal de comando e navegue até o diretório contendo o arquivo | ||
`"solution.py"`. Em seguida, digite `python solution.py` | ||
e os resultados deverão ser impressos de maneira formatada na CLI. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,63 @@ | ||
import os | ||
import string | ||
from collections import deque | ||
from typing import Final | ||
|
||
number_base_symbols: str = string.digits + string.ascii_uppercase + string.ascii_lowercase | ||
number_base_symbols_mapping: dict[str, int] = {key: value for value, key\ | ||
in enumerate(number_base_symbols)} | ||
|
||
UPPERLIMIT: Final[int] = 62 ** 30 - 1 | ||
|
||
def check_base(x: int) -> bool: | ||
return x < 2 or x > 62 | ||
|
||
def from_decimal_to(number_to_convert: int, new_base: int) -> str: | ||
string_builder: deque[str] = deque() | ||
|
||
while (division_result := divmod(number_to_convert, new_base))[0] != 0: | ||
string_builder.appendleft(number_base_symbols[division_result[1]]) | ||
number_to_convert = division_result[0] | ||
|
||
string_builder.appendleft(number_base_symbols[division_result[1]]) | ||
|
||
return ''.join(string_builder) | ||
|
||
|
||
def to_decimal_from(number_to_convert: str, number_base: int) -> int: | ||
total_sum: int = 0 | ||
number_size: int = len(number_to_convert) | ||
|
||
for index in range(number_size - 1, -1, -1): | ||
total_sum += number_base_symbols_mapping[number_to_convert[index]] * \ | ||
(number_base ** (number_size - index - 1)) | ||
|
||
return total_sum | ||
|
||
def validate_number_input(current_number: str, start_base_num: int, end_base_num: int) -> bool: | ||
if any((current_number[0] == '-', *map(check_base, (start_base_num, end_base_num)))): | ||
return False | ||
|
||
if any(map(lambda x: number_base_symbols_mapping[x] >= start_base_num,\ | ||
current_number.lstrip('-'))): | ||
return False | ||
|
||
return True | ||
|
||
if __name__ == '__main__': | ||
with open(os.path.join(os.path.dirname(__file__), 'baseconv.txt'), 'r') as bases_file: | ||
for line in bases_file: | ||
start_base, end_base, number = line.strip().split() | ||
start_base, end_base = map(int, (start_base, end_base)) | ||
|
||
if not validate_number_input(number, start_base, end_base): | ||
print('???') | ||
continue | ||
|
||
number_converted_to_decimal_base: int = to_decimal_from(number, start_base) | ||
|
||
if number_converted_to_decimal_base > UPPERLIMIT: | ||
print('???') | ||
continue | ||
|
||
print(from_decimal_to(number_converted_to_decimal_base, end_base)) |