-
Notifications
You must be signed in to change notification settings - Fork 0
/
p12.erl
42 lines (34 loc) · 1.48 KB
/
p12.erl
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
-module(p12).
-author('Viacheslav Katsuba <v.katsuba.dev@gmail.com>').
-export([run/1]).
%% -------------------------------------------------------------------
%% @doc
%% P12 (*) Given a run-length code list generated as specified in problem P11. Construct its uncompressed version.
%% > p12:run([{4, a}, b, {2, c}, {2, a}, d, {4, e}]).
%% [a,a,a,a,b,c,c,a,a,d,e,e,e,e]
%% @end
%% -------------------------------------------------------------------
-spec run(L :: lists:list()) -> Result :: lists:list() | {error, badarg}.
run(L) -> reverse(p12_h(L, []), []).
%% -------------------------------------------------------------------
%% @private
%% @doc
%% Helper of p12
%% @end
%% -------------------------------------------------------------------
-spec p12_h(L :: lists:list(), Acc :: lists:list()) -> Result :: lists:list() | {error, badarg}.
p12_h([], Acc) -> Acc;
p12_h([{1, H} | T], Acc) -> p12_h(T, [H | Acc]);
p12_h([{N, H} | T], Acc) -> p12_h([{N - 1, H} | T], [H | Acc]);
p12_h([H | T], Acc) -> p12_h(T, [H | Acc]);
p12_h(_, _) -> {error, badarg}.
%% -------------------------------------------------------------------
%% @private
%% @doc
%% Helper of P12 - Reverse a list
%% @end
%% -------------------------------------------------------------------
-spec reverse(L :: lists:list(), Acc :: lists:list()) -> Result :: lists:list() | {error, badarg}.
reverse([], Acc) -> Acc;
reverse([H | T], Acc) -> reverse(T, [H | Acc]);
reverse(_, _) -> {error, badarg}.