Знайомство з Erlang [10]
Продовження роботи зі списками в erlang -
на відміну від lists:map/2 та lists:filter/2 -
lists comprehention (конструктор (генератор) списків) вміють працювати з декількома списками одразу:
відкриємо консоль:
$ erl
1> List1 = [1,2].
[1,2]
2> List2 = [a,b].
[a,b]
3> List3 = [cc,dd].
[cc,dd]
4> [{X,Y,Z} || X <- List1, Y <- List2, Z <- List3].
[{1,a,cc},
{1,a,dd},
{1,b,cc},
{1,b,dd},
{2,a,cc},
{2,a,dd},
{2,b,cc},
{2,b,dd}]
розрахуємо площі прямокутників:
5> [{X,Y,Z} || X <- List1, X > 1, Y <- List2, Y =/= a, Z <- List3].
[{2,b,cc},{2,b,dd}]
6> List = [{rect, 5, 10}, {rect, 4, 8}, {rect, 4, 3}].
[{rect,5,10},{rect,4,8},{rect,4,3}]
7> [{area, W * H} || {rect, W, H} <- List].
[{area,50},{area,32},{area,12}]
одразу відфільтруємо:
8> [{area, W * H} || {rect, W, H} <- List, W * H < 40].
[{area,32},{area,12}]
Згадаймо теорему Піфагора: сума квадратів катетів дорівнює квадрату гіпотенузи.
Існує не так багато варіантів, коли довжини катетів і гіпотенузи виражаються цілими числами.
Найвідоміший варіант: {3, 4, 5}.
Знайдемо всі такі варіанти за допомогою конструкторів списків.
На вході дано максимальну довжину гіпотенузи,
на виході потрібно отримати список всіх можливих трійок
{Катет, Катет, Гіпотенуза}, де довжини є цілими числами.
Беремо список всіх можливих довжин,
і генеруємо всі можливі поєднання довжин,
далі залишилось відфільтрувати результат -
9> Max = 20.
20
10> Lengthes = lists:seq(1, Max).
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
11> [{X,Y,Z} || X <- Lengthes, Y <- Lengthes, Z <- Lengthes, X * X + Y * Y =:= Z * Z].
[{3,4,5},
{4,3,5},
{5,12,13},
{6,8,10},
{8,6,10},
{8,15,17},
{9,12,15},
{12,5,13},
{12,9,15},
{12,16,20},
{15,8,17},
{16,12,20}]
Задача вирішена одним рядком коду :)
Посилання
https://erlang.org/doc/programming_examples/list_comprehensions.html