Μόλις προσλήφθηκες ως καθηγητής μαθηματικών. Η πρώτη σου εβδομάδα κύλησε καλά, αλλά κάτι δεν πάει καλά τη δεύτερη εβδομάδα. Το πρόβλημα είναι ότι κάθε απάντηση που δίνουν οι φοιτητές σου είναι λανθασμένη! Ευτυχώς, χάρη στις μαθηματικές σου ικανότητες κατάφερες να εντοπίσεις το πρόβλημα: οι απαντήσεις των φοιτητών είναι σωστές, αλλά είναι όλες στη βάση 2 (δυαδικό)! Το εκπληκτικό είναι ότι κάθε εβδομάδα οι φοιτητές χρησιμοποιούν διαφορετική βάση. Για να επαληθεύεις γρήγορα τις απαντήσεις των φοιτητών, θα φτιάξεις ένα εργαλείο μετατροπής μεταξύ βάσεων.
Μετέτρεψε μια ακολουθία ψηφίων σε μία βάση, που αναπαριστά έναν αριθμό, σε μια ακολουθία ψηφίων σε μια άλλη βάση, που αναπαριστά τον ίδιο αριθμό.
Προσπάθησε να υλοποιήσεις εσύ τη μετατροπή. Μην χρησιμοποιήσεις κάτι άλλο για να κάνει τη μετατροπή για σένα.
Στη θεσιακή σημειογραφία, ένας αριθμός σε βάση b μπορεί να κατανοηθεί ως ένας γραμμικός συνδυασμός δυνάμεων του b.
Ο αριθμός 42, σε βάση 10, σημαίνει:
(4 × 10¹) + (2 × 10⁰)
Ο αριθμός 101010, σε βάση 2, σημαίνει:
(1 × 2⁵) + (0 × 2⁴) + (1 × 2³) + (0 × 2²) + (1 × 2¹) + (0 × 2⁰)
Ο αριθμός 1120, σε βάση 3, σημαίνει:
(1 × 3³) + (1 × 3²) + (2 × 3¹) + (0 × 3⁰)
Ναι. Αυτοί οι τρεις αριθμοί παραπάνω είναι ακριβώς οι ίδιοι. Συγχαρητήρια!
Η υπογραφή της συνάρτησης για το εξαγόμενο convert της WebAssembly είναι η εξής:
(func (export "convert")
(param $arrOffset i32)
(param $arrLength i32)
(param $inputBase i32)
(param $outputBase i32)
(result i32 i32 i32)
)
Οι δύο πρώτες παράμετροι $arrOffset και $arrLength εκφράζουν τη μετατόπιση βάσης και το μήκος ενός πίνακα 32-bit προσημασμένων ακεραίων. Η παράμετρος μήκους μετριέται σε αριθμό στοιχείων του πίνακα, όχι σε bytes. Πριν καλέσει αυτή τη συνάρτηση, ο καλών γράφει αυτόν τον πίνακα στη γραμμική μνήμη της WebAssembly, ξεκινώντας από τη μετατόπιση $arrOffset. Η γραμμική μνήμη της WebAssembly εκφράζεται πάντα σε little-endian.
Έτσι, ο καλών θα κωδικοποιούσε τον πίνακα [1,2] ως την ακόλουθη ακολουθία οκτώ bytes.
| 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 |
| ---- arr[0] ----- | ---- arr[1] ----- |
,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
Οι παράμετροι $inputBase και $outputBase δεν αφορούν τη γραμμική μνήμη.
Ο τύπος αποτελέσματος είναι (i32 i32 i32). Οι δύο πρώτες τιμές είναι το offset και το length της εξόδου σου στη γραμμική μνήμη. Αν το επιλέξεις, μπορείς να επικαλύψεις τις διευθύνσεις της γραμμικής μνήμης που χρησιμοποιούνται για την είσοδο. Η τρίτη τιμή επιστροφής είναι ένας κωδικός κατάστασης i32 που χρησιμοποιείται για τη διαχείριση σφαλμάτων.
Αν η τρίτη τιμή επιστροφής εκφράζει κατάσταση σφάλματος, τα unit tests δε διαβάζουν τις δύο πρώτες τιμές επιστροφής.
Γράψου στο Exercism για να μάθεις και να κατακτήσεις WebAssembly με 87 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.