Você acaba de ser contratado como professor de matemática. Sua primeira semana correu bem, mas tem algo errado na segunda semana. O problema é que todas as respostas dos seus alunos estão erradas! Por sorte, seus conhecimentos de matemática permitiram que você identificasse o problema: as respostas dos alunos estão certas, mas todas estão na base 2 (binária)! Incrivelmente, a cada semana os alunos usam uma base diferente. Para ajudar você a verificar rapidamente as respostas dos alunos, você vai construir uma ferramenta para converter entre bases.
Converta uma sequência de dígitos em uma base, que representa um número, em uma sequência de dígitos em outra base, que representa o mesmo número.
Tente implementar a conversão por conta própria. Não use outra coisa para fazer a conversão no seu lugar.
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. Esses três números acima são exatamente o mesmo. Parabéns!
A assinatura da função para a exportação convert do WebAssembly é a seguinte:
(func (export "convert")
(param $arrOffset i32)
(param $arrLength i32)
(param $inputBase i32)
(param $outputBase i32)
(result i32 i32 i32)
)
Os dois primeiros parâmetros $arrOffset e $arrLength expressam o offset base e o comprimento de um array de inteiros com sinal de 32 bits. O parâmetro de comprimento é medido em número de elementos do array, não em bytes. Antes de chamar essa função, quem chama escreve esse array na memória linear do WebAssembly começando no offset $arrOffset. A memória linear do WebAssembly é sempre expressa em little-endian.
Assim, quem chama codificaria o array [1,2] como a seguinte sequência de oito bytes.
| 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 |
| ---- arr[0] ----- | ---- arr[1] ----- |
,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
Os parâmetros $inputBase e $outputBase não envolvem a memória linear.
O tipo de resultado é (i32 i32 i32). Os dois primeiros valores são o offset e o length da sua saída na memória linear. Se você quiser, pode sobrescrever os endereços da memória linear usados para a entrada. O terceiro valor de retorno é um código de status i32 usado para tratamento de erros.
Se o terceiro valor de retorno indicar um estado de erro, os testes unitários não leem os dois primeiros valores de retorno.
Crie sua conta no Exercism para aprender e dominar WebAssembly com 87 exercícios e mentoria humana de verdade, tudo de graça.