Tu viens d'être embauché comme professeur de mathématiques. La première semaine s'est bien passée, mais quelque chose ne tourne pas rond la deuxième. Le problème, c'est que toutes les réponses données par tes étudiants sont fausses ! Heureusement, tes compétences en mathématiques t'ont permis d'identifier le problème : les réponses des étudiants sont correctes, mais elles sont toutes en base 2 (binaire) ! Étonnamment, il s'avère que chaque semaine, les étudiants utilisent une base différente. Pour t'aider à vérifier rapidement les réponses des étudiants, tu vas construire un outil pour convertir d'une base à une autre.
Convertis une séquence de chiffres dans une base, représentant un nombre, en une séquence de chiffres dans une autre base, représentant ce même nombre.
Essaie d'implémenter la conversion toi-même. N'utilise pas autre chose pour faire la conversion à ta place.
Dans la notation positionnelle, un nombre en base b peut se comprendre comme une combinaison linéaire des puissances de b.
Le nombre 42, en base 10, signifie :
(4 × 10¹) + (2 × 10⁰)
Le nombre 101010, en base 2, signifie :
(1 × 2⁵) + (0 × 2⁴) + (1 × 2³) + (0 × 2²) + (1 × 2¹) + (0 × 2⁰)
Le nombre 1120, en base 3, signifie :
(1 × 3³) + (1 × 3²) + (2 × 3¹) + (0 × 3⁰)
Oui. Ces trois nombres ci-dessus sont exactement les mêmes. Félicitations !
La signature de la fonction pour l'export WebAssembly convert est la suivante :
(func (export "convert")
(param $arrOffset i32)
(param $arrLength i32)
(param $inputBase i32)
(param $outputBase i32)
(result i32 i32 i32)
)
Les deux premiers paramètres $arrOffset et $arrLength expriment le décalage de base et la longueur d'un tableau d'entiers signés de 32 bits. Le paramètre de longueur est exprimé en nombre d'éléments du tableau, pas en octets. Avant d'appeler cette fonction, l'appelant écrit ce tableau dans la mémoire linéaire WebAssembly en commençant au décalage $arrOffset. La mémoire linéaire WebAssembly est toujours exprimée en little-endian.
L'appelant encoderait donc le tableau [1,2] sous la forme de la séquence de huit octets suivante.
| 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 |
| ---- arr[0] ----- | ---- arr[1] ----- |
,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
Les paramètres $inputBase et $outputBase ne concernent pas la mémoire linéaire.
Le type de résultat est (i32 i32 i32). Les deux premières valeurs sont les valeurs offset et length de ta sortie dans la mémoire linéaire. Si tu le souhaites, tu peux écraser les adresses de la mémoire linéaire utilisées pour l'entrée. La troisième valeur de retour est un code de statut i32 utilisé pour la gestion des erreurs.
Si la troisième valeur de retour exprime un état d'erreur, les tests unitaires ne lisent pas les deux premières valeurs de retour.
Inscris-toi sur Exercism pour apprendre et maîtriser WebAssembly avec 87 exercices, et un vrai mentorat humain, le tout gratuitement.