-module(nzhf23m1). -author('hanak@emt.bme.hu'). -date('2020-11-19'). -version('$LastChangedDate: 2020-11-19 14:18:54 +0100 (Thu, 19 Nov 2020) $$'). %-compile(export_all). -export([szigetek/1,szigetek_2/1,szfold/1,test/0]). % Típusnév rövidítése -type i() :: integer(). % Részfeladat: % Írjon szigetek néven olyan függvényt, amely visszaadja egy lista pozitív % elemekből álló, folytonos, semelyik irányba ki nem terjeszthető % részlistáinak listáját. Törekedjék hatékony, jobbrekurzív megoldásra! % % -spec szigetek(Xs::[i()]) -> Rss::[[i()]]. % % Az Xs pozitív elemekből álló, folytonos, maximális % % hosszúságú részlistáinak listája az Rss lista. % Teljes feladat: % Írjon szfold néven olyan függvényt a szigetek/1 függvény felhasználásával, % amely egy negatív számokat nem tartalmazó egészlista szárazföldjeinek % hosszából és legmagasabb pontjából álló párok listáját adja eredményül! % Szárazföldnek a csupa pozitív számból álló, legalább egyelemű, maximális % hosszúságú, folytonos részlistát nevezzük. % % -spec szfold(Zs::[i()]) -> Ys::[{Hossz::i(),Csucs::i()}]. % % A negatív számokat nem tartalmazó Zs egészlistában előforduló szárazföldek % % hosszát és legmagasabb pontját leíró {Hossz, Csucs} párok listája Ys. %% ---------------------------------------------------------------------------- % Részfeladat: egy jobbrekurzív megoldás segédfüggvénnyel. -spec szigetek(Xs::[i()]) -> Rss::[[i()]]. szigetek(Xs) -> szigetek(lists:reverse(Xs), [], []). -spec szigetek(Xs::[i()], Ss::[i()], Sss::[[i()]]) -> Rss::[[i()]]. % Rss az Xs részlistáiból álló szigetek listája, % ahol Ss az Xs pozitív elemekből álló, folytonos, maximális hosszúságú % következő részlistája, Sss pedig a részlistákat gyűjtő akkumulátor. szigetek([], [], Sss) -> Sss; szigetek([], Ss, Sss) -> [Ss|Sss]; szigetek([X|Xs], Ss, Sss) when X > 0 -> szigetek(Xs, [X|Ss], Sss); szigetek([_X|Xs], [], Sss) -> szigetek(Xs, [], Sss); szigetek([_X|Xs], Ss, Sss) -> szigetek(Xs, [], [Ss|Sss]). %% ---------------------------------------------------------------------------- % Részfeladat: egy nem jobbrekurzív megoldás segédfüggvénnyel. -spec szigetek_2(Xs::[i()]) -> Rss::[[i()]]. szigetek_2([]) -> []; szigetek_2([X|Xs]) when X =< 0 -> szigetek(Xs); szigetek_2(Xs) -> {Ss, Ms} = sziget_2(Xs, []), [lists:reverse(Ss)|szigetek_2(Ms)]. -spec sziget_2(Xs::[i()], Zs::[i()]) -> {Ss::[i()], Ms::[i()]}. % Ss az Xs pozitív elemekből álló, folytonos, maximális hosszúságú % első részlistája Zs elé fűzve, Ms pedig az Xs maradéka. sziget_2([], Zs) -> {Zs, []}; sziget_2([X|Xs], Zs) when X =< 0-> {Zs, Xs}; sziget_2([X|Xs], Zs) -> sziget_2(Xs, [X|Zs]). %% ---------------------------------------------------------------------------- % Teljes feladat -spec szfold(Zs::[i()]) -> Ys::[{Hossz::i(),Csucs::i()}]. szfold(Zs) -> F = fun (Xs) -> {length(Xs), lists:max(Xs)} end, lists:map(F, szigetek(Zs)). % lists:map(F, szigetek_2(Zs)). %% ---------------------------------------------------------------------------- test() -> {szigetek([]) =:= [], szigetek([-1,0,-2,-3,0,0]) =:= [], szigetek([1,2,3,0,0,4,5,6]) =:= [[1,2,3],[4,5,6]], szigetek([2,1,3,0,0,7,6,-1,-3,0,7,5,6]) =:= [[2,1,3],[7,6],[7,5,6]], szigetek_2([]) =:= [], szigetek_2([-1,0,-2,-3,0,0]) =:= [], szigetek_2([1,2,3,0,0,4,5,6]) =:= [[1,2,3],[4,5,6]], szigetek_2([2,1,3,0,0,7,6,-1,-3,0,7,5,6]) =:= [[2,1,3],[7,6],[7,5,6]], szfold([0,1,0,3,4,0,0,1]) =:= [{1,1}, {2,4}, {1,1}], szfold([0,0,30,4,10,0,0,100]) =:= [{3,30}, {1,100}], szfold([0,0,0]) =:= [], vege }.