Διαδρομές
/
Cairo
Cairo
/
Ασκήσεις
/
Ασκούμενος Μάγος
Ασκούμενος Μάγος

Ασκούμενος Μάγος

Άσκηση εκμάθησης

Εισαγωγή

Πίνακες

Η βασική βιβλιοθήκη της Cairo υλοποιεί έναν τύπο Array.

Μοιάζει με τους συνηθισμένους τύπους πίνακα που συναντάς σε άλλες γλώσσες προγραμματισμού, αλλά έχει μερικές βασικές διαφορές:

  • Τα στοιχεία μπορούν να προστεθούν αποδοτικά μόνο στο πίσω μέρος του τύπου Array, και μπορούν να αφαιρεθούν αποδοτικά μόνο από το μπροστινό μέρος.
  • Είναι αδύνατο να ορίσεις χειροκίνητα ένα στοιχείο χρησιμοποιώντας τη θέση του πίνακα.

Οι πίνακες μπορούν να δημιουργηθούν χρησιμοποιώντας τη συνάρτηση ArrayTrait::new καθώς και το μάκρο array!:

let empty: Array<u32> = ArrayTrait::new();
let one_to_four = array![1, 2, 3, 4];

Τα στοιχεία μπορούν να προστεθούν στον πίνακα χρησιμοποιώντας τη συνάρτηση ArrayTrait::append:

let mut num_array = array![1, 2, 3, 4];
num_array.append(5);
// -> [1, 2, 3, 4, 5]

Τα στοιχεία μπορούν να αφαιρεθούν από τον πίνακα χρησιμοποιώντας τη συνάρτηση ArrayTrait::pop_front:

let mut one_to_four = array![1, 2, 3, 4];

one_to_four.pop_front();
// -> [2, 3, 4]

Η Cairo εισάγει επίσης έναν τύπο Span που λειτουργεί σαν ένα "στιγμιότυπο" του Array.

Κάθε Array μπορεί να μετατραπεί σε Span με τη συνάρτηση ToSpanTrait::span:

let one_to_four = array![1, 2, 3, 4];
let one_to_four_span = one_to_four.span();
// -> [1, 2, 3, 4]

Η μετατροπή ενός πίνακα σε Span είναι πολύ αποδοτική, καθώς το Span είναι απλώς μια δομή δεδομένων που επιτρέπει στην Cairo να "δει" ένα τμήμα του πίνακα, χωρίς να το τροποποιεί με κανέναν τρόπο.

Μετατρέποντας έναν πίνακα σε Span, η Cairo επιτρέπει να εκτελεστούν περισσότερες λειτουργίες από όσες θα επιτρέπονταν απευθείας σε ένα Array, όπως η αφαίρεση ενός στοιχείου από το μπροστινό μέρος του span.

let one_to_four = array![1, 2, 3, 4];
let mut one_to_four_span = one_to_four.span();
one_to_four_span.pop_back();
// -> [2, 3, 4]

Σημείωσε ότι έπρεπε να κάνουμε το one_to_four_span μεταβλητό με τη λέξη-κλειδί mut για να καλέσουμε το pop_back, το οποίο μεταβάλλει το span συντομεύοντας το τμήμα του πίνακα που "βλέπει" το span.

Οδηγίες

Ως μελλοντική μάγισσα, η Elyse χρειάζεται να εξασκηθεί στα βασικά.

Έχει μια στοίβα από κάρτες που θέλει να χειριστεί.

Για να κάνει τα πράγματα λίγο πιο εύκολα, χρησιμοποιεί μόνο τις κάρτες 1 έως 10.

Η στοίβα των καρτών αναπαρίσταται από έναν Array, με τη βάση της στοίβας στο μπροστινό μέρος του πίνακα και την κορυφή της στοίβας στο πίσω μέρος.

1. Εισαγωγή κάρτας στην κορυφή της στοίβας

Υλοποίησε τη συνάρτηση insert_top που επιστρέφει ένα αντίγραφο της στοίβας όπου η νέα κάρτα που δίνεται έχει προστεθεί στην κορυφή.

let stack = array![5, 9, 7, 1];
insert_top(stack, 8);
// -> [5, 9, 7, 1, 8]

2. Αφαίρεση της κάρτας από την κορυφή της στοίβας

Υλοποίησε τη συνάρτηση remove_top_card που επιστρέφει ένα αντίγραφο της στοίβας, από το οποίο έχει αφαιρεθεί η κάρτα στην κορυφή.

Αν η στοίβα που δίνεται είναι κενή, θα πρέπει να επιστραφεί η αρχική στοίβα, χωρίς αλλαγές.

let stack = array![3, 2, 6, 4, 8];
remove_top_card(stack);
// -> [3, 2, 6, 4]

3. Εισαγωγή κάρτας στη βάση της στοίβας

Υλοποίησε τη συνάρτηση insert_bottom που επιστρέφει ένα αντίγραφο της στοίβας όπου η νέα κάρτα που δίνεται έχει προστεθεί στη βάση της στοίβας.

let stack = array![5, 9, 7, 1];
insert_bottom(stack, 8);
// -> [8, 5, 9, 7, 1]

4. Αφαίρεση κάρτας από τη βάση της στοίβας

Υλοποίησε τη συνάρτηση remove_bottom_card που επιστρέφει ένα αντίγραφο της στοίβας, από το οποίο έχει αφαιρεθεί η κάρτα στη βάση.

Αν η στοίβα που δίνεται είναι κενή, θα πρέπει να επιστραφεί η αρχική στοίβα, χωρίς αλλαγές.

let stack = array![8, 5, 9, 7, 1];
remove_bottom_card(stack);
// -> [5, 9, 7, 1]

5. Έλεγχος του μεγέθους της στοίβας

Υλοποίησε τη συνάρτηση check_size_of_stack που ελέγχει αν το μέγεθος της στοίβας είναι ίσο με μια δεδομένη τιμή stack_size ή όχι.

let stack = array![3, 2, 6, 4, 8];
check_size_of_stack(stack, 4);
// -> false

Για να καταλάβεις γιατί η εργασία με πίνακες στη Cairo δεν είναι τόσο απλή όσο σε άλλες γλώσσες προγραμματισμού, είναι χρήσιμο να έχεις υπόψη σου ότι η Cairo χρησιμοποιεί ένα αμετάβλητο μοντέλο μνήμης, που σημαίνει ότι μόλις γραφτεί ένα κύτταρο μνήμης, δεν μπορεί ποτέ να ξαναγραφτεί, παρά μόνο να διαβαστεί.

Η γλώσσα κρύβει κάπως αυτό το χαρακτηριστικό, επιτρέποντας στους προγραμματιστές να δηλώνουν και να χρησιμοποιούν τις μεταβλητές τους σαν να μπορούν να τις αλλάξουν.

Αν και αυτό κάνει τη συγγραφή κώδικα λίγο πιο δύσκολη, ειδικά τον κώδικα που χρησιμοποιεί τον τύπο Array (συμπεριλαμβανομένου του ByteArray, ο οποίος στην ουσία είναι ένας "πίνακας από bytes"), επιτρέπει τη συγγραφή αποδείξιμων προγραμμάτων που μπορούν να εκτελεστούν με σιγουριά ακόμη και σε μη αξιόπιστα μηχανήματα, κάτι που κάνει τον συμβιβασμό να αξίζει με το παραπάνω.

Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Cairo Exercism

Έτοιμος να ξεκινήσεις την άσκηση Ασκούμενος Μάγος;

Γράψου στο Exercism για να μάθεις και να κατακτήσεις Cairo με 25 έννοιες68 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.