Υλοποίησε την κωδικοποίηση και την αποκωδικοποίηση ποσότητας μεταβλητού μήκους.
Στόχος αυτής της άσκησης είναι να υλοποιήσεις την κωδικοποίηση/αποκωδικοποίηση VLQ.
Με λίγα λόγια, στόχος αυτής της κωδικοποίησης είναι να κωδικοποιεί ακέραιες τιμές με τρόπο που εξοικονομεί bytes. Μόνο τα πρώτα 7 bit κάθε byte είναι σημαντικά (δεξιά στοιχισμένα, κάπως σαν ένα byte ASCII). Έτσι, αν έχεις μια τιμή 32 bit, πρέπει να την αναλύσεις σε μια σειρά από byte των 7 bit. Φυσικά, θα έχεις μεταβλητό αριθμό byte ανάλογα με τον ακέραιό σου. Για να δείξεις ποιο είναι το τελευταίο byte της σειράς, αφήνεις το bit #7 στο 0. Σε όλα τα προηγούμενα byte, θέτεις το bit #7 στο 1.
Έτσι, αν ένας ακέραιος είναι μεταξύ 0-127, μπορεί να αναπαρασταθεί με ένα byte.
Αν και το VLQ μπορεί να χειριστεί αριθμούς αυθαίρετου μεγέθους, σε αυτή την άσκηση θα περιοριστούμε μόνο σε αριθμούς που χωρούν σε έναν ανυπόγραφο ακέραιο 32 bit.
Ακολουθούν παραδείγματα ακεραίων ως τιμών 32 bit και οι ποσότητες μεταβλητού μήκους στις οποίες αντιστοιχούν:
NUMBER VARIABLE QUANTITY
00000000 00
00000040 40
0000007F 7F
00000080 81 00
00002000 C0 00
00003FFF FF 7F
00004000 81 80 00
00100000 C0 80 00
001FFFFF FF FF 7F
00200000 81 80 80 00
08000000 C0 80 80 00
0FFFFFFF FF FF FF 7F
Μερικές φορές είναι απαραίτητο να πετάξεις μια εξαίρεση. Όταν το κάνεις αυτό, θα πρέπει πάντα να συμπεριλαμβάνεις ένα κατατοπιστικό μήνυμα σφάλματος για να υποδεικνύεις ποια είναι η πηγή του σφάλματος. Αυτό κάνει τον κώδικά σου πιο ευανάγνωστο και βοηθά σημαντικά στο debugging. Σε περιπτώσεις όπου γνωρίζεις ότι η πηγή του σφάλματος θα είναι κάποιου συγκεκριμένου τύπου, μπορείς να επιλέξεις να πετάξεις έναν από τους ενσωματωμένους τύπους σφαλμάτων, αλλά θα πρέπει ακόμα να συμπεριλάβεις ένα κατατοπιστικό μήνυμα.
Αυτή η συγκεκριμένη άσκηση απαιτεί να χρησιμοποιήσεις την εντολή raise για να "πετάξεις" ένα ValueError αν η ακολουθία προς αποκωδικοποίηση ή κωδικοποίηση είναι ελλιπής. Τα tests θα περάσουν μόνο αν κάνεις raise την exception και συμπεριλάβεις ένα μήνυμα μαζί της.
Για να πετάξεις ένα ValueError με ένα μήνυμα, γράψε το μήνυμα ως όρισμα στον τύπο exception:
# if the sequence is incomplete
raise ValueError("incomplete sequence")
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Python με 17 έννοιες146 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.