Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- defmodule Zad1 do
- # Казваме, че искаме аргумента да не е празен масив
- # И че функцията ще върне положително число
- @spec multiples(nonempty_list()) :: non_neg_integer()
- # Дефинираме си функцията с аргументите
- def multiples(list) do
- # Правим две ламбда функции или анонимни функции
- #
- # Reference: https://elixirschool.com/en/lessons/basics/functions/#anonymous-functions-0
- #
- # hasRemainder - Да намерим дали има остатък. Връща boolean - true или false.
- # Като аргументи се използват по позиция. &1 е първи аргумент, &2 втори и така нататък.
- #
- # filterFn - За Филтриране на информацията в масива, който сме подали като аргумент.
- # Функционалността е ясна - използва hasRemainder метода от по-горе, за да определи дали има остатък даденият елемент.
- #
- hasRemainder = &(rem(&1, &2) == 0 or rem(&1, &3) == 0)
- filterFn = &(hasRemainder.(&1, 3, 5))
- # Тук нещата стават tricky.
- #
- # Enum.reduce дава възможност да обходим масива елемент по елемент и да натрупаме стойност. Нещо като заместител на for с нова променлива.
- # Enum.filter дава възможност да филтрираме масива като използваме наш метод, по който да си определим какви елементи искаме да има в новият масив.
- #
- # Накратко какво се случва:
- #
- # Филтрираме информацията, като използваме ламбда функцията по-горе filterFn, за да можем да изберем тези елементи, които се делят на 3 и на 5 само.
- # Enum.filter събира новият ни масив с тези критерии и го подава на Enum.reduce, за да може да намери сумата от елементите му.
- Enum.reduce(Enum.filter(list, filterFn), fn currentElement, sum -> currentElement + sum end)
- end
- end
- numbers = 1..999
- IO.puts Zad1.multiples(numbers)
Add Comment
Please, Sign In to add comment