Tracks
/
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 datos 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 lectura de memoria, ya que acceder a un elemento es una operación de tiempo constante. Por lo general, no se usan cuando puede ser necesario agregar o quitar elementos de forma dinámica, porque en lugar de modificar la tupla existente se crea una tupla 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, usando índices que empiezan 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 predomina 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, las variables de la izquierda quedan enlazadas y se devuelve el valor del lado derecho. Si no hay coincidencia, se genera 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 del lado derecho al lado izquierdo.

En el último ejemplo, si no necesitamos una variable en una coincidencia de patrones, podemos descartarla usando _. El entorno de ejecución no hace seguimiento de ninguna variable que empiece con _.

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. Se puede usar la coincidencia de patrones en los argumentos de las funciones, 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 se pueden enlazar en el encabezado de la función y usar 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, descubriste que tienes que convertir algunas de las medidas que usa la receta. Como solo conoces el sistema métrico, necesitas idear una forma de convertir las medidas de repostería estadounidenses comunes a mililitros (mL) para que te resulte más fácil.

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 talentoso 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. Obtén 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. Convierte 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 múltiples cláusulas de función y 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. Convierte 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 múltiples cláusulas de función y 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. Convierte 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 una pestaña nuevas
Elixir Exercism

¿Todo 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.