Упражнение, СИ, 07.11
План:
- Списъци. Основни функции - list, length, nth, append
- Функции от по-висок ред за работа със списъци - fold, filter, map
- Функции с променлив брой аргументи (varargs)
Интерактивна сесия: REPL.it
Задача 1: Имплементирайте функцията (digit-list n), която приема число n и връща списък от цифрите му:
(digit-list 1024) ; => (1 0 2 4)
Задача 2: Имплементирайте функциите (index-of lst val) и (last-index-of lst val). За сравняване използвайте предиката (equal? val1 val2).
(index-of (list 0 1 2 3 1) 1) ; => 1 (last-index-of (list 0 1 2 3 1) 1) ; => 4
Задача 3: Имплементирайте функцията (remove lst val), която премахва всички срещания на val в списъка lst.
(remove (list 1 2 1 3 1 4) 1) ; => (2 3 4)
(distinct? (list 1 2 3 4)) ; => #t (distinct? (list 1 2 3 2)) ; => #f (distinct (list 1 2 3 2)) ; => (1 2 3)
Задача 5: Имплементирайте функцията (histogram lst), която получава списък от числа и връща списък от наредени двойки <число, брой срещания> - по една за всеки различен елемент на списъка.
(histogram '(1 4 3 5 1 2 3 4 1)) ; => ((1 . 3) (4 . 2) (3 . 2) (5 . 1) (2 . 1))
Задача 6: Имплементирайте функцията (range n), която връща списък с числата от 1 до n.
(range 5) ; => (0 1 2 3 4)
Задача 7: Имплементирайте функциите (take n lst) и (drop n lst).
(take 5 (range 100)) ; => (0 1 2 3 4) (take 100 (range 3)) ; => (0 1 2) (drop 20 (range 23)) ; => (20 21 22) (drop 20 (range 10)) ; => ()
Задача 8: Имплементирайте функцията (sort lst), която сортира списъка lst чрез вмъкване.
(sort (list 1 9 7 4 6)) ; => (1 4 6 7 9)
Задача 9*: Имплементирайте функцията (group-by criteria lst), която групира елементите на списъка lst според резултата от функцията criteria:
(group-by even? (range 6)) ; => ((#t (0 2 4)) (#f (1 3 5))) (group-by (lambda (x) (mod x 3)) (range 6)) ; => ((0 (0 3)) (1 (1 4)) (2 (2 5)))
(flatten '(1 2 (3 (4) 5) (((6))))) ; => (1 2 3 4 5 6)
Задача 11: Имплементирайте функцията (chunk size lst), която разделя елементите на списъка lst в групи с големина size.
(chunk 2 (range 4)) ; => ((0 1) (2 3)) (chunk 4 (range 10)) ; => ((0 1 2 3) (4 5 6 7) (8 9))
Задача 12: Имплементирайте функцията (compose . fns), която връща композицията на подадените аргументи.
(define f (compose double square inc)) ; 2 * (x + 1)^2 (f 3) ; => 32 (f 4) ; => 50
Задача 13: Имплементирайте функцията (flip fn), която обръща реда на аргументите на функцията fn незвисимо от броя им.
(define list^ (flip list)) (list^ 1 2 3) ; => (3 2 1)
Задача 14: Имплементирайте по-общ вариант на функцията (map fn . lsts), която прилага fn с аргументи поредните елемени на списъците докато някой от тях не се изчерпа.
(map + (list 1 2 3) (list 4 5 6) (list 7 8 9)) ; => (12 15 18) (map cons (list 1 3 5) (list 2 4 6 8 10 12)) ; => ((1 . 2) (3 . 4) (5 . 6))
Задача 15: Имплементирайте функцията (juxt . fns) (от англ. juxtaposition - съпоставяне). Резултатът от (juxt f g h ...) e функция с променлив брой аргументи, която връща списък с резултатите от прилагането на всяка една от функциите f, g, h ... въргу тези аргументи.
(define f (juxt inc dec square double)) ; (f x) = (list (inc x) (dec x) (square x) (double x)) (f 5) ; => (6 4 25 10) (define g (juxt + *)) (g 3 4 5) ; => (12 60)