Working through PE.
This commit is contained in:
		
							parent
							
								
									8450ce8753
								
							
						
					
					
						commit
						6220e18137
					
				| 
						 | 
				
			
			@ -0,0 +1,47 @@
 | 
			
		|||
-module(chapter4).
 | 
			
		||||
-export([t2l/1, timeit/1]).
 | 
			
		||||
% 2. The BIF tuple_to_list(T) converts the elements of the tuple T to
 | 
			
		||||
% a list. Write a function called my_tuple_to_list(T) that does the
 | 
			
		||||
% same thing only not using the BIF that does this.
 | 
			
		||||
t2l(T) ->
 | 
			
		||||
    [ element(I, T) || I <- lists:seq(1, tuple_size(T)) ].
 | 
			
		||||
 | 
			
		||||
% 3. Look up the definitions of erlang:now/0, erlang:date/0, and
 | 
			
		||||
% erlang:time/0. Write a function called my_time_func(F), which
 | 
			
		||||
% evaluates the fun F and times how long it takes. Write a function
 | 
			
		||||
% called my_date_string() that neatly formats the current date and
 | 
			
		||||
% time of day.
 | 
			
		||||
 | 
			
		||||
% erlang:time -> Returns the current time as {Hour, Minute, Second}.
 | 
			
		||||
% erlang:date -> Returns the current date as {Year, Month, Day}.
 | 
			
		||||
% erlang:now -> deprecated, should use erlang:timestamp
 | 
			
		||||
% erlang:timestamp -> Returns current Erlang system time on the format
 | 
			
		||||
%     {MegaSecs, Secs, MicroSecs}.
 | 
			
		||||
% erlang:system_time(Unit) -> Returns current Erlang system time
 | 
			
		||||
%     converted into the Unit passed as argument.
 | 
			
		||||
 | 
			
		||||
timeit(F) ->
 | 
			
		||||
    Started = erlang:system_time(microsecond),
 | 
			
		||||
    F(),
 | 
			
		||||
    {erlang:system_time(microsecond) - Started, microsecond}.
 | 
			
		||||
 | 
			
		||||
% 4. Advanced: Look up the manual pages for the Python datetime
 | 
			
		||||
% module. Find out how many of methods in the Python datetime class
 | 
			
		||||
% can be implemented using the time-related BIFs in the erlang
 | 
			
		||||
% module. Search the erlang manual pages for equivalent
 | 
			
		||||
% routines. Implement any glaring omissions.
 | 
			
		||||
 | 
			
		||||
% 5. Write a module called math_functions.erl, exporting the functions
 | 
			
		||||
% even/1 and odd/1. The function even(X) should return true if X is an
 | 
			
		||||
% even integer and otherwise false. odd(X) should return true if X is
 | 
			
		||||
% an odd integer.
 | 
			
		||||
 | 
			
		||||
% 6. Add a higher-order function to math_functions.erl called
 | 
			
		||||
% filter(F, L), which returns all the elements X in L for which F(X)
 | 
			
		||||
% is true.
 | 
			
		||||
 | 
			
		||||
% 7. Add a function split(L) to math_functions.erl, which returns
 | 
			
		||||
% {Even, Odd} where Even is a list of all the even numbers in L and
 | 
			
		||||
% Odd is a list of all the odd numbers in L. Write this function in
 | 
			
		||||
% two different ways using accumulators and using the function filter
 | 
			
		||||
% you wrote in the previous exercise.
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,63 @@
 | 
			
		|||
-module(lib_misc).
 | 
			
		||||
-export([
 | 
			
		||||
  for/3,
 | 
			
		||||
  qsort/1,
 | 
			
		||||
  pythag/1,
 | 
			
		||||
  perms/1,
 | 
			
		||||
  kabs/1,
 | 
			
		||||
  kfilter/2,
 | 
			
		||||
  kclassify/1
 | 
			
		||||
]).
 | 
			
		||||
 | 
			
		||||
for(Max, Max, F) ->
 | 
			
		||||
    [F(Max)];
 | 
			
		||||
for(I, Max, F) ->
 | 
			
		||||
    [F(I)|for(I+1, Max, F)].
 | 
			
		||||
 | 
			
		||||
qsort([]) ->
 | 
			
		||||
    [];
 | 
			
		||||
qsort([Pivot|T]) ->
 | 
			
		||||
    qsort([X || X <- T,
 | 
			
		||||
		X < Pivot])
 | 
			
		||||
	++
 | 
			
		||||
	[Pivot]
 | 
			
		||||
	++
 | 
			
		||||
	qsort([X || X <- T,
 | 
			
		||||
		    X >= Pivot]).
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
pythag(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
 | 
			
		||||
    ].
 | 
			
		||||
 | 
			
		||||
perms([]) ->
 | 
			
		||||
    [[]];
 | 
			
		||||
perms(L) ->
 | 
			
		||||
    [[H|T] || H <- L,
 | 
			
		||||
	       T <- perms(L--[H])].
 | 
			
		||||
 | 
			
		||||
kabs(V) when is_integer(V), V >= 0 ->
 | 
			
		||||
    V;
 | 
			
		||||
kabs(V) when is_integer(V) -> -V.
 | 
			
		||||
 | 
			
		||||
kfilter(P, [H|T]) ->
 | 
			
		||||
    case P(H) of
 | 
			
		||||
	true  -> [H|kfilter(P, T)];
 | 
			
		||||
	false -> kfilter(P, T)
 | 
			
		||||
    end;
 | 
			
		||||
kfilter(_, []) -> [].
 | 
			
		||||
 | 
			
		||||
kclassify(N) ->
 | 
			
		||||
    if
 | 
			
		||||
	N >= 10 ->
 | 
			
		||||
	    high;
 | 
			
		||||
	N >= 3 ->
 | 
			
		||||
	    medium;
 | 
			
		||||
	true ->
 | 
			
		||||
	    low
 | 
			
		||||
    end.
 | 
			
		||||
| 
						 | 
				
			
			@ -8,7 +8,8 @@ cost (apples) -> 2;
 | 
			
		|||
cost (pears) -> 9;
 | 
			
		||||
cost (milk) -> 7.
 | 
			
		||||
 | 
			
		||||
total([]) ->
 | 
			
		||||
    0;
 | 
			
		||||
total([{Item, Count}|Rest]) ->
 | 
			
		||||
    cost(Item) * Count + total(Rest).
 | 
			
		||||
total(ShoppingList) ->
 | 
			
		||||
    lists:sum(
 | 
			
		||||
      lists:map(fun ({Item, Count}) ->
 | 
			
		||||
			Count * cost(Item) end,
 | 
			
		||||
		ShoppingList)).
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue