Rutas
/
Go
Go
/
Ejercicios
/
Tienda al por mayor
Tienda al por mayor

Tienda al por mayor

Ejercicio de aprendizaje

Introducción

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

Desde el punto de vista sintáctico, map tiene este aspecto:

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 lo siguiente:

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

o

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

Aquí tienes 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, se devolverá el valor cero del tipo del 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 vieja tienda mayorista 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 crear un prototipo. En tu prototipo, tu sistema solo registrará la cantidad. Tu amigo te ha dado 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 poder usar la medida, necesitas guardar la medida en tu programa.

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

2. Crea una nueva factura de cliente

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

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

3. Añade un artículo a la factura del cliente

Para implementar esto, tendrás que:

  • Devolver false si la unit dada no está en el mapa units.
  • En caso contrario, añadir 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á presente en la factura, aumentar su cantidad en la cantidad 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 factura del cliente

Para implementar esto, tendrás que:

  • Devolver false si el artículo dado no está en la factura.
  • 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.
  • En caso 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 factura del cliente

Para implementar esto, tendrás que:

  • Devolver 0 y false si el item no está en la factura.
  • En caso 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 pestaña nueva
Go Exercism

¿Listo para empezar Tienda al por mayor?

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