Skip to content

Commit

Permalink
feat: Conclusão do Desafio 9 - @JamesStewart-314 (#1153)
Browse files Browse the repository at this point in the history
* 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
JamesStewart-314 and Allber Fellype authored Nov 28, 2024
1 parent 0858fa8 commit 24368d5
Show file tree
Hide file tree
Showing 3 changed files with 111 additions and 0 deletions.
1 change: 1 addition & 0 deletions desafio-09/JamesStewart-314/python/.valid
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
18545f3962b7e6cf084f2f5dc9ab4ad54
47 changes: 47 additions & 0 deletions desafio-09/JamesStewart-314/python/README.md
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.
63 changes: 63 additions & 0 deletions desafio-09/JamesStewart-314/python/solution.py
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))

0 comments on commit 24368d5

Please sign in to comment.