Tracks
/
Go
Go
/
Ejercicios
/
Tienda asquerosa
Tienda asquerosa

Tienda asquerosa

Ejercicio de aprendizaje

Introducción

En Go, map es un tipo de dato integrado que asocia claves a valores. En otros lenguajes de programación, quizá ya conozcas el concepto de map como diccionario, tabla hash, almacén de clave/valor o array asociativo.

Sintácticamente, map se ve así:

map[KeyType]ElementType

También es importante saber que cada clave es única, lo que significa que asignar la misma clave dos veces sobrescribirá el valor de la clave correspondiente.

Para crear un map, puedes hacer:

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

o

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

Estas son algunas operaciones que puedes hacer con un 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")

Si intentas obtener el valor de una clave que no existe en el map, obtendrás el valor cero del tipo de valor. Esto puede confundirte, sobre todo si el valor predeterminado de tu ElementType (por ejemplo, 0 para un int) es un valor válido. Para comprobar si una clave existe en tu map, puedes usar

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

Instrucciones

Un amigo tuyo tiene una tienda mayorista antigua llamada Gross Store. El nombre viene de la cantidad del artículo que vende la tienda: todo se mide en gruesas. Tu amigo te pidió que implementaras un sistema de punto de venta (POS) para su tienda. Primero, quieres construir un prototipo. En tu prototipo, tu sistema solo registrará la cantidad. Tu amigo te dio una lista de medidas para ayudarte:

Unidad Valor
quarter_of_a_dozen 3
half_of_a_dozen 6
dozen 12
small_gross 120
gross 144
great_gross 1728

1. Guarda la unidad de medida en tu programa

Para usar la medida, necesitas guardarla en tu programa.

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

2. Crea una nueva cuenta para el cliente

Necesitas implementar una función que cree una cuenta nueva (vacía) para el cliente.

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

3. Agrega un artículo a la cuenta del cliente

Para implementar esto, necesitas:

  • Devolver false si la unit dada no está en el mapa units.
  • De lo contrario, agregar el artículo a la bill del cliente, indexado por el nombre del artículo, y luego devolver true.
  • Si el artículo ya está en la cuenta, aumentar su cantidad en el valor que corresponde a la unit proporcionada.
bill := NewBill()
units := Units()
ok := AddItem(bill, units, "carrot", "dozen")
fmt.Println(ok)
// Output: true (since dozen is a valid unit)

Ten en cuenta que el valor devuelto es de tipo bool.

4. Elimina un artículo de la cuenta del cliente

Para implementar esto, necesitas:

  • Devolver false si el artículo dado no está en la cuenta.
  • Devolver false si la unit dada no está en el mapa units.
  • Devolver false si la nueva cantidad fuera menor que 0.
  • Si la nueva cantidad es 0, eliminar por completo el artículo de la bill y luego devolver true.
  • De lo contrario, reducir la cantidad del artículo y devolver true.
bill := NewBill()
units := Units()
ok := RemoveItem(bill, units, "carrot", "dozen")
fmt.Println(ok)
// Output: false (because there are no carrots in the bill)

Ten en cuenta que el valor devuelto es de tipo bool.

5. Devuelve la cantidad de un artículo específico que está en la cuenta del cliente

Para implementar esto, necesitas:

  • Devolver 0 y false si el item no está en la cuenta.
  • De lo contrario, devolver la cantidad del artículo en la bill y true.
bill := map[string]int{"carrot": 12, "grapes": 3}
qty, ok := GetItem(bill, "carrot")
fmt.Println(qty)
// Output: 12
fmt.Println(ok)
// Output: true

Ten en cuenta que los valores devueltos son de tipo int y bool.

Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
Go Exercism

¿Todo listo para empezar Tienda asquerosa?

Regístrate en Exercism para aprender y dominar Go con 34 conceptos165 ejercicios y mentoría humana real, todo gratis.