Rutas
/
Elixir
Elixir
/
Ejercicios
/
Calculadora de cocina
Calculadora de cocina

Calculadora de cocina

Ejercicio de aprendizaje

Introducción

Tuplas

En Elixir, una tupla es una estructura de datos que organiza información y que contiene un número fijo de elementos de cualquier tipo, pero sin nombres explícitos para cada elemento. Las tuplas se usan a menudo en Elixir para operaciones que hacen un uso intensivo de la lectura de memoria, ya que el acceso de lectura a un elemento es una operación de tiempo constante. No suelen usarse cuando puede ser necesario añadir o eliminar elementos de forma dinámica, porque en lugar de modificar la tupla existente se crea una nueva, lo que requiere reservar memoria de antemano.

En la práctica, las tuplas se crean en Elixir con llaves. Se puede acceder a cada elemento de una tupla por separado con la función elem/2 mediante indexación basada en 0:

empty_tuple = {}
one_element_tuple = {1}
multiple_element_tuple = {1, :a, "hello"}

elem(multiple_element_tuple, 2)
# => "hello"

Las tuplas como información agrupada

En la práctica, las tuplas se usan a menudo para representar información agrupada.

Float.ratio(0.25)
# => {1, 4} indicating the numerator and denominator of the fraction ¼

Coincidencia de patrones

El uso de la coincidencia de patrones es dominante en el código Elixir idiomático y asertivo. Quizá recuerdes que =/2 se describe como un operador de coincidencia y no como un operador de asignación. Cuando usas el operador de coincidencia, si el patrón de la izquierda coincide con el de la derecha, se vinculan las variables de la izquierda y se devuelve el valor del lado derecho. Si no hay coincidencia, se lanza un MatchError.

2 = 2
# => 2
# Literals can be matched if they are the same

2 = 3
# => ** (MatchError) no match of right hand side value: 3

{_, denominator} = Float.ratio(0.25)
# => {1, 4}
# the variable `denominator` is bound to the value 4

Recuerda que las coincidencias se producen de derecha a izquierda.

En el último ejemplo, si no necesitamos una variable en una coincidencia de patrones, podemos descartarla haciendo referencia a _. El runtime no hace un seguimiento de ninguna variable que empiece por _.

Coincidencia de patrones en funciones con nombre

La coincidencia de patrones también es una herramienta útil cuando se crean varias cláusulas de función. La coincidencia de patrones puede aplicarse a los argumentos de la función, lo que determina qué cláusula de función se invoca, empezando por la parte superior del archivo y bajando hasta la primera coincidencia. Las variables pueden vincularse en la cabecera de la función y usarse en el cuerpo de la función.

defmodule Example do
  def named_function(:a = variable_a) do
    {variable_a, 1}
  end

  def named_function(:b = variable_b) do
    {variable_b, 2}
  end
end

Example.named_function(:a)
# => {:a, 1}

Example.named_function(:b)
# => {:b, 2}

Example.named_function(:c)
# => ** (FunctionClauseError) no function clause matching in Example.named_function/1

Instrucciones

Mientras te preparabas para hornear galletas para tus amigos, te has dado cuenta de que tienes que convertir algunas de las medidas que se usan en la receta. Como solo conoces el sistema métrico, necesitas idear una forma de convertir las medidas de repostería estadounidenses habituales a mililitros (mL) para tu propia comodidad.

Usa esta tabla de conversión para tu solución:

Unidad a convertir volumen en mililitros (mL)
mL 1 1
Taza estadounidense 1 240
Onza líquida estadounidense 1 30
Cucharadita estadounidense 1 5
Cucharada estadounidense 1 15

Como eres un programador con talento en formación, decides usar los mililitros como unidad intermedia para facilitar la conversión de cualquier unidad de la lista a cualquier otra (incluso a sí misma).

1. Obtener el componente numérico de un par de volumen

Implementa la función KitchenCalculator.get_volume/1. Dada una tupla de par de volumen, debe devolver solo el componente numérico.

KitchenCalculator.get_volume({:cup, 2.0})
# => 2.0

2. Convertir el par de volumen a mililitros

Implementa la función KitchenCalculator.to_milliliter/1. Dada una tupla de par de volumen, debe convertir el volumen a mililitros usando la tabla de conversión.

Usa varias cláusulas de función y la coincidencia de patrones para crear las funciones de cada unidad. Los átomos que se usan para denotar cada unidad son: :cup, :fluid_ounce, :teaspoon, :tablespoon, :milliliter. Devuelve el resultado de la conversión envuelto en una tupla.

KitchenCalculator.to_milliliter({:cup, 2.5})
# => {:milliliter, 600.0}

3. Convertir el par de volumen en mililitros a otra unidad

Implementa la función KitchenCalculator.from_milliliter/2. Dada una tupla de par de volumen y la unidad deseada, debe convertir el volumen a la unidad deseada usando la tabla de conversión.

Usa varias cláusulas de función y la coincidencia de patrones para crear las funciones de cada unidad. Los átomos que se usan para denotar cada unidad son: :cup, :fluid_ounce, :teaspoon, :tablespoon, :milliliter

KitchenCalculator.from_milliliter({:milliliter, 1320.0}, :cup)
# => {:cup, 5.5}

4. Convertir de cualquier unidad a cualquier unidad

Implementa la función KitchenCalculator.convert/2. Dada una tupla de par de volumen y la unidad deseada, debe convertir el volumen dado a la unidad deseada.

KitchenCalculator.convert({:teaspoon, 9.0}, :tablespoon)
# => {:tablespoon, 3.0}
Editar en GitHub El enlace se abre en una ventana o pestaña nueva
Elixir Exercism

¿Listo para empezar Calculadora de cocina?

Regístrate en Exercism para aprender y dominar Elixir con 58 conceptos168 ejercicios y mentoría humana real, todo gratis.