aboutsummaryrefslogtreecommitdiffstats
path: root/system/doc/extensions/list_comprehensions.erl
blob: 21ac562aa5bebe9ff8edaf525cc3cbbfe40cd74a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
-module(t).
-author('[email protected]').

%%-export([test/2]).
-compile(export_all).

%% Odd numbers.

%%foo(L) -> [ X || X <- L, (X > X-1) == (X /= X-1) ].

bar(L) -> [ X || X <- L, integer(X), gt(X, 3) ].

bar(L, M) -> [ Y || X <- L, integer(X), gt(X, 3),
		    Y <- M, float(Y), gt(X, Y)
		   ].

baz(L) -> [ X || X <- L, atom(X) ].

buz(L, Min) -> [ X || Min > 3, X <- L, X >= Min ].

gt(X, Y) when X > Y -> true;
gt(X, Y) -> false.

%% Turn a list into a set.
make_set([]) -> [];
make_set([H|T]) ->
    [H|[ 
     Y || Y <- make_set(T),
     Y =/= H 
     ]].

%% Return the Pythagorean triangles with sides 
%% of total length less than N
pyth(N) ->
    [ {A,B,C} ||
	A <- lists:seq(1,N),
        B <- lists:seq(1,N),
        C <- lists:seq(1,N),
        A+B+C =< N,
        A*A+B*B == C*C 
    ].

%% Cut the search space a bit..
pyth2(N) ->
    [ {A,B,C} ||
	A <- lists:seq(1,N),
        B <- lists:seq(1,N-A+1),
        C <- lists:seq(1,N-A-B+2),
        A+B+C =< N,
        A*A+B*B == C*C ].

%% Return the Cartesian product
cp() ->
    [ {X,Y} ||
	X <- a(),
        Y <- b() 
    ].

cp(A,B) when list(A),list(B) ->
    [ {X,Y} ||
	X <- A,
        Y <- B 
    ].

%a() -> 1/0.
a() -> [a,b].
b() -> [1,2,3].

%% Return all permutations of a list
perms([]) -> [[]];
perms(L)  -> [ [H|T] || H <- L, T <- perms(L--[H]) ].

%% Quick sort
sort([X|Xs]) ->
    sort([ Y || Y <- Xs, Y < X ]) ++
	[X] ++
	sort([ Y || Y <- Xs, Y >= X ]);
sort([]) -> [].

%% Vector addition
vecAdd(Xs,Ys) ->
    [ X+Y || {X,Y} <- zip(Xs,Ys) ].

zip([X|Xs],[Y|Ys]) -> [{X,Y}|zip(Xs,Ys)];
zip([],[])         -> [].

qsort([X|Xs]) ->
    qsort(lt(X,Xs))
    ++ [X] ++
    qsort(ge(X,Xs));
qsort([]) -> [].

lt(X,[H|T]) when X>H -> [H|lt(X,T)];
lt(X,[_|T]) -> lt(X,T);
lt(_,[]) -> [].

ge(X,[H|T]) when X=<H -> [H|ge(X,T)];
ge(X,[_|T]) -> ge(X,T);
ge(_,[]) -> [].
    
test(1,N) -> statistics(runtime),test1(N),statistics(runtime);
test(2,N) -> statistics(runtime),test2(N),statistics(runtime);
test(3,N) -> statistics(runtime),test3(N),statistics(runtime).

test1(0) -> true;
test1(N) ->
    sort([21,12,45,1,3,87,55,77,11,20,6,99,91,13,14,15,66,62,69,71,67,82,83,84,87,86,85]),
    test1(N-1).

test2(0) -> true;
test2(N) ->
    qsort([21,12,45,1,3,87,55,77,11,20,6,99,91,13,14,15,66,62,69,71,67,82,83,84,87,86,85]),
    test2(N-1).

test3(0) -> true;
test3(N) ->
    lists:sort([21,12,45,1,3,87,55,77,11,20,6,99,91,13,14,15,66,62,69,71,67,82,83,84,87,86,85]),
    test3(N-1).