Acaban de contratarte como profesor de matemáticas. Tu primera semana fue bien, pero algo no cuadra en la segunda. ¡El problema es que todas las respuestas que dan tus estudiantes están mal! Por suerte, tus conocimientos de matemáticas te han permitido identificar el problema: ¡las respuestas de los estudiantes sí son correctas, pero todas están en base 2 (binario)! Sorprendentemente, resulta que cada semana los estudiantes usan una base distinta. Para ayudarte a verificar rápidamente las respuestas de los estudiantes, vas a crear una herramienta que traduzca entre bases.
Convierte una secuencia de dígitos en una base, que representa un número, en una secuencia de dígitos en otra base, que representa el mismo número.
Intenta implementar la conversión por tu cuenta. No uses otra cosa que haga la conversión por ti.
En la notación posicional, un número en base b se puede entender como una combinación lineal de potencias de b.
El número 42, en base 10, significa:
(4 × 10¹) + (2 × 10⁰)
El número 101010, en base 2, significa:
(1 × 2⁵) + (0 × 2⁴) + (1 × 2³) + (0 × 2²) + (1 × 2¹) + (0 × 2⁰)
El número 1120, en base 3, significa:
(1 × 3³) + (1 × 3²) + (2 × 3¹) + (0 × 3⁰)
Sí. Esos tres números de arriba son exactamente el mismo. ¡Felicidades!
La firma de la función para la exportación convert de WebAssembly es la siguiente:
(func (export "convert")
(param $arrOffset i32)
(param $arrLength i32)
(param $inputBase i32)
(param $outputBase i32)
(result i32 i32 i32)
)
Los dos primeros parámetros, $arrOffset y $arrLength, expresan el desplazamiento base y la longitud de un array de enteros con signo de 32 bits. El parámetro de longitud se mide en número de elementos del array, no en bytes. Antes de llamar a esta función, quien la llama escribe este array en la memoria lineal de WebAssembly a partir del desplazamiento $arrOffset. La memoria lineal de WebAssembly siempre se expresa en little-endian.
Por lo tanto, quien llama codificaría el array [1,2] como la siguiente secuencia de ocho bytes.
| 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 |
| ---- arr[0] ----- | ---- arr[1] ----- |
,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
Los parámetros $inputBase y $outputBase no involucran la memoria lineal.
El tipo de resultado es (i32 i32 i32). Los dos primeros valores son el offset y el length de tu salida en la memoria lineal. Si lo prefieres, puedes sobrescribir las direcciones de la memoria lineal que se usaron para la entrada. El tercer valor de retorno es un código de estado i32 que se usa para el manejo de errores.
Si el tercer valor de retorno indica un estado de error, las pruebas unitarias no leen los dos primeros valores de retorno.
Regístrate en Exercism para aprender y dominar WebAssembly con 87 ejercicios y mentoría humana real, todo gratis.