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!
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, indicam o deslocamento base e o comprimento de um array de inteiros de 32 bits com sinal. O parâmetro de comprimento é medido em número de elementos do array, não em bytes. Antes de chamar esta função, quem a chama escreve este array na memória linear do WebAssembly, começando no deslocamento $arrOffset. A memória linear do WebAssembly é sempre expressa em little-endian.
Assim, quem chama a função 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 do resultado é (i32 i32 i32). Os dois primeiros valores são o offset e o length da tua saída na memória linear. Se quiseres, podes sobrescrever os endereços da memória linear usados para os dados de entrada. O terceiro valor devolvido é um código de estado i32 usado para o tratamento de erros.
Se o terceiro valor devolvido indicar um estado de erro, os testes unitários não leem os dois primeiros valores devolvidos.
Inscreve-te no Exercism para aprenderes e dominares WebAssembly com 87 exercícios, e mentoria humana real, tudo grátis.