21 lines
1.2 KiB
Erlang
21 lines
1.2 KiB
Erlang
-module( word_wrap ).
|
|
|
|
-export( [paragraph/2, task/0] ).
|
|
|
|
paragraph( String, Max_line_length ) ->
|
|
Lines = lines( string:tokens(String, " "), Max_line_length ),
|
|
string:join( Lines, "\n" ).
|
|
|
|
task() ->
|
|
Paragraph = "Even today, with proportional fonts and complex layouts, there are still cases where you need to wrap text at a specified column. The basic task is to wrap a paragraph of text in a simple way in your language. If there is a way to do this that is built-in, trivial, or provided in a standard library, show that. Otherwise implement the minimum length greedy algorithm from Wikipedia.",
|
|
io:fwrite( "~s~n~n", [paragraph(Paragraph, 72)] ),
|
|
io:fwrite( "~s~n~n", [paragraph(Paragraph, 80)] ).
|
|
|
|
|
|
|
|
lines( [Word | T], Max_line_length ) ->
|
|
{Max_line_length, _Length, Last_line, Lines} = lists:foldl( fun lines_assemble/2, {Max_line_length, erlang:length(Word), Word, []}, T ),
|
|
lists:reverse( [Last_line | Lines] ).
|
|
|
|
lines_assemble( Word, {Max, Line_length, Line, Acc} ) when erlang:length(Word) + Line_length > Max -> {Max, erlang:length(Word), Word, [Line | Acc]};
|
|
lines_assemble( Word, {Max, Line_length, Line, Acc} ) -> {Max, Line_length + 1 + erlang:length(Word), Line ++ " " ++ Word, Acc}.
|