Διαδρομές
/
Swift
Swift
/
Ασκήσεις
/
Μαθητευόμενος μάγος
Μαθητευόμενος μάγος

Μαθητευόμενος μάγος

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

Εισαγωγή

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

Τα κυριολεκτικά πίνακα γράφονται ως μια λίστα στοιχείων χωρισμένων με κόμμα, μέσα σε αγκύλες ([...]). Η Swift μπορεί να συμπεράνει τον τύπο του πίνακα από τα στοιχεία μέσα στο κυριολεκτικό.

let evenInts = [2, 4, 6, 8, 10, 12]
var oddInts = [1, 3, 5, 7, 9, 11, 13]
let greetings = ["Hello!", "Hi!", "¡Hola!"]

Μπορείς επίσης να προσδιορίσεις τον τύπο ρητά. Οι τύποι πίνακα μπορούν να γραφτούν με δύο τρόπους: Array<T> ή η συντομευμένη σύνταξη [T], όπου T είναι ο τύπος των τιμών που περιέχει ο πίνακας.

let evenInts: Array<Int> = [2, 4, 6, 8, 10, 12]
var oddInts: [Int] = [1, 3, 5, 7, 9, 11, 13]
let greetings: [String] = ["Hello!", "Hi!", "¡Hola!"]

Το μέγεθος ενός πίνακα

Μπορείς να βρεις τον αριθμό των στοιχείων ενός πίνακα με την ιδιότητα count:

evenInts.count
// returns 6

Κενοί πίνακες

Για να δημιουργήσεις έναν κενό πίνακα, πρέπει να προσδιορίσεις τον τύπο του. Μπορείς να το κάνεις αυτό με τη σύνταξη αρχικοποίησης πίνακα ή με ρητή δήλωση τύπου:

let emptyArray = [Int]()
let emptyArray2 = Array<Int>()
let emptyArray3: [Int] = []

Πολυδιάστατοι πίνακες

Οι πίνακες μπορούν να εμφωλευτούν για να δημιουργήσουν πολυδιάστατους πίνακες. Όταν προσδιορίζεις ρητά τον τύπο ενός εμφωλευμένου πίνακα, περικλείεις τον τύπο των στοιχείων σε εμφωλευμένες αγκύλες, όπως [[Int]] ή Array<Array<Int>>:

let multiDimArray = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
let multiDimArray2: [[Int]] = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

Προσθήκη στο τέλος ενός πίνακα

Μπορείς να προσθέσεις ένα στοιχείο στο τέλος ενός μεταβλητού πίνακα με τη μέθοδο append(_:):

var oddInts = [1, 3, 5, 7, 9, 11, 13]
oddInts.append(15)
// oddInts is now [1, 3, 5, 7, 9, 11, 13, 15]

Εισαγωγή σε έναν πίνακα

Μπορείς να εισάγεις ένα στοιχείο σε μια συγκεκριμένη θέση με τη μέθοδο insert(_:at:). Αυτή η μέθοδος δέχεται δύο ορίσματα: το στοιχείο που θα εισαχθεί και τη θέση στην οποία θα εισαχθεί.

var oddInts = [1, 3, 5, 7, 9, 11, 13]
oddInts.insert(0, at: 0)
// oddInts is now [0, 1, 3, 5, 7, 9, 11, 13]

Προσθήκη πινάκων μεταξύ τους

Μπορείς να συνδυάσεις δύο πίνακες σε έναν μόνο πίνακα με τον τελεστή +. Ο τελεστής + δημιουργεί και επιστρέφει έναν νέο πίνακα. Δεν τροποποιεί τους αρχικούς πίνακες.

var oddInts = [1, 3, 5, 7, 9, 11, 13]
let combined = oddInts + [15, 17, 19]
// combined is [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]

print(oddInts)
// prints [1, 3, 5, 7, 9, 11, 13]

Πρόσβαση στα στοιχεία ενός πίνακα

Μπορείς να προσπελάσεις ένα μεμονωμένο στοιχείο ενός πίνακα βάζοντας τη θέση του μέσα σε αγκύλες ([]) μετά το όνομα του πίνακα. Οι θέσεις ενός πίνακα είναι τιμές Int με βάση το μηδέν, ξεκινώντας από το 0 για το πρώτο στοιχείο. Η πρόσβαση σε θέση έξω από το έγκυρο εύρος προκαλεί σφάλμα κατά την εκτέλεση και το πρόγραμμα καταρρέει.

let evenInts = [2, 4, 6, 8, 10, 12]
let oddInts = [1, 3, 5, 7, 9, 11, 13]

evenInts[2]
// returns 6

oddInts[7]
// Fatal error: Index out of range

Τροποποίηση των στοιχείων ενός πίνακα

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

var evenInts = [2, 4, 6, 8, 10, 12]

evenInts[2] = 0
// evenInts is now [2, 4, 0, 8, 10, 12]

Μετατροπή ενός πίνακα σε συμβολοσειρά και αντίστροφα

Μπορείς να ενώσεις έναν πίνακα από συμβολοσειρές σε μία μόνο συμβολοσειρά με τη μέθοδο joined(separator:), η οποία δέχεται μια συμβολοσειρά διαχωριστικό:

let evenInts = ["2", "4", "6", "8", "10", "12"]
let evenIntsString = evenInts.joined(separator: ", ")
// returns "2, 4, 6, 8, 10, 12"

Μπορείς να χωρίσεις μια συμβολοσειρά σε έναν πίνακα από υποσυμβολοσειρές με τη μέθοδο split(separator:), περνώντας τον χαρακτήρα διαχωρισμού:

let evenIntsString = "2, 4, 6, 8, 10, 12"
let evenInts = evenIntsString.split(separator: ",")
// returns ["2", " 4", " 6", " 8", " 10", " 12"]

Αφαίρεση στοιχείων από έναν πίνακα

Μπορείς να αφαιρέσεις ένα στοιχείο σε μια δεδομένη θέση με τη μέθοδο remove(at:). Η θέση πρέπει να είναι μέσα στα έγκυρα όρια του πίνακα, αλλιώς προκαλείται σφάλμα κατά την εκτέλεση.

var oddInts = [1, 3, 5, 7, 9, 11, 13]
oddInts.remove(at: 3)
// oddInts is now [1, 3, 5, 9, 11, 13]

Για να αφαιρέσεις το τελευταίο στοιχείο ενός πίνακα, χρησιμοποίησε τη μέθοδο removeLast(). Η κλήση της removeLast() σε έναν κενό πίνακα προκαλεί σφάλμα κατά την εκτέλεση.

var oddInts = [1, 3, 5, 7, 9, 11, 13]
oddInts.removeLast()
// oddInts is now [1, 3, 5, 7, 9, 11]

Οδηγίες

Ως μέλλουσα μάγισσα, η Elyse πρέπει να εξασκηθεί στα βασικά. Έχει μια στοίβα από κάρτες που θέλει να χειριστεί.

Για να κάνει τα πράγματα λίγο πιο εύκολα, χρησιμοποιεί μόνο τις κάρτες 1 έως 10, έτσι ώστε η στοίβα από κάρτες της να μπορεί να αναπαρασταθεί με έναν πίνακα αριθμών. Η θέση μιας συγκεκριμένης κάρτας αντιστοιχεί στη θέση μέσα στον πίνακα. Δηλαδή, η θέση 0 αναφέρεται στην πρώτη κάρτα, η θέση 1 στη δεύτερη κάρτα κ.ο.κ.

Note

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

1. Πάρε μια κάρτα από τη στοίβα

Για να πάρεις μια κάρτα, επέστρεψε την κάρτα στη θέση position από τη δεδομένη στοίβα.

Υλοποίησε τη συνάρτηση getCard(at:from:) που παίρνει δύο ορίσματα: το at που είναι η θέση της κάρτας στη στοίβα, και το from που είναι η στοίβα με τις κάρτες. Η συνάρτηση θα πρέπει να επιστρέφει την κάρτα στη θέση index από τη δεδομένη στοίβα.

let index = 2
getCard(at: index, from: [1, 2, 4, 1])
// returns 4

2. Άλλαξε μια κάρτα στη στοίβα

Κάνε λίγη ταχυδακτυλουργία και αντάλλαξε την κάρτα στη θέση position με την κάρτα αντικατάστασης που δίνεται.

Υλοποίησε τη συνάρτηση setCard(at:in:to) που παίρνει τρία ορίσματα: το at που είναι η θέση της κάρτας στη στοίβα, το in που είναι η στοίβα με τις κάρτες, και το to που είναι η νέα κάρτα για να αντικαταστήσει την κάρτα στη θέση index. Η συνάρτηση θα πρέπει να επιστρέφει ένα αντίγραφο της στοίβας με την κάρτα στη θέση index αντικατεστημένη με τη νέα κάρτα. Αν το δοσμένο index δεν είναι έγκυρη θέση στη στοίβα, η αρχική στοίβα θα πρέπει να επιστραφεί, αμετάβλητη.

let index = 2
let newCard = 6
setCard(at: index, in: [1, 2, 4, 1], to: newCard)
// returns [1, 2, 6, 1]

3. Εισήγαγε μια κάρτα στην κορυφή της στοίβας

Κάνε μια κάρτα να εμφανιστεί εισάγοντας μια νέα κάρτα στην κορυφή της στοίβας.

Υλοποίησε τη συνάρτηση insert(_:atTopOf:) που παίρνει δύο ορίσματα: τη νέα κάρτα που θα εισαχθεί, και τη στοίβα με τις κάρτες. Η συνάρτηση θα πρέπει να επιστρέφει ένα αντίγραφο της στοίβας με τη νέα κάρτα που δίνεται προστιθέμενη στην κορυφή της στοίβας.

let newCard = 8
insert(newCard, atTopOf: [5, 9, 7, 1])
// returns [5, 9, 7, 1, 8]

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

Κάνε μια κάρτα να εξαφανιστεί αφαιρώντας την κάρτα στη δοσμένη θέση position από τη στοίβα.

Υλοποίησε τη συνάρτηση removeCard(at:from:) που παίρνει δύο ορίσματα: το at που είναι η θέση της κάρτας στη στοίβα, και το from που είναι η στοίβα με τις κάρτες. Η συνάρτηση θα πρέπει να επιστρέφει ένα αντίγραφο της στοίβας με την κάρτα στη θέση index αφαιρεμένη. Αν το δοσμένο index δεν είναι έγκυρη θέση στη στοίβα, η αρχική στοίβα θα πρέπει να επιστραφεί, αμετάβλητη.

let index = 2
removeCard(at: index, from: [3, 2, 6, 4, 8])
// returns [3, 2, 4, 8]

5. Εισήγαγε μια κάρτα στη στοίβα

Κάνε μια κάρτα να εμφανιστεί εισάγοντας μια νέα κάρτα στη δοσμένη θέση position μέσα στη στοίβα.

Υλοποίησε τη συνάρτηση insert(_:at:from:) που παίρνει τρία ορίσματα: τη νέα κάρτα που θα εισαχθεί, τη θέση στην οποία θα πρέπει να εισαχθεί η νέα κάρτα, και τη στοίβα με τις κάρτες. Η συνάρτηση θα πρέπει να επιστρέφει ένα αντίγραφο της στοίβας με τη νέα κάρτα που δίνεται προστιθέμενη στη δοσμένη θέση. Αν το δοσμένο index δεν είναι έγκυρη θέση στη στοίβα, η αρχική στοίβα θα πρέπει να επιστραφεί, αμετάβλητη.

let newCard = 8
insert(newCard, at: 2, from: [5, 9, 7, 1])
// returns [5, 9, 8, 7, 1]

6. Έλεγξε το μέγεθος της στοίβας

Έλεγξε αν το μέγεθος της στοίβας είναι ίσο με stackSize ή όχι.

Υλοποίησε τη συνάρτηση checkSizeOfStack(_:_:) που παίρνει δύο ορίσματα: το stack που είναι η στοίβα με τις κάρτες, και το stackSize που είναι το μέγεθος της στοίβας. Η συνάρτηση θα πρέπει να επιστρέφει true αν το μέγεθος της στοίβας είναι ίσο με stackSize και false διαφορετικά.

let stackSize = 4
checkSizeOfStack([3, 2, 6, 4, 8], stackSize)
// returns false
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Swift Exercism

Έτοιμος να ξεκινήσεις την άσκηση Μαθητευόμενος μάγος;

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