Gross Store

Gross Store

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

Εισαγωγή

Στη Go, το map είναι ένας ενσωματωμένος τύπος δεδομένων που αντιστοιχίζει κλειδιά σε τιμές. Σε άλλες γλώσσες προγραμματισμού, ίσως να είσαι εξοικειωμένος με την έννοια του map ως λεξικό, πίνακα κατακερματισμού, αποθήκη κλειδιού/τιμής ή συσχετιστικό πίνακα.

Συντακτικά, το map μοιάζει κάπως έτσι:

map[KeyType]ElementType

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

Για να δημιουργήσεις ένα map, μπορείς να κάνεις:

  // With map literal
  foo := map[string]int{}

ή

  // or with make function
  foo := make(map[string]int)

Εδώ είναι μερικές πράξεις που μπορείς να κάνεις με ένα map

  // Add a value in a map with the `=` operator:
  foo["bar"] = 42
  // Here we update the element of `bar`
  foo["bar"] = 73
  // To retrieve a map value, you can use
  baz := foo["bar"]
  // To delete an item from a map, you can use
  delete(foo, "bar")

Αν προσπαθήσεις να ανακτήσεις την τιμή για ένα κλειδί που δεν υπάρχει στο map, θα σου επιστρέψει τη μηδενική τιμή του τύπου τιμών. Αυτό μπορεί να σε μπερδέψει, ειδικά αν η προεπιλεγμένη τιμή του ElementType σου (για παράδειγμα, το 0 για έναν int) είναι μια έγκυρη τιμή. Για να ελέγξεις αν ένα κλειδί υπάρχει στο map σου, μπορείς να χρησιμοποιήσεις

  value, exists := foo["baz"]
  // If the key "baz" does not exist,
  // value: 0; exists: false

Οδηγίες

Ένας φίλος σου έχει ένα παλιό κατάστημα χονδρικής που λέγεται Gross Store. Το όνομα προέρχεται από την ποσότητα των ειδών που πουλάει το κατάστημα: όλα είναι σε μονάδες gross. Ο φίλος σου σου ζήτησε να υλοποιήσεις ένα σύστημα σημείου πώλησης (POS) για το κατάστημά του. Πρώτα, θέλεις να φτιάξεις ένα πρωτότυπο γι' αυτό. Στο πρωτότυπό σου, το σύστημα θα καταγράφει μόνο την ποσότητα. Ο φίλος σου σου έδωσε μια λίστα με μονάδες μέτρησης για να σε βοηθήσει:

Μονάδα Αξία
quarter_of_a_dozen 3
half_of_a_dozen 6
dozen 12
small_gross 120
gross 144
great_gross 1728

1. Αποθήκευσε τη μονάδα μέτρησης στο πρόγραμμά σου

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

units := Units()
fmt.Println(units)
// Output: map[...] with entries like ("dozen": 12)

2. Δημιούργησε έναν νέο λογαριασμό πελάτη

Πρέπει να υλοποιήσεις μια συνάρτηση που δημιουργεί έναν νέο (κενό) λογαριασμό για τον πελάτη.

bill := NewBill()
fmt.Println(bill)
// Output: map[]

3. Πρόσθεσε ένα είδος στον λογαριασμό του πελάτη

Για να το υλοποιήσεις, θα χρειαστεί να:

  • Να επιστρέψεις false αν το unit που δίνεται δεν υπάρχει στο map units.
  • Διαφορετικά, να προσθέσεις το είδος στον bill του πελάτη, με κλειδί το όνομα του είδους, και μετά να επιστρέψεις true.
  • Αν το είδος υπάρχει ήδη στον λογαριασμό, να αυξήσεις την ποσότητά του κατά το ποσό που αντιστοιχεί στο unit που δίνεται.
bill := NewBill()
units := Units()
ok := AddItem(bill, units, "carrot", "dozen")
fmt.Println(ok)
// Output: true (since dozen is a valid unit)

Σημείωσε ότι η τιμή που επιστρέφεται είναι τύπου bool.

4. Αφαίρεσε ένα είδος από τον λογαριασμό του πελάτη

Για να το υλοποιήσεις, θα χρειαστεί να:

  • Να επιστρέψεις false αν το είδος που δίνεται δεν υπάρχει στον λογαριασμό
  • Να επιστρέψεις false αν το unit που δίνεται δεν υπάρχει στο map units.
  • Να επιστρέψεις false αν η νέα ποσότητα θα ήταν μικρότερη από 0.
  • Αν η νέα ποσότητα είναι 0, να αφαιρέσεις εντελώς το είδος από τον bill και μετά να επιστρέψεις true.
  • Διαφορετικά, να μειώσεις την ποσότητα του είδους και να επιστρέψεις true.
bill := NewBill()
units := Units()
ok := RemoveItem(bill, units, "carrot", "dozen")
fmt.Println(ok)
// Output: false (because there are no carrots in the bill)

Σημείωσε ότι η τιμή που επιστρέφεται είναι τύπου bool.

5. Επίστρεψε την ποσότητα ενός συγκεκριμένου είδους που υπάρχει στον λογαριασμό του πελάτη

Για να το υλοποιήσεις, θα χρειαστεί να:

  • Να επιστρέψεις 0 και false αν το item δεν υπάρχει στον λογαριασμό.
  • Διαφορετικά, να επιστρέψεις την ποσότητα του είδους στον bill και true.
bill := map[string]int{"carrot": 12, "grapes": 3}
qty, ok := GetItem(bill, "carrot")
fmt.Println(qty)
// Output: 12
fmt.Println(ok)
// Output: true

Σημείωσε ότι οι τιμές που επιστρέφονται είναι τύπων int και bool.

Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Go Exercism

Έτοιμος να ξεκινήσεις την άσκηση Gross Store;

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