Упражнението цели да се изработи набор от фукции за манипулиране на текст. Задачата е взаимствана от книгата "Hasell - The Craft of Functional Programming. Second edition" на Simon Thompson.

Нека незначещи символи да наричаме символите, разделящи думите в даден текст. В началото можем да приемем, че такива са символите ' ' (интервал) и '\n' (нов ред). Да се дефинираме списък whiteSpaces = [' ','\n'], който в последствие можем да допълваме. За целта на упражнението ще приемем, че всички пунктонационни знаци (',', '.', '!', ...) са изписани непосредствено след някоя дума, т.е. не са отделени с интервали от предходната дума.

Задача. Да се дефинира функция getWord s, която по даден символен низ намира първата дума в този низ. Ако низа е празен или започва с незначещ символ, то getWord да връща празния низ.

Задача. Да се дефинира функция dropWord s, която по зададен символен низ "премахва" първата дума в този низ, т.е. намира низа, получен от s чрез премахване на първата дума. Ако низа е празен или започва с незначещ символ, getWord го връща неизменен.

Задача. Да се дефинира функция dropSpaces s, която "премахва" всички незначещи символи в началото на низа s, ако има такива.

Задача. Да се напише функция splitWords, която по символен низ намира списъка от последователните думи в този низ.

Задача. Да се дефинира функция clearWord w, която по дадена дума w "премахва" пунктонационните знаци в нея (ако има такива).

Задача. Да се дефинира функция clearAll l, която премахва пунктонационните знаци от всички думи в списъка l.

Задача. Да се напише функция uniqueWords l, която "премахва" повторенията в списъка от думи l.

Задача. Да се дефинира функция memCount x l, която намира броя на срещанията на елемента x в списъка l.

Задача. Да се напише функция wordCounter u l. l е списъкт от думи, а u - списъкът от уникалните думни в l.  Да се намри броя на срещанията в l на всяка уникална дума от него. Резултатът да представлява списък от двойки (дума,брой срещания).

Пример: wordCounter ["aaa", "bbb"] ["aaa", "bbb", "aaa"] = [("aaa",2), ("bbb",1)]

Задача. Да се дефинира функция splitLines words l, която "намества" думите последователно в редове, не по-дълги от l, т.е. разделя последователно списъка от думи words в списък от списъци от думи, като общата големина на думите в тези списъци е възможно най-голямото число, по-малко от l (към дължината на всяка дума да добавим 1 за интервала, който ще я отделя от останалите думи). Приемаме, че в списъка няма думи с повече от l символа.

Пример: splitLines ["hello", "world", "have", "a", "nice", "day"] 10 = [  ["hello", "world"],  ["have", "a", "nice"], ["day"]]

Задача. Да се дефинира функция alignLeft l, която по списък от списъци от думи генерира низ с редове, получени чрез конкатенация на думите в тези списъци, т.е. последователно, всеки ред се образува от списък от думи, като ги залепяме една за друга с интервал между тях.

Пример: alignLeft  [  ["hello", "world"],  ["have", "a", "nice"], ["day"] ] = "hello world\n have a nice\n day"


Задача. alignJustify l
Последно модифициране: събота, 12 ноември 2011, 17:38