Nemrég felvettek matematikaprofesszornak. Az első heted jól telt, de a második héten valami nem stimmel. A probléma az, hogy a diákjaid minden válasza hibás! Szerencsére a matematikai képességeid segítségével azonosítani tudtad a problémát: a diákok válaszai helyesek, de mind bináris (2-es) számrendszerben vannak! Meglepő módon kiderült, hogy a diákok minden héten más számrendszert használnak. Hogy gyorsan ellenőrizni tudd a diákok válaszait, egy számrendszerek közötti átváltó eszközt fogsz építeni.
Alakítsd át az egyik számrendszerben lévő számjegysorozatot, amely egy számot jelöl, egy másik számrendszerben lévő számjegysorozattá, amely ugyanazt a számot jelöli.
Próbáld meg magad megvalósítani az átalakítást. Ne használj mást, ami helyetted elvégzi az átalakítást.
A helyiértékes jelölésben egy b alapú szám felfogható b hatványainak lineáris kombinációjaként.
A 42-es szám a tízes számrendszerben ezt jelenti:
(4 × 10¹) + (2 × 10⁰)
Az 101010-es szám a kettes számrendszerben ezt jelenti:
(1 × 2⁵) + (0 × 2⁴) + (1 × 2³) + (0 × 2²) + (1 × 2¹) + (0 × 2⁰)
Az 1120-as szám a hármas számrendszerben ezt jelenti:
(1 × 3³) + (1 × 3²) + (2 × 3¹) + (0 × 3⁰)
Igen. Ez a három szám pontosan ugyanaz. Gratulálok!
A WebAssembly convert exportjának függvényszignatúrája a következő:
(func (export "convert")
(param $arrOffset i32)
(param $arrLength i32)
(param $inputBase i32)
(param $outputBase i32)
(result i32 i32 i32)
)
Az első két paraméter, a $arrOffset és a $arrLength egy 32 bites előjeles egészekből álló tömb báziseltolását és hosszát fejezi ki. A hossz paraméter a tömbben lévő elemek számát adja meg, nem a bájtokét. Mielőtt meghívja ezt a függvényt, a hívó beírja ezt a tömböt a WebAssembly lineáris memóriájába a $arrOffset eltolástól kezdve. A WebAssembly lineáris memória mindig little-endian formátumban van kifejezve.
Így a hívó a [1,2] tömböt a következő nyolcbájtos sorozatként kódolná.
| 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 |
| ---- arr[0] ----- | ---- arr[1] ----- |
,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
A $inputBase és a $outputBase paraméter nem érinti a lineáris memóriát.
Az eredmény típusa (i32 i32 i32). Az első két érték a kimeneted offset és length értéke a lineáris memóriában. Ha úgy döntesz, felülírhatod a bemenethez használt lineáris memória címeit. A harmadik visszatérési érték egy i32 állapotkód, amelyet a hibakezeléshez használunk.
Ha a harmadik visszatérési érték hibás állapotot jelez, az egységtesztek nem olvassák be az első két visszatérési értéket.
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) WebAssembly nyelvet 87 feladat segítségével, valódi emberi mentorálással, mindez ingyen.