Acabaste de ser contratado como professor de matemática. A tua primeira semana correu bem, mas há algo de estranho na segunda. O problema é que todas as respostas dadas pelos teus alunos estão erradas! Felizmente, os teus conhecimentos de matemática permitiram-te identificar o problema: as respostas dos alunos estão corretas, mas estão todas na base 2 (binário)! Curiosamente, verifica-se que, a cada semana, os alunos usam uma base diferente. Para te ajudar a verificar rapidamente as respostas dos alunos, vais construir uma ferramenta que converte entre bases.
Converte uma sequência de algarismos numa base, que representa um número, numa sequência de algarismos noutra base, que representa o mesmo número.
Tenta ser tu a implementar a conversão. Não uses outra coisa para fazer a conversão por ti.
Na notação posicional, um número na base b pode ser entendido como uma combinação linear de potências de b.
O número 42, na base 10, significa:
(4 × 10¹) + (2 × 10⁰)
O número 101010, na base 2, significa:
(1 × 2⁵) + (0 × 2⁴) + (1 × 2³) + (0 × 2²) + (1 × 2¹) + (0 × 2⁰)
O número 1120, na base 3, significa:
(1 × 3³) + (1 × 3²) + (2 × 3¹) + (0 × 3⁰)
Sim. Aqueles três números acima são exatamente o mesmo número. Parabéns!
Por vezes, é necessário lançar uma exceção. Quando o fazes, deves incluir sempre uma mensagem de erro significativa para indicar qual é a origem do erro. Isto torna o teu código mais legível e ajuda imenso na depuração. Nas situações em que sabes que a origem do erro será de um determinado tipo, podes optar por lançar um dos tipos de erro incorporados, mas deves continuar a incluir uma mensagem significativa.
Este exercício em particular exige que uses a instrução raise para "lançar" um ValueError para as diferentes bases de entrada e de saída. Os testes só passam se fizeres raise da exception e incluíres uma mensagem significativa com ela.
Para lançar um ValueError com uma mensagem, escreve a mensagem como argumento do tipo exception:
# for input.
raise ValueError("input base must be >= 2")
# another example for input.
raise ValueError("all digits must satisfy 0 <= d < input base")
# or, for output.
raise ValueError("output base must be >= 2")
Inscreve-te no Exercism para aprenderes e dominares Python com 17 conceitos146 exercícios, e mentoria humana real, tudo grátis.