Знайомство з 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