-module(nzhf1m). -author('hanak@emt.bme.hu'). -date('2020-11-19'). -version('$LastChangedDate: 2020-11-19 09:24:24 +0100 (Thu, 19 Nov 2020) $$'). -compile(export_all). -import(lists,[append/2, filter/2, foldl/3, foldr/3, last/1, map/2, member/2, nth/2, reverse/1, seq/2, seq/3, sort/1, sublist/3, subtract/2, usort/1, zip/2, zip3/3]). -spec f1(Xs::[integer()]) -> Rs::[integer()]. % Rs az Xs lista 7-nél határozottan nagyobb elemeinek listája, % az Xs-beli előfordulásukhoz képest fordított sorrendben. f1(Xs) -> [X || X <- reverse(Xs), X>7]. -spec f2(Xs::[integer()]) -> R::integer(). % R az Xs listában előforduló páros számok összege. f2(Xs) -> foldl(fun(X,E) -> X+E end, 0, [X || X <- Xs, X rem 2 =:= 0]). -spec f3(Xs::[integer()]) -> Rs::[{integer(),integer()}]. % Rs olyan {A,B} párok listája, melyek az Xs listában szomszédos % elemek, A megelőzi B-t, és melyekre igaz, hogy A+B=:=5. f3(Xs) -> [{A,B} || {A,B} <- zip(sublist(Xs,1,length(Xs)-1), tl(Xs)), A+B =:= 5]. -spec f4(Xs::[integer()]) -> Rs::[integer()]. % Rs az Xs azon elemeinek listája egyszer felsorolva, amelyek legalább % kétszer előfordulnak Xs-ben. f4(Xs) -> usort(Xs -- usort(Xs)). -spec f5(Xss::[[integer()]]) -> R::integer(). % R az Xss listák listájában előforduló legnagyobb szám. % lists:flatten/1 és lists:flatten/2 nem használhatók! f5(Xss) -> % foldl(fun(X,A) -> max(X,A) end, hd(hd(Xss)), [X || Xs <- Xss, X <- Xs]). last(usort([X || Xs <- Xss, X <- Xs])). -spec e1(Xs::[integer()]) -> Rs::[integer()]. % Rs az Xs azon elemeinek listája (az eredeti sorrendben), amelyek % vagy mindkét szomszédjuknál nagyobbak, vagy mindkettőnél kisebbek. e1(Xs) -> H = length(Xs)-2, F = fun(I) -> sublist(Xs,I,H) end, [B || {A,B,C} <- zip3(F(1),F(2),F(3)), max(A,C)B]. -spec e2(Xs::[integer()]) -> Rs::[{integer(),integer(),integer()}]. % Rs olyan {A,B,C} hármasok listája, melyek az Xs listában ebben a % sorrendben fordulnak elő (nem feltétlenül szomszédos elemekként), és % amelyekre A+C=:=B. e2(Xs) -> F = fun(Ns) -> [{nth(I,Ns), sublist(Ns,I+1,length(Ns))} || I <- seq(1,length(Ns))] end, X1s = [{A,F(Bs)} || {A,Bs} <- F(Xs)], X2s = [{A,B,Cs} || {A,Bs} <- X1s, {B,Cs} <- Bs], [{A,B,C} || {A,B,Cs} <- X2s, C <- Cs, A+C=:=B]. test() -> { f1([3,9,5,11,7,8,9,31,2,4,8]) =:= [8,31,9,8,11,9], f2([3,9,5,11,7,8,9,31,2,4,8]) =:= 22, f3([3,2,3,1,4,1,5,0,5,6,-1,6,-2,7]) =:= [{3,2},{2,3},{1,4},{4,1},{5,0},{0,5},{6,-1},{-1,6},{-2,7}], f4([1,2,2,3,3,3,4,1,3,1]) =:= [1,2,3], f5([[1,2],[-3,4],[5,-6]]) =:= 5, e1([3,2,3,4,5,0,5,6,2,1,-2,7]) =:= [2,5,0,6,-2], e2([3,2,4,2,1,-2,7]) =:= [{3,4,1},{3,1,-2},{2,4,2},{4,2,-2}], vege }.