Διαδρομές
/
Swift
Swift
/
Ασκήσεις
/
Ο πρώτος κανόνας της λέσχης ποίησης
Ο πρώτος κανόνας της λέσχης ποίησης

Ο πρώτος κανόνας της λέσχης ποίησης

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

Εισαγωγή

Εισαγωγή μονάδων

Ενώ η Swift προσφέρει πλούσια λειτουργικότητα στην Τυπική Βιβλιοθήκη της, μπορείς να αποκτήσεις πρόσβαση σε πολλές επιπλέον δυνατότητες εισάγοντας εξωτερικές βιβλιοθήκες και frameworks. Αυτές οι μονάδες μπορεί να προέρχονται απευθείας από το έργο της Swift (όπως ο Swift Argument Parser), από frameworks της πλατφόρμας της Apple (όπως το Foundation και το Network Framework), ή από βιβλιοθήκες τρίτων ανοιχτού κώδικα (όπως το SwiftyBeaver).

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

Η εισαγωγή μονάδων γίνεται γράφοντας τη λέξη-κλειδί import ακολουθούμενη από το όνομα της μονάδας. Έτσι, μπορείς να εισαγάγεις το Foundation προσθέτοντας τα παρακάτω στο πρόγραμμά σου.

import Foundation

Η εισαγωγή μιας μονάδας κάνει τους τύπους, τις μεθόδους και τις συναρτήσεις της διαθέσιμα στον κώδικά σου. Για παράδειγμα, η εισαγωγή του Foundation επεκτείνει το String με χρήσιμες βοηθητικές μεθόδους, όπως η components(separatedBy:).

Κατά σύμβαση, οι εντολές import τοποθετούνται στην αρχή ενός αρχείου Swift, ώστε οι εξαρτήσεις να είναι αμέσως ορατές σε όποιον διαβάζει τον κώδικα.

Θέσεις σε συμβολοσειρές

Μπορείς να προσπελάσεις μεμονωμένους χαρακτήρες σε ένα String χρησιμοποιώντας τον ίδιο τρόπο πρόσβασης με θέση που χρησιμοποιείς και με τους πίνακες. Ωστόσο, οι θέσεις που χρησιμοποιούνται για τις συμβολοσειρές δεν είναι ακέραιοι αριθμοί και δεν μπορείς να δουλέψεις απευθείας μαζί τους. Αντ' αυτού, πρέπει να υπολογιστούν με βάση κάποια άλλη γνωστή θέση, όπως το startIndex, που δείχνει τη θέση του πρώτου χαρακτήρα σε μια μη κενή συμβολοσειρά, χρησιμοποιώντας τις μεθόδους που είναι διαθέσιμες στις βιβλιοθήκες String και NSString (όταν έχει εισαχθεί η μονάδα Foundation, οι συμβολοσειρές στη Swift έχουν πρόσβαση σε όλες τις ιδιότητες και τις μεθόδους της NSString).

Για παράδειγμα, δεδομένης της παρακάτω συμβολοσειράς:

let csv = "apple,pear,peach,orange,cherry,lime,goosberry"

Δεν μπορείς να γράψεις csv[21] για να πάρεις το "g" στο "orange"· αντ' αυτού, πρέπει να υπολογίσεις μια τιμή τύπου String.Index και να δώσεις αυτή τη θέση. Σημείωσε ότι αυτές οι θέσεις δεν προορίζονται να είναι κατανοητές από τον άνθρωπο από μόνες τους. Είναι αυτό που ονομάζεται αδιαφανείς θέσεις, καθώς οι άνθρωποι δεν χρειάζεται να ξέρουν τι υπάρχει μέσα τους.

let index = csv.index(csv.startIndex, offsetBy: 21)
csv[index]
// "g"
print(index)
// prints Index(_rawBits: 1376513)

Σημείωσε, ωστόσο, ότι αν το offset δεν είναι έγκυρη θέση, δηλαδή αν επιστρέφει τη θέση πριν από το startIndex ή μετά το endIndex, η λειτουργία θα πετάξει ένα σφάλμα, τερματίζοντας το πρόγραμμα. Για να αποτρέψεις αυτό το πρόβλημα, μπορείς να ορίσεις μια οριακή θέση. Αυτή επιστρέφει μια προαιρετική θέση και θα επιστρέψει nil για θέσεις που κατά τα άλλα είναι μη έγκυρες.

let tooFar = csv.index(csv.startIndex, offsetBy: 200)
// error: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0).
let tooFarButSafe = csv.index(csv.startIndex, offsetBy: 200, limitedBy: csv.endIndex)
// nil

Επιπλέον, οι θέσεις δεν μπορούν να μοιράζονται μεταξύ συμβολοσειρών. Για παράδειγμα, χρησιμοποιώντας τη θέση index του "g" στο "orange" που υπολογίστηκε παραπάνω για να δείξεις μέσα στη συμβολοσειρά fam = "This is my family: 👨‍👩‍👦‍👦, this is our dog: 🐶, this is our cat: 🐱!", δηλαδή fam[index], θα τερματίσει το πρόγραμμά σου.

Υπάρχουν πολλοί λόγοι για όλα αυτά, αλλά όλοι βασικά συνοψίζονται στο ότι "το Unicode είναι μπερδεμένο".

Γενικά μιλώντας, αν χρειάζεσαι τυχαία πρόσβαση σε μεμονωμένους χαρακτήρες, πιθανότατα θέλεις να χρησιμοποιήσεις κάποια άλλη δομή δεδομένων, όπως έναν Array<Character>.

Κάποιες χρήσιμες μέθοδοι

Η Swift έχει τις μεθόδους first και last για να πάρεις τον πρώτο και τον τελευταίο χαρακτήρα μιας συμβολοσειράς. Αυτές οι μέθοδοι επιστρέφουν έναν προαιρετικό χαρακτήρα, οπότε αν η συμβολοσειρά είναι κενή, θα επιστρέψουν nil.

let str = "Hello, world!"
print(str.first) // Prints Optional("H")
print(str.last)  // Prints Optional("!")

Μπορείς επίσης να χρησιμοποιήσεις τις μεθόδους prefix και suffix για να πάρεις μια υποσυμβολοσειρά. Αυτές οι μέθοδοι δέχονται έναν ακέραιο ως όρισμα και επιστρέφουν μια υποσυμβολοσειρά που περιέχει τους πρώτους ή τους τελευταίους n χαρακτήρες της συμβολοσειράς.

let str = "Hello, world!"
print(str.prefix(5)) // Prints "Hello"
print(str.suffix(6)) // Prints "world!"

Μέθοδοι συμβολοσειρών

Το να δουλεύεις με κείμενο είναι κάτι συνηθισμένο στον προγραμματισμό. Η Swift, μαζί με το framework Foundation, παρέχει πολλές βολικές μεθόδους και ιδιότητες για να επιθεωρείς, να μετασχηματίζεις και να χειρίζεσαι συμβολοσειρές.

Διαχωρισμός συμβολοσειρών με components(separatedBy:)

Για να χωρίσεις μια συμβολοσειρά σε έναν πίνακα υποσυμβολοσειρών με βάση έναν διαχωριστικό, χρησιμοποίησε τη components(separatedBy:) (απαιτείται η εισαγωγή του Foundation):

import Foundation

let sentence = "Hello, world!"
let words = sentence.components(separatedBy: " ")
print(words) // Prints ["Hello,", "world!"]

Έλεγχος προθεμάτων και καταλήξεων με hasPrefix(_:) και hasSuffix(_:)

Για να ελέγξεις αν μια συμβολοσειρά αρχίζει ή τελειώνει με μια συγκεκριμένη ακολουθία χαρακτήρων, χρησιμοποίησε τη hasPrefix(_:) και τη hasSuffix(_:):

let greeting = "Hello, world!"
print(greeting.hasPrefix("Hello"))  // Prints true
print(greeting.hasSuffix("world!")) // Prints true

Αλλαγή πεζών/κεφαλαίων

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

  • lowercased(): Επιστρέφει ένα αντίγραφο της συμβολοσειράς με πεζούς χαρακτήρες.
  • uppercased(): Επιστρέφει ένα αντίγραφο της συμβολοσειράς με κεφαλαίους χαρακτήρες.
  • capitalized: Επιστρέφει ένα αντίγραφο όπου το πρώτο γράμμα κάθε λέξης είναι κεφαλαίο (από το Foundation).
let greeting = "hello, world!"
print(greeting.lowercased())  // Prints "hello, world!"
print(greeting.uppercased())  // Prints "HELLO, WORLD!"
print(greeting.capitalized)   // Prints "Hello, World!"

Αντικατάσταση υποσυμβολοσειρών με replacingOccurrences(of:with:)

Για να αντικαταστήσεις όλες τις εμφανίσεις μιας υποσυμβολοσειράς-στόχου με μια άλλη συμβολοσειρά, χρησιμοποίησε τη replacingOccurrences(of:with:) (από το Foundation):

let greeting = "Hello, world!"
let updated = greeting.replacingOccurrences(of: "world", with: "Swift")
print(updated) // Prints "Hello, Swift!"

Ένωση συμβολοσειρών με joined(separator:)

Η μέθοδος joined(separator:) ανήκει σε συλλογές συμβολοσειρών, όπως η [String]. Ενώνει τα στοιχεία μεταξύ τους σε μία μόνο συμβολοσειρά χρησιμοποιώντας έναν διαχωριστικό:

let words = ["Hello", "world"]
let sentence = words.joined(separator: ", ")
print(sentence) // Prints "Hello, world"

Οδηγίες

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

Υπάρχουν δύο πόρτες στο κλαμπ ποίησης και οι δύο είναι φυλασσόμενες. Για να μπεις, θα πρέπει να βρεις τον κωδικό της ημέρας:

1. Χώρισε μια συμβολοσειρά σε ξεχωριστές γραμμές

Το πρώτο πράγμα που πρέπει να κάνεις είναι να χωρίσεις το ποίημα σε ξεχωριστές γραμμές. Ο φρουρός θα απαγγείλει ένα ποίημα και εσύ θα πρέπει να το χωρίσεις σε γραμμές.

Υλοποίησε τη συνάρτηση splitOnNewlines που παίρνει μια συμβολοσειρά και τη χωρίζει σε έναν πίνακα συμβολοσειρών, χρησιμοποιώντας τον χαρακτήρα αλλαγής γραμμής ως διαχωριστικό. Η συνάρτηση θα πρέπει να επιστρέφει έναν πίνακα συμβολοσειρών, όπου κάθε συμβολοσειρά είναι μια γραμμή του ποιήματος.

splitOnNewlines("Hello.\nHow are you?\n\nI'm doing fine.")
// returns ["Hello." ,"How are you?", "", "I'm doing fine"].

2. Μπροστινή πόρτα

  1. Ο φρουρός θα απαγγείλει ένα ποίημα
  2. Θα πρέπει να χωρίσεις το ποίημα σε ξεχωριστές γραμμές.
  3. Θα πρέπει να πάρεις το πρώτο γράμμα κάθε γραμμής.
    • Αν η γραμμή είναι κενή, θα πρέπει να χρησιμοποιήσεις το _ αντ' αυτού.
  4. Θα πρέπει να ενώσεις τα γράμματα, τα οποία θα σχηματίσουν μια λέξη.

Για παράδειγμα, ένας από τους αγαπημένους τους συγγραφείς είναι ο Michael Lockwood, ο οποίος έχει γράψει το παρακάτω ακροστιχικό ποίημα, που σημαίνει ότι το πρώτο γράμμα κάθε στίχου σχηματίζει μια λέξη:

Stands so high
Huge hooves too
Impatiently waits for
Reins and harness
Eager to leave

Όταν ο φρουρός απαγγείλει το ποίημα, θα το χωρίσεις σε ξεχωριστές γραμμές και θα απαντήσεις με τα πρώτα γράμματα κάθε γραμμής, δηλαδή ["S", "H", "I", "R", "E"].

Στη συνέχεια, ο φρουρός θα σου δώσει τη λέξη που σχηματίζεται από τον πίνακα γραμμάτων με τον οποίο απάντησες, για να τη μετατρέψεις σε μορφή με κεφαλαίο πρώτο γράμμα. Τελικά, ο κωδικός που θα επιστρέψεις είναι "SHIRE" και θα μπεις μέσα.

Υλοποίησε τη συνάρτηση frontDoorPassword που παίρνει μια συμβολοσειρά που αντιπροσωπεύει το ποίημα. Η συνάρτηση θα πρέπει να επιστρέφει τον κωδικό που θα έδινες στον φρουρό.

frontDoorPassword("Stands so high\nHuge hooves too\nImpatiently waits for\nReins and harness\nEager to leave")
// returns "SHIRE"

3. Πίσω πόρτα

Στο πίσω μέρος του κλαμπ θα βρεις τους πιο διάσημους ποιητές, κάτι σαν την περιοχή VIP. Επειδή αυτό δεν είναι για όλους, η διαδικασία της πίσω πόρτας είναι λίγο πιο περίπλοκη.

  1. Ο φρουρός θα απαγγείλει ένα ποίημα.
  2. Θα πρέπει να χωρίσεις το ποίημα σε γραμμές.
  3. Θα πρέπει να πάρεις το τελευταίο γράμμα κάθε γραμμής.
    • Μερικές φορές η γραμμή θα έχει κενά στο τέλος, οπότε θα πρέπει να τα αφαιρέσεις.
  4. Θα πρέπει να συναρμολογήσεις τα γράμματα και μετά να προσθέσεις το ", please" στο τέλος της λέξης που σχηματίζουν τα γράμματα.

Για παράδειγμα, το ποίημα που αναφέρθηκε προηγουμένως είναι επίσης τελεστιχικό, που σημαίνει ότι το τελευταίο γράμμα κάθε στίχου σχηματίζει μια λέξη:

Stands so high
Huge hooves too
Impatiently waits for
Reins and harness
Eager to leave

Όταν ο φρουρός απαγγείλει το ποίημα, θα το χωρίσεις σε ξεχωριστές γραμμές, θα αφαιρέσεις τυχόν κενά στο τέλος και θα απαντήσεις με τα τελευταία γράμματα κάθε γραμμής, δηλαδή ["h", "o", "r", "s", "e"].

Στη συνέχεια, ο φρουρός θα σου δώσει τη λέξη που σχηματίζεται από τον πίνακα γραμμάτων με τον οποίο απάντησες, για να τη μετατρέψεις σε μορφή με κεφαλαίο πρώτο γράμμα και να προσθέσεις στο τέλος το ", please". Τελικά, ο κωδικός που θα επιστρέψεις είναι "horse, please" και θα μπεις μέσα.

Υλοποίησε τη συνάρτηση backDoorPassword που παίρνει μια συμβολοσειρά που αντιπροσωπεύει το ποίημα. Η συνάρτηση θα πρέπει να επιστρέφει τον κωδικό που θα έδινες στον φρουρό.

backDoorPassword("Stands so high\nHuge hooves too\nImpatiently waits for\nReins and harness\nEager to leave")
// returns "horse, please"

4. Μυστικό δωμάτιο

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

  1. Ο φρουρός θα απαγγείλει ένα ποίημα.
  2. Θα πρέπει να χωρίσεις το ποίημα σε γραμμές.
  3. Θα πρέπει να πάρεις το ith γράμμα της ith γραμμής.
  4. Θα πρέπει να συναρμολογήσεις τα γράμματα και μετά να προσθέσεις το "!" στο τέλος της λέξης που σχηματίζουν τα γράμματα.
  5. Θα πρέπει να βάλεις τη λέξη σε μορφή με κεφαλαία γράμματα.

Για παράδειγμα, μια τροποποιημένη εκδοχή του ποιήματος που αναφέρθηκε προηγουμένως ταιριάζει με αυτό το μοτίβο:

Stands so high
Huge hooves too
Impatiently waits for
Rider with harness
Eager to leave

Όταν ο φρουρός απαγγείλει το ποίημα, θα το χωρίσεις σε ξεχωριστές γραμμές, θα αφαιρέσεις τυχόν κενά στο τέλος και θα απαντήσεις με τα ith γράμματα κάθε γραμμής, δηλαδή ["S", "u", "p", "e", "r"].

Στη συνέχεια, ο φρουρός θα σου δώσει τη λέξη που σχηματίζεται από τον πίνακα γραμμάτων με τον οποίο απάντησες, για να τη βάλεις σε μορφή με κεφαλαία γράμματα και να προσθέσεις στο τέλος το "!". Τελικά, ο κωδικός που θα επιστρέψεις είναι SUPER! και θα μπεις μέσα.

Υλοποίησε τη συνάρτηση secretRoomPassword που παίρνει μια συμβολοσειρά που αντιπροσωπεύει το ποίημα. Η συνάρτηση θα πρέπει να επιστρέφει τον κωδικό που θα έδινες στον φρουρό.

secretRoomPassword("Stands so high\nHuge hooves too\nImpatiently waits for\nRider with harness\nEager to leave")
// returns "SUPER!"
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Swift Exercism

Έτοιμος να ξεκινήσεις την άσκηση Ο πρώτος κανόνας της λέσχης ποίησης;

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