Εργάζεσαι σε μια εταιρεία που φτιάχνει ένα διαδικτυακό παιχνίδι για πολλούς παίκτες, το Lexiconia.
Για να παίξεις το παιχνίδι, κάθε παίκτης παίρνει 13 γράμματα, τα οποία πρέπει να αναδιατάξει για να σχηματίσει λέξεις. Διαφορετικά γράμματα έχουν διαφορετική αξία πόντων, αφού με μερικά γράμματα είναι πιο εύκολο να σχηματίσεις λέξεις απ' ό,τι με άλλα.
Το παιχνίδι κυκλοφόρησε αρχικά στα αγγλικά, αλλά είναι πολύ δημοφιλές, και τώρα η εταιρεία θέλει να επεκταθεί και σε άλλες γλώσσες.
Διαφορετικές γλώσσες χρειάζεται να υποστηρίζουν διαφορετικές τιμές πόντων για τα γράμματα. Οι τιμές πόντων καθορίζονται από το πόσο συχνά χρησιμοποιούνται τα γράμματα σε σχέση με τα άλλα γράμματα αυτής της γλώσσας.
Για παράδειγμα, το γράμμα 'C' είναι αρκετά συνηθισμένο στα αγγλικά, και αξίζει μόνο 3 πόντους. Στα νορβηγικά όμως είναι ένα πολύ σπάνιο γράμμα, και αξίζει 10 πόντους.
Για να είναι πιο εύκολη η προσθήκη νέων γλώσσων, η ομάδα σου πρέπει να αλλάξει τον τρόπο με τον οποίο αποθηκεύονται στο παιχνίδι τα γράμματα και οι τιμές τους.
Η αποστολή σου είναι να αλλάξεις τη μορφή δεδομένων των γραμμάτων και των βαθμών τους στο παιχνίδι.
Προς το παρόν, τα γράμματα είναι αποθηκευμένα σε ομάδες με βάση τη βαθμολογία τους, σε αντιστοίχιση ένα-προς-πολλά.
Αυτό πρέπει να αλλάξει ώστε να αποθηκεύεται κάθε μεμονωμένο γράμμα με τη βαθμολογία του σε αντιστοίχιση ένα-προς-ένα.
Ως μέρος αυτής της αλλαγής, η ομάδα αποφάσισε επίσης να αλλάξει τα γράμματα σε πεζά αντί για κεφαλαία.
Αν θέλεις να δεις πώς ήταν δομημένα προηγουμένως τα δεδομένα και πώς πρέπει να αλλάξουν, ρίξε μια ματιά στα παραδείγματα στη σουίτα δοκιμών.
Αυτή η άσκηση δουλεύει με δεδομένα κειμένου. Για ιστορικούς λόγους, ο τύπος String της Haskell είναι συνώνυμος με τον [Char], μια λίστα από χαρακτήρες. Για πιο αποδοτικό χειρισμό δεδομένων κειμένου, μπορεί να χρησιμοποιηθεί ο τύπος Text.
Ως προαιρετική επέκταση αυτής της άσκησης, μπορείς να
Διαβάσεις για τους τύπους συμβολοσειρών στην Haskell.
Προσθέσεις το - text στη λίστα εξαρτήσεών σου στο package.yaml.
Κάνεις εισαγωγή του Data.Text με τον παρακάτω τρόπο:
import qualified Data.Text as T
import Data.Text (Text)
Μπορείς τώρα να γράψεις π.χ. transform :: Map Int Text -> Map Char Int και να αναφερθείς στους συνδυαστές του Data.Text ως π.χ. T.toLower.
Να ψάξεις την τεκμηρίωση για το Data.Text.
Αυτό το μέρος είναι εντελώς προαιρετικό.
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Haskell με 107 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.