Διαδρομές
/
Go
Go
/
Ασκήσεις
/
Καταγραφές, καταγραφές, καταγραφές!
Καταγραφές, καταγραφές, καταγραφές!

Καταγραφές, καταγραφές, καταγραφές!

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

Εισαγωγή

Ο τύπος rune στη Go είναι ψευδώνυμο για τον int32. Δεδομένου αυτού του υποκείμενου τύπου int32, ο τύπος rune περιέχει μια ακέραια τιμή 32 bit με πρόσημο. Ωστόσο, σε αντίθεση με έναν τύπο int32, η ακέραια τιμή που αποθηκεύεται σε έναν τύπο rune αναπαριστά έναν μόνο χαρακτήρα Unicode.

Unicode και σημεία κώδικα Unicode

Το Unicode είναι ένα υπερσύνολο του ASCII που αναπαριστά χαρακτήρες αντιστοιχίζοντας έναν μοναδικό αριθμό σε κάθε χαρακτήρα. Αυτός ο μοναδικός αριθμός ονομάζεται σημείο κώδικα Unicode. Το Unicode στοχεύει να αναπαραστήσει όλους τους χαρακτήρες του κόσμου, συμπεριλαμβανομένων διαφόρων αλφαβήτων, αριθμών, συμβόλων και ακόμη και emoji, ως σημεία κώδικα Unicode.

Στη Go, ο τύπος rune αναπαριστά ένα μόνο σημείο κώδικα Unicode.

Ο παρακάτω πίνακας περιέχει παραδείγματα χαρακτήρων Unicode μαζί με το σημείο κώδικα Unicode και τη δεκαδική τιμή τους:

Χαρακτήρας Unicode Σημείο κώδικα Unicode Δεκαδική τιμή
0 U+0030 48
A U+0041 65
a U+0061 97
¿ U+00BF 191
π U+03C0 960
🧠 U+1F9E0 129504

UTF-8

Το UTF-8 είναι μια κωδικοποίηση χαρακτήρων μεταβλητού πλάτους που χρησιμοποιείται για να κωδικοποιήσει κάθε σημείο κώδικα Unicode σε 1, 2, 3 ή 4 bytes. Εφόσον ένα σημείο κώδικα Unicode μπορεί να κωδικοποιηθεί σε το πολύ 4 bytes, ο τύπος rune πρέπει να μπορεί να χωρέσει έως 4 bytes δεδομένων. Γι' αυτό ο τύπος rune είναι ψευδώνυμο για τον int32, καθώς ένας τύπος int32 μπορεί να χωρέσει έως 4 bytes δεδομένων.

Τα αρχεία πηγαίου κώδικα της Go κωδικοποιούνται με UTF-8.

Χρήση των rune

Οι μεταβλητές τύπου rune δηλώνονται τοποθετώντας έναν χαρακτήρα μέσα σε μονά εισαγωγικά:

myRune := '¿'

Εφόσον το rune είναι απλώς ένα ψευδώνυμο για τον int32, η εκτύπωση του τύπου ενός rune θα δώσει int32:

myRune := '¿'
fmt.Printf("myRune type: %T\n", myRune)
// Output: myRune type: int32

Παρομοίως, η εκτύπωση της τιμής ενός rune θα δώσει την ακέραια (δεκαδική) τιμή του:

myRune := '¿'
fmt.Printf("myRune value: %v\n", myRune)
// Output: myRune value: 191

Για να εκτυπώσεις τον χαρακτήρα Unicode που αναπαριστά το rune, χρησιμοποίησε το ρήμα μορφοποίησης %c:

myRune := '¿'
fmt.Printf("myRune Unicode character: %c\n", myRune)
// Output: myRune Unicode character: ¿

Για να εκτυπώσεις το σημείο κώδικα Unicode που αναπαριστά το rune, χρησιμοποίησε το ρήμα μορφοποίησης %U:

myRune := '¿'
fmt.Printf("myRune Unicode code point: %U\n", myRune)
// Output: myRune Unicode code point: U+00BF

rune και συμβολοσειρές

Οι συμβολοσειρές στη Go κωδικοποιούνται με UTF-8, που σημαίνει ότι περιέχουν χαρακτήρες Unicode. Οι χαρακτήρες μέσα σε συμβολοσειρές αποθηκεύονται και κωδικοποιούνται ως 1, 2, 3 ή 4 bytes, ανάλογα με τον χαρακτήρα Unicode που αναπαριστούν.

Στη Go, τα slices χρησιμοποιούνται για να αναπαραστήσουν ακολουθίες και σε αυτά τα slices μπορούμε να κάνουμε επανάληψη με το range. Όταν κάνουμε επανάληψη πάνω σε μια συμβολοσειρά, η Go μετατρέπει τη συμβολοσειρά σε μια σειρά από rune, καθένα από τα οποία είναι 4 bytes (θυμήσου, ο τύπος rune είναι ψευδώνυμο για τον int32!)

Ακόμη και αν μια συμβολοσειρά είναι απλώς ένα slice από bytes, η λέξη-κλειδί range διατρέχει τα rune μιας συμβολοσειράς, όχι τα bytes της.

Σε αυτό το παράδειγμα, η μεταβλητή index αναπαριστά τη θέση έναρξης της ακολουθίας bytes του τρέχοντος rune και η μεταβλητή char αναπαριστά το τρέχον rune:

myString := "❗hello"
for index, char := range myString {
  fmt.Printf("Index: %d\tCharacter: %c\t\tCode Point: %U\n", index, char, char)
}
// Output:
// Index: 0	Character: ❗		Code Point: U+2757
// Index: 3	Character: h		Code Point: U+0068
// Index: 4	Character: e		Code Point: U+0065
// Index: 5	Character: l		Code Point: U+006C
// Index: 6	Character: l		Code Point: U+006C
// Index: 7	Character: o		Code Point: U+006F

Εφόσον τα rune μπορούν να αποθηκευτούν ως 1, 2, 3 ή 4 bytes, το μήκος μιας συμβολοσειράς μπορεί να μην ισούται πάντα με τον αριθμό των χαρακτήρων της. Χρησιμοποίησε την ενσωματωμένη συνάρτηση len για να πάρεις το μήκος μιας συμβολοσειράς σε bytes και τη συνάρτηση utf8.RuneCountInString για να πάρεις τον αριθμό των rune σε μια συμβολοσειρά:

import "unicode/utf8"

myString := "❗hello"
stringLength := len(myString)
numberOfRunes := utf8.RuneCountInString(myString)

fmt.Printf("myString - Length: %d - Runes: %d\n", stringLength, numberOfRunes)
// Output: myString - Length: 8 - Runes: 6

Οδηγίες

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

1. Προσδιόρισε ποια εφαρμογή εξέπεμψε μια καταγραφή

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

Υλοποίησε τη συνάρτηση Application, η οποία δέχεται μια γραμμή καταγραφής και επιστρέφει την εφαρμογή που εξέπεμψε τη γραμμή καταγραφής.

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

Εφαρμογή Χαρακτήρας Σημείο κώδικα Unicode
recommendation ❗ U+2757
search 🔍 U+1F50D
weather ☀ U+2600

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

Application("❗ recommended search product 🔍")
// => recommendation

2. Διόρθωσε τις κατεστραμμένες καταγραφές

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

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

log := "please replace '👎' with '👍'"

Replace(log, '👎', '👍')
// => please replace '👍' with '👍'"

3. Προσδιόρισε αν μια καταγραφή μπορεί να εμφανιστεί

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

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

WithinLimit("hello❗", 6)
// => true
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Go Exercism

Έτοιμος να ξεκινήσεις την άσκηση Καταγραφές, καταγραφές, καταγραφές!;

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