Garey

Zad1-Elixir

Apr 4th, 2022 (edited)
306
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Erlang 2.51 KB | None | 0 0
  1. defmodule Zad1 do
  2.  
  3.   # Казваме, че искаме аргумента да не е празен масив
  4.   # И че функцията ще върне положително число
  5.   @spec multiples(nonempty_list()) :: non_neg_integer()
  6.   # Дефинираме си функцията с аргументите
  7.   def multiples(list) do
  8.  
  9.     # Правим две ламбда функции или анонимни функции
  10.     #
  11.     # Reference: https://elixirschool.com/en/lessons/basics/functions/#anonymous-functions-0
  12.     #
  13.     # hasRemainder - Да намерим дали има остатък. Връща boolean - true или false.
  14.     # Като аргументи се използват по позиция. &1 е първи аргумент, &2 втори и така нататък.
  15.     #
  16.     # filterFn - За Филтриране на информацията в масива, който сме подали като аргумент.
  17.     # Функционалността е ясна - използва hasRemainder метода от по-горе, за да определи дали има остатък даденият елемент.
  18.     #
  19.     hasRemainder = &(rem(&1, &2) == 0 or rem(&1, &3) == 0)
  20.     filterFn = &(hasRemainder.(&1, 3, 5))
  21.  
  22.     # Тук нещата стават tricky.
  23.     #
  24.     # Enum.reduce дава възможност да обходим масива елемент по елемент и да натрупаме стойност. Нещо като заместител на for с нова променлива.
  25.     # Enum.filter дава възможност да филтрираме масива като използваме наш метод, по който да си определим какви елементи искаме да има в новият масив.
  26.     #
  27.     # Накратко какво се случва:
  28.     #
  29.     # Филтрираме информацията, като използваме ламбда функцията по-горе filterFn, за да можем да изберем тези елементи, които се делят на 3 и на 5 само.
  30.     # Enum.filter събира новият ни масив с тези критерии и го подава на Enum.reduce, за да може да намери сумата от елементите му.
  31.     Enum.reduce(Enum.filter(list, filterFn), fn currentElement, sum -> currentElement + sum end)
  32.   end
  33. end
  34.  
  35. numbers = 1..999
  36. IO.puts Zad1.multiples(numbers)
  37.  
Add Comment
Please, Sign In to add comment