Secretos

Secretos

Ejercicio de aprendizaje

Introducción

Funciones anónimas

Las funciones son ciudadanos de primera clase en Elixir. Esto significa que:

  • Las funciones con nombre y las funciones anónimas se pueden asignar a variables.
  • Las funciones con nombre y las funciones anónimas se pueden pasar de un lado a otro como datos, como argumentos y como valores devueltos.
  • Las funciones anónimas se pueden crear dinámicamente.

Las funciones anónimas, a diferencia de las funciones con nombre, no tienen una referencia estática disponible; solo existen si se asignan a una variable o se invocan de inmediato.

Podríamos usar funciones anónimas para:

  • Ocultar datos usando el ámbito léxico (también conocido como clausura).
  • Crear funciones dinámicamente en tiempo de ejecución.

Las funciones anónimas comienzan con la palabra reservada fn, los argumentos se separan del cuerpo de la función con el token ->, y terminan con un end. Al igual que con las funciones con nombre, la última expresión de la función se devuelve implícitamente a la función que la llamó.

Para invocar una referencia a una función, debes usar un . entre la variable de referencia y la lista de argumentos:

function_variable = fn param ->
  param + 1
end

function_variable.(1)
# => 2

Incluso puedes usar la notación abreviada de captura para que esto sea más conciso:

variable = &(&1 + 1)

variable.(1)
# => 2

Manipulación de bits

Elixir admite muchas funciones para trabajar con bits que se encuentran en el módulo Bitwise.

  • band/2: AND a nivel de bits
  • bsl/2: SHIFT LEFT a nivel de bits
  • bsr/2: SHIFT RIGHT a nivel de bits
  • bxor/2: XOR a nivel de bits
  • bor/2: OR a nivel de bits
  • bnot/1: NOT a nivel de bits

Aquí tienes un ejemplo de cómo usar una función bit a bit:

Bitwise.bsl(1, 3)
# => 8

Todas las funciones bit a bit solo funcionan con números enteros.

Si usas la versión 1.9 de Elixir o una anterior, deberás llamar a require Bitwise al inicio de la definición del módulo para poder usar el módulo Bitwise.

Instrucciones

En este ejercicio, tienes la tarea de escribir el software de un dispositivo de cifrado que funciona realizando transformaciones sobre los datos. Necesitas una forma flexible de crear funciones complicadas combinando funciones más simples.

Para cada tarea, devuelve una función anónima que se pueda llamar desde el ámbito donde se invoca.

Todas las funciones deben recibir argumentos enteros. Los enteros también son adecuados para realizar operaciones a nivel de bits en Elixir.

1. Crea un sumador

Implementa Secrets.secret_add/1. Debe devolver una función que reciba un argumento y le sume el argumento que se pasó a secret_add.

adder = Secrets.secret_add(3)
adder.(2)
# => 5

2. Crea un restador

Implementa Secrets.secret_subtract/1. Debe devolver una función que reciba un argumento y le reste a ese argumento el secreto que se pasó a secret_subtract.

subtractor = Secrets.secret_subtract(2)
subtractor.(3)
# => 1

3. Crea un multiplicador

Implementa Secrets.secret_multiply/1. Debe devolver una función que reciba un argumento y lo multiplique por el secreto que se pasó a secret_multiply.

multiplier = Secrets.secret_multiply(7)
multiplier.(3)
# => 21

4. Crea un divisor

Implementa Secrets.secret_divide/1. Debe devolver una función que reciba un argumento y lo divida entre el secreto que se pasó a secret_divide.

divider = Secrets.secret_divide(3)
divider.(32)
# => 10

Usa la división entera para que el resultado sea compatible con los argumentos que esperan las demás funciones.

5. Crea una función que aplique «and»

Implementa Secrets.secret_and/1. Debe devolver una función que reciba un argumento y realice una operación and a nivel de bits entre ese argumento y el secreto que se pasó a secret_and.

ander = Secrets.secret_and(1)
ander.(2)
# => 0

6. Crea una función que aplique «xor»

Implementa Secrets.secret_xor/1. Debe devolver una función que reciba un argumento y realice una operación xor a nivel de bits entre ese argumento y el secreto que se pasó a secret_xor.

xorer = Secrets.secret_xor(1)
xorer.(3)
# => 2

7. Crea un combinador de funciones

Implementa Secrets.secret_combine/2. Debe devolver una función que reciba un argumento y le aplique, en orden, las dos funciones que se pasaron a secret_combine.

add_one = Secrets.secret_add(1)
multiply_by_2 = Secrets.secret_multiply(2)
combined = Secrets.secret_combine(add_one, multiply_by_2)

combined.(3)
# => 8
Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
Elixir Exercism

¿Todo listo para empezar Secretos?

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