Διαδρομές
/
Crystal
Crystal
/
Ασκήσεις
/
Το κολοσσιαίο τρενάκι του Chaitanas
Το κολοσσιαίο τρενάκι του Chaitanas

Το κολοσσιαίο τρενάκι του Chaitanas

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

Εισαγωγή

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

Κάποιες από αυτές τις μεθόδους είναι καταστροφικές, που σημαίνει ότι τροποποιούν τον αρχικό πίνακα. Άλλες είναι μη καταστροφικές, δηλαδή επιστρέφουν έναν νέο πίνακα και δεν τροποποιούν τον αρχικό.

Ορίστε μερικές από τις πιο συνηθισμένες μεθόδους που μπορείς να χρησιμοποιήσεις όταν δουλεύεις με πίνακες:

insert

Όταν εισάγεις ένα στοιχείο σε έναν πίνακα, μπορείς να χρησιμοποιήσεις τη μέθοδο insert, η οποία παίρνει ως ορίσματα μια θέση και ένα στοιχείο. Το στοιχείο θα εισαχθεί στη θέση που όρισες και το υπόλοιπο του πίνακα θα μετακινηθεί προς τα δεξιά. Αν η θέση είναι εκτός ορίων, τότε θα πεταχτεί ένα IndexError.

numbers = [1, 2, 3]
numbers.insert(1, 4)
numbers # => [1, 4, 2, 3]

numbers.insert(5, 5) # => Error: Index out of bounds (IndexError)

delete

Όταν θέλεις να διαγράψεις ένα συγκεκριμένο στοιχείο από έναν πίνακα, μπορείς να χρησιμοποιήσεις τη μέθοδο delete, η οποία παίρνει ως όρισμα ένα στοιχείο. Η μέθοδος επιστρέφει το στοιχείο που αφαιρέθηκε. Αν το στοιχείο δεν υπάρχει στον πίνακα, τότε θα επιστραφεί nil.

numbers = [1, 2, 3]
numbers.delete(2) # => 2
numbers           # => [1, 3]

first & last

Όταν θέλεις να πάρεις το πρώτο ή το τελευταίο στοιχείο ενός πίνακα, μπορείς να χρησιμοποιήσεις τις μεθόδους first και last. Αυτές οι μέθοδοι παίρνουν ένα προαιρετικό όρισμα που καθορίζει πόσα στοιχεία θα επιστραφούν. Μπορούν να βελτιώσουν την αναγνωσιμότητα σε σύγκριση με τη χρήση της θέσης 0 ή -1, ή τη χρήση ενός εύρους. Αν ο πίνακας είναι κενός, θα πεταχτεί ένα Enumerable::EmptyError.

numbers = [1, 2, 3]
numbers.first # => 1
numbers.last  # => 3

numbers.first(2) # => [1, 2]
numbers.last(2)  # => [2, 3]

empty_array = [] of Int32
empty_array.last # => Error: Empty enumerable (Enumerable::EmptyError)

reverse

Όταν θέλεις να αντιστρέψεις έναν πίνακα, μπορείς να χρησιμοποιήσεις τη μέθοδο reverse, η οποία επιστρέφει έναν νέο πίνακα με τα στοιχεία σε αντίστροφη σειρά. Είναι σημαντικό να σημειώσεις ότι η reverse επιστρέφει έναν νέο πίνακα και δεν τροποποιεί τον αρχικό πίνακα. Αν θέλεις να τροποποιήσεις τον αρχικό πίνακα, πρόσθεσε ένα ! στο τέλος του ονόματος της μεθόδου.

numbers = [1, 2, 3]
numbers.reverse # => [3, 2, 1]
numbers         # => [1, 2, 3]

numbers.reverse! # => [3, 2, 1]
numbers          # => [3, 2, 1]

Concat(+)

Η μέθοδος append (<<) είναι χρήσιμη όταν θέλεις να προσθέσεις αντικείμενα σε έναν πίνακα. Ωστόσο, όταν συνδυάζεις δύο πίνακες, μπορείς να χρησιμοποιήσεις τον τελεστή +, ο οποίος επιστρέφει έναν νέο πίνακα με τα στοιχεία και των δύο πινάκων.

[1, 2] + [3, 4] # => [1, 2, 3, 4]

Αν προσθέσεις έναν πίνακα σε έναν άλλο πίνακα, ο πίνακας θα προστεθεί ως ένα μόνο στοιχείο.

[1, 2] << [3, 4] # => [1, 2, [3, 4]]

empty?

Όταν ελέγχεις αν ένας πίνακας είναι κενός, μπορείς να χρησιμοποιήσεις τη μέθοδο empty?, η οποία επιστρέφει true αν ο πίνακας είναι κενός και false διαφορετικά. Αυτό βελτιώνει την αναγνωσιμότητα σε σύγκριση με τον έλεγχο του μήκους του πίνακα ως προς το 0.

[].empty? # => true
[1, 2, 3].empty? # => false

index

Όταν θέλεις να πάρεις τη θέση ενός στοιχείου σε έναν πίνακα, μπορείς να χρησιμοποιήσεις τη μέθοδο index, η οποία παίρνει ως όρισμα ένα στοιχείο. Αν το στοιχείο δεν υπάρχει στον πίνακα, τότε θα επιστραφεί nil.

numbers = [1, 2, 3]
numbers.index(2) # => 1

size

Όταν θέλεις να μάθεις τον αριθμό των στοιχείων σε έναν πίνακα, μπορείς να χρησιμοποιήσεις τη μέθοδο size.

numbers = [1, 2, 3]
numbers.size # => 3

count

Όταν θέλεις να μετρήσεις πόσες φορές υπάρχει ένα στοιχείο σε έναν πίνακα, μπορείς να χρησιμοποιήσεις τη μέθοδο count.

fruits = ["apple", "banana", "apple"]
fruits.count("apple")      # => 2
fruits.count("banana")     # => 1
fruits.count("watermelon") # => 0

sort

Όταν θέλεις να ταξινομήσεις έναν πίνακα, μπορείς να χρησιμοποιήσεις τη μέθοδο sort, η οποία επιστρέφει έναν νέο πίνακα με τα στοιχεία ταξινομημένα. Όπως και με τη reverse, αυτή η μέθοδος επιστρέφει έναν νέο πίνακα και δεν τροποποιεί τον αρχικό πίνακα.

numbers = [3, 2, 1]
numbers.sort # => [1, 2, 3]
numbers      # => [3, 2, 1]

numbers.sort! # => [1, 2, 3]
numbers       # => [1, 2, 3]

Οδηγίες

Η Chaitana έχει ένα πολύ δημοφιλές λούνα παρκ. Έχει μόνο ένα παιχνίδι, ακριβώς στο κέντρο ενός πανέμορφα διαμορφωμένου τοπίου: το Μεγαλύτερο Τρενάκι του Λούνα Παρκ στον Κόσμο(TM). Αν και υπάρχει μόνο αυτό το ένα αξιοθέατο, άνθρωποι ταξιδεύουν από όλο τον κόσμο και στέκονται στην ουρά για ώρες, μόνο και μόνο για την ευκαιρία να κάνουν βόλτα με το hypercoaster της Chaitana.

Υπάρχουν δύο ουρές για αυτό το παιχνίδι, και καθεμία αναπαρίσταται ως array:

  1. Κανονική ουρά
  2. Ουρά Express (γνωστή και ως Fast-track) - όπου οι άνθρωποι πληρώνουν επιπλέον για πρόσβαση κατά προτεραιότητα.

Σου ζητήθηκε να γράψεις κώδικα για να διαχειρίζεσαι καλύτερα τους επισκέπτες του πάρκου. Πρέπει να υλοποιήσεις τις παρακάτω συναρτήσεις το συντομότερο δυνατό, πριν οι επισκέπτες (και το αφεντικό σου, η Chaitana!) αρχίσουν να γκρινιάζουν.

1. Πρόσθεσε ένα άτομο στην ουρά

Όρισε τη μέθοδο ColossalCoaster.add_to_queue που δέχεται 4 ορίσματα <express_queue>, <normal_queue>, <ticket_type>, <person_name> και επιστρέφει την κατάλληλη ουρά, ενημερωμένη με το όνομα του ατόμου.

  1. Το όρισμα <ticket_type> είναι Int32, όπου 1 == express_queue και 0 == normal_queue.
  2. Το όρισμα <person_name> είναι το όνομα (ως String) του ατόμου που θα προστεθεί στην αντίστοιχη ουρά.
express_queue = ["Tony", "Bruce"]
normal_queue = ["RobotGuy", "WW"]
ColossalCoaster.add_to_queue(express_queue, normal_queue, 1, "RichieRich")
# => ["Tony", "Bruce", "RichieRich"]

2. Πού είναι οι φίλοι μου;

Ένα άτομο έφτασε αργά στο πάρκο, αλλά θέλει να μπει στην ουρά όπου περιμένουν οι φίλοι του. Ωστόσο, δεν έχει ιδέα πού στέκονται οι φίλοι του και δεν υπάρχει σήμα τηλεφώνου για να τους καλέσει.

Όρισε τη μέθοδο ColossalCoaster.find_my_friend που δέχεται 2 ορίσματα, τα queue και friend_name, και επιστρέφει τη θέση στην ουρά του ατόμου με αυτό το όνομα.

  1. Το όρισμα <queue> είναι ένα array με τα άτομα που στέκονται στην ουρά.
  2. Το όρισμα <friend_name> είναι το όνομα του φίλου του οποίου τη θέση (πού βρίσκεται στην ουρά) πρέπει να βρεις.
ColossalCoaster.find_my_friend(["Natasha", "Steve", "T'challa", "Wanda", "Rocket"], "Steve")
# => 1

3. Μπορώ να μπω και εγώ μαζί τους;

Τώρα που βρέθηκαν οι φίλοι τους (στην εργασία #2 παραπάνω), ο καθυστερημένος θα ήθελε να μπει μαζί τους, στη θέση τους στην ουρά. Όρισε τη μέθοδο ColossalCoaster.add_with_friends που δέχεται 3 ορίσματα, τα queue, friend_name και person_name.

  1. Το όρισμα <queue> είναι ένα array με τα άτομα που στέκονται στην ουρά.
  2. Το όρισμα <friend_name> είναι το όνομα του φίλου στη θέση του οποίου πρέπει να προστεθεί το άτομο.
  3. Το όρισμα <person_name> είναι το όνομα του ατόμου που θα προστεθεί στη θέση.

Επίστρεψε την ουρά ενημερωμένη με το όνομα του καθυστερημένου.

ColossalCoaster.add_with_friends(["Natasha", "Steve", "T'challa", "Wanda", "Rocket"], "Steve", "Bucky")
# => ["Natasha", "Bucky", "Steve", "T'challa", "Wanda", "Rocket"]

4. Κακόβουλο άτομο στην ουρά

Μόλις έμαθες από την ουρά ότι υπάρχει ένας πολύ κακός άνθρωπος που σπρώχνει, φωνάζει και προκαλεί φασαρία. Πρέπει να πετάξεις έξω αυτόν τον ταραξία για την κακή του συμπεριφορά!

Όρισε τη μέθοδο ColossalCoaster.remove_from_queue που δέχεται 2 ορίσματα, τα queue και person_name.

  1. Το όρισμα <queue> είναι ένα array με τα άτομα που στέκονται στην ουρά.
  2. Το όρισμα <person_name> είναι το όνομα του ατόμου που πρέπει να πεταχτεί έξω.

Επίστρεψε την ουρά ενημερωμένη, χωρίς το όνομα του κακόβουλου ατόμου.

ColossalCoaster.remove_from_queue(["Natasha", "Steve", "Eltran", "Wanda", "Rocket"], "Eltran")
# => ["Natasha", "Steve", "Wanda", "Rocket"]

5. Ταξινόμησε τη λίστα της ουράς

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

Όρισε τη μέθοδο ColossalCoaster.sorted_queue που δέχεται 1 όρισμα, το queue (το array με τα άτομα που στέκονται στην ουρά). Η μέθοδος πρέπει να επιστρέφει ένα ταξινομημένο αντίγραφο του array.

ColossalCoaster.sorted_queue(["Natasha", "Steve", "Eltran", "Natasha", "Rocket"])
# => ['Eltran', 'Natasha', 'Natasha', 'Rocket', 'Steve']
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Crystal Exercism

Έτοιμος να ξεκινήσεις την άσκηση Το κολοσσιαίο τρενάκι του Chaitanas;

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