Skip to content

Instantly share code, notes, and snippets.

@drewdomi
Created January 15, 2026 15:39
Show Gist options
  • Select an option

  • Save drewdomi/4c47dcbea2317ae56649cfe27e040f7b to your computer and use it in GitHub Desktop.

Select an option

Save drewdomi/4c47dcbea2317ae56649cfe27e040f7b to your computer and use it in GitHub Desktop.

Conversão de Bases Numéricas Customizadas

Índice

  1. Fundamentos de Bases Numéricas
  2. O Exercício add_chelou
  3. Mapeamento das Bases
  4. Algoritmo de Conversão
  5. Exemplos Resolvidos
  6. Implementação em Shell
  7. Referências

1. Fundamentos de Bases Numéricas

1.1 O que é uma base numérica?

Uma base numérica define quantos símbolos distintos usamos para representar números. Cada posição em um número tem um peso que é uma potência da base.

1.2 Base 10 (Sistema Decimal)

O sistema que usamos no dia a dia:

2345₁₀ = 2×10³ + 3×10² + 4×10¹ + 5×10⁰
       = 2×1000 + 3×100 + 4×10 + 5×1
       = 2000 + 300 + 40 + 5
       = 2345
Posição 3 2 1 0
Dígito 2 3 4 5
Peso 10³ 10² 10¹ 10⁰
Valor 1000 100 10 1

1.3 Fórmula Geral

Para qualquer base B:

número = dₙ×Bⁿ + dₙ₋₁×Bⁿ⁻¹ + ... + d₁×B¹ + d₀×B⁰

Onde:

  • dᵢ = dígito na posição i
  • B = base numérica
  • n = número de dígitos - 1

1.4 Tabela de Potências

Potência Base 2 Base 5 Base 10 Base 13 Base 16
x⁰ 1 1 1 1 1
2 5 10 13 16
4 25 100 169 256
8 125 1000 2197 4096
x⁴ 16 625 10000 28561 65536
x⁵ 32 3125 100000 371293 1048576
x⁶ 64 15625 1000000 4826809 16777216
x⁷ 128 78125 10000000 62748517 268435456

2. O Exercício add_chelou

2.1 Enunciado

Escreva uma linha de comando que:

  • Recebe números de FT_NBR1 na base '"?!
  • Recebe números de FT_NBR2 na base mrdoc
  • Exibe a soma na base gtaio luSnemf

2.2 Fluxo de Dados

FT_NBR1 (base '\"?!)  →  [mapear '\"?!  → 01234]  →  converter base 5 → 10
                                                              ↓
FT_NBR2 (base mrdoc)  →  [mapear mrdoc → 01234]  →  converter base 5 → 10
                                                              ↓
                                                          SOMAR (decimal)
                                                              ↓
                                                  converter base 10 → 13
                                                              ↓
                                          [mapear 0-12 → gtaio luSnemf]
                                                              ↓
                                                          RESULTADO

3. Mapeamento das Bases

3.1 Base de FT_NBR1: '\"?! (base 5)

Caractere Valor Descrição
' 0 Aspas simples
\ 1 Barra invertida
" 2 Aspas duplas
? 3 Interrogação
! 4 Exclamação

3.2 Base de FT_NBR2: mrdoc (base 5)

Caractere Valor
m 0
r 1
d 2
o 3
c 4

3.3 Base de Saída: gtaio luSnemf (base 13)

Valor Caractere Observação
0 g
1 t
2 a
3 i
4 o
5 ESPAÇO
6 l
7 u
8 S Maiúsculo
9 n
10 e
11 m
12 f

Atenção: A posição 5 é um espaço em branco, não um caractere visível.


4. Algoritmo de Conversão

4.1 Conversão Base Qualquer → Base 10

Algoritmo:

  1. Identifique cada dígito dᵢ (da direita para a esquerda, começando em i=0)
  2. Calcule: resultado = Σ(dᵢ × baseⁱ)

Exemplo: 423₅ para base 10

423₅ = 4×5² + 2×5¹ + 3×5⁰
     = 4×25 + 2×5 + 3×1
     = 100 + 10 + 3
     = 113₁₀

4.2 Conversão Base 10 → Base Qualquer

Algoritmo (divisão sucessiva):

  1. Divida o número N pela base B
  2. Guarde o resto
  3. Atualize N = quociente
  4. Repita até N = 0
  5. Inverta a sequência de restos

Exemplo: 113₁₀ para base 5

113 ÷ 5 = 22  resto 3
22 ÷ 5 = 4   resto 2
4 ÷ 5 = 0   resto 4

Restos (invertidos): 4, 2, 3  →  423₅

4.3 Pseudocódigo Completo

FUNÇÃO converter_e_somar(FT_NBR1, FT_NBR2):
    
    // Etapa 1: Mapear caracteres customizados → dígitos 0-4
    nbr1_base5 = mapear(FT_NBR1, "'\"?!" → "01234")
    nbr2_base5 = mapear(FT_NBR2, "mrdoc" → "01234")
    
    // Etapa 2: Converter base 5 → base 10
    decimal1 = converter_para_base10(nbr1_base5, base=5)
    decimal2 = converter_para_base10(nbr2_base5, base=5)
    
    // Etapa 3: Somar em decimal
    soma = decimal1 + decimal2
    
    // Etapa 4: Converter base 10 → base 13
    resultado_base13 = converter_para_base13(soma)
    
    // Etapa 5: Mapear dígitos 0-12 → caracteres customizados
    resultado_final = mapear(resultado_base13, "0123456789ABC" → "gtaio luSnemf")
    
    RETORNAR resultado_final

5. Exemplos Resolvidos

5.1 Exemplo 1: "Salut"

Entrada

FT_NBR1=\'?"\"'\
FT_NBR2=rcrdmddd

Resolução Passo a Passo

Passo 1: Converter FT_NBR1

Mapeamento '\"?! 01234:

\  '  ?   "  \  '  \
1  0  3  2  1  0  1  →  10321201₅

Conversão para base 10:

10321201₅ = 1×5⁷ + 0×5⁶ + 3×5⁵ + 2×5⁴ + 1×5³ + 2×5² + 0×5¹ + 1×5⁰
          = 78125 + 0 + 9375 + 1250 + 125 + 50 + 0 + 1
          = 88926₁₀

Passo 2: Converter FT_NBR2

Mapeamento mrdoc01234:

r  c  r  d  m  d  d  d
1  4  1  2  0  2  2  2  →  14120222₅

Conversão para base 10:

14120222₅ = 1×5⁷ + 4×5⁶ + 1×5⁵ + 2×5⁴ + 0×5³ + 2×5² + 2×5¹ + 2×5⁰
          = 78125 + 62500 + 3125 + 1250 + 0 + 50 + 10 + 2
          = 145062₁₀

Passo 3: Somar

88926 + 145062 = 233988₁₀

Passo 4: Converter para base 13

233988 ÷ 13 = 17999  resto 1
17999 ÷ 13 = 1384   resto 7
1384 ÷ 13 = 106    resto 6
106 ÷ 13 = 8      resto 2
8 ÷ 13 = 0      resto 8

Restos (invertidos): 8, 2, 6, 7, 1  →  82671₁₃

Passo 5: Mapear para caracteres

Mapeamento 0123456789ABCgtaio luSnemf:

8  2  6  7  1
S  a  l  u  t

Resultado Final

Salut

5.2 Exemplo 2: "Segmentation fault"

Entrada

FT_NBR1=\"\"! \"\"! \"\"!\"\"!\"\"!\"\"
FT_NBR2=dcrcmcmooododmrrrmorcmcrmomo

Resolução Passo a Passo

Passo 1: Converter FT_NBR1

Mapeamento:

\  "  "  !   "  "  !  "  "  !  "  "  !  "  "  !  "  "
1  2  2  4  2  2  4  2  2  4  2  2  4  2  2  4  2  2  →  122422422422422422₅

Conversão (calculando):

122422422422422422₅ = 1×5¹⁷ + 2×5¹⁶ + 2×5¹⁵ + ...  (valor muito grande)

Passo 2: Converter FT_NBR2

Mapeamento:

dcrcmcmooododmrrrmorcmcrmomo  →  2414040332320100304040103030₅

Passo 3: Somar e converter para base 13

O resultado final mapeia para: Segmentation fault


6. Implementação em Shell

6.1 Solução Completa

#!/bin/bash

# Mapeando FT_NBR1: base '\"?!  → dígitos 0-4
NBR1=$(echo $FT_NBR1 | tr \'\\\"?\!  01234)

# Mapeando FT_NBR2: base mrdoc → dígitos 0-4
NBR2=$(echo $FT_NBR2 | tr mrdoc 01234)

# Convertendo base 5 → base 10, somando, e convertendo para base 13
# bc usa letras A-C para representar 10-12 em bases > 10
RESULT=$(echo "ibase=5; obase=D; $NBR1 + $NBR2" | bc)

# Mapeando base 13 (0-9A-C) → caracteres customizados gtaio luSnemf
echo $RESULT | tr 0123456789ABC 'gtaio luSnemf'

6.2 Explicação da Solução

tr (translate)

Substitui caracteres:

echo "abc" | tr abc 123  # Saída: 123

bc (basic calculator)

Calculadora que suporta múltiplas bases:

  • ibase=N: define base de entrada
  • obase=N: define base de saída
  • Bases válidas: 2-16
  • Base 13 em obase: representada como D (hexadecimal)

Escapes de caracteres especiais

Em shell, alguns caracteres precisam de escape:

\'    # Aspas simples
\\    # Barra invertida
\"    # Aspas duplas
\!     # Exclamação

6.3 Versão de Uma Linha

echo $(echo "ibase=5; obase=D; $(echo $FT_NBR1 | tr \'\\\"?\! 01234) + $(echo $FT_NBR2 | tr mrdoc 01234)" | bc) | tr 0123456789ABC 'gtaio luSnemf'

6.4 Teste Manual

# Definir variáveis
export FT_NBR1=\'?"\"'\
export FT_NBR2=rcrdmddd

# Executar script
./add_chelou.sh

# Saída esperada:
# Salut

7. Referências

7.1 Ferramentas Shell

7.2 Conceitos Matemáticos

  • Sistemas de numeração posicional: cada dígito tem um peso baseado na sua posição
  • Conversão de bases: algoritmos de divisão/multiplicação sucessiva
  • Notação científica: representação compacta usando potências

7.3 Bases Numéricas Comuns

Base Nome Dígitos Uso
2 Binário 0-1 Computação digital
8 Octal 0-7 Permissões Unix
10 Decimal 0-9 Uso cotidiano
16 Hexadecimal 0-9, A-F Endereços de memória, cores
64 Base64 A-Z, a-z, 0-9, +, / Codificação de dados

7.4 Validação de Resultados

Para validar conversões manualmente:

# Converter de base 5 para base 10
echo "ibase=5; 10321201" | bc

# Converter de base 10 para base 13
echo "obase=D; 233988" | bc

# Verificar potências
echo "5^7" | bc  # Resultado: 78125

Notas Finais

Pontos Críticos

  1. Atenção ao espaço: O caractere na posição 5 da base de saída é um espaço, não visível
  2. Escapes corretos: Caracteres especiais (\, ", !) precisam de escape no shell
  3. Ordem dos restos: Na conversão base 10 → base N, os restos devem ser invertidos
  4. Base do bc: Para base 13, use obase=D (D = 13 em hexadecimal)

Armadilhas Comuns

  • ❌ Esquecer que bc usa letras A-C para representar 10-12
  • ❌ Não inverter os restos ao converter de decimal para outra base
  • ❌ Confundir a ordem das potências (maior potência à esquerda)
  • ❌ Ignorar o espaço na base de saída

Checklist de Validação

  • Mapeamento de caracteres correto
  • Conversão base 5 → 10 validada manualmente
  • Soma em decimal conferida
  • Conversão base 10 → 13 validada
  • Mapeamento final incluindo espaço
  • Teste com ambos os exemplos do enunciado

Autor: drewdomi
Data: 2026-01-15
Repositório: GitHub Gist


Licença

Este documento é de domínio público. Use, modifique e distribua livremente.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment