На этом шаге мы приведем задачи на обработку списков.
Решение:
(DEFUN RAWN (LAMBDA (L)
(COND ( (NULL L) NIL )
( (EQ (LENGTH L) 1) NIL )
( T (COND ( (EQ (CAR L) (LAST (CDR L))) T )
( T NIL )
)
)
)
))
;-------------------- ;
(DEFUN LAST (LAMBDA (L)
(COND ( (NULL L) NIL )
( (NULL (CDR L)) (CAR L) )
( T (LAST (CDR L)) )
)
))
Тестовые примеры:
$ (RAWN '(1 2 3)) NIL $ (RAWN '(1 2 3 4 5 1)) T $ (RAWN '((1) 2 3 4 5 (1))) T
(DEFUN NTH (LAMBDA (N LST) ; Функция возвращает N-й элемент списка LST ; (COND ( (EQ N 1) (CAR LST) ) ( T (NTH (- N 1) (CDR LST) ) ) ) )) ; ------------------------- ; (DEFUN DELETE (LAMBDA (N LST) ; Функция удаляет N-й элемент из списка LST ; (COND ( (EQ N 1) (CDR LST) ) ( T (CONS (CAR LST) (DELETE (- N 1) (CDR LST))) ) ) )) ; --------------------------- ; (DEFUN INSERT (LAMBDA (X N LST) ; Функция вставляет элемент X на N-ю позицию ; ; в список LST ; (COND ( (NULL LST) (CONS X LST) ) ( (EQ N 1) (CONS X LST) ) ( T (CONS (CAR LST) (INSERT X (- N 1) (CDR LST))) ) ) ))
(DEFUN SORTING (LAMBDA (L) ; Сортировка неупорядоченного списка L ; (COND ( (NULL L) NIL ) ( T (INSERT (CAR L) (SORTING (CDR L))) ) ) )) ; ----------------------- ; (DEFUN INSERT (LAMBDA (A L) ; Функция INSERT добавляет элемент A в упорядоченный ; ; список L так, чтобы сохранилась упорядоченность ; (COND ( (NULL L) (LIST A) ) ( (< A (CAR L)) (CONS A L) ) ( T (CONS (CAR L) (INSERT A (CDR L))) ) ) )) ; -------------------------- ; (DEFUN RASSTAV (LAMBDA (NEW L) ; Функция RASSTAV позволяет элементы списка NEW ; ; вставить в упорядоченный список L ; (COND ( (NULL NEW) L ) ( T (INSERT (CAR NEW) (RASSTAV (CDR NEW) L)) ) ) ))
Тестовые примеры:
$ (SORTING '(5 4 3 2 1 6)) (1 2 3 4 5 6) $ (RASSTAV '(4 3 1) '(1 2 5 6)) (1 1 2 3 4 5 6)
(НИ ТО НИ ДРУГОЕ) --> ((НИ 2) (ТО 1) (ДРУГОЕ 1)).
Решение:
(DEFUN KOLAM (LAMBDA (LST) (TH (LIST-SET LST) LST) )) ; ------------------------- ; (DEFUN LIST-SET (LAMBDA (LST) ; Функция LIST-SET преобразует список LST в множество ; (COND ( (NULL LST) NIL ) ( (MEMBER (CAR LST) (CDR LST)) (LIST-SET (CDR LST)) ) ( T (CONS (CAR LST) (LIST-SET (CDR LST))) ) ) )) ; ------------------------ ; (DEFUN TH (LAMBDA (LST LST0) ; Построение нового списка, содержащего элементы вида ; ; (Элемент Количество_повторений_этого_элемента_ ; ; в_списке) ; (COND ( (NULL LST) NIL) ( T (CONS (LIST (CAR LST) (KOL (CAR LST) LST0)) (TH (CDR LST) LST0)) )) )) ; ---------------------- ; (DEFUN KOL (LAMBDA (M LST) ; Подсчет количества повторений элемента M в списке LST ; (COND ( (NULL LST) 0 ) ( (EQ (CAR LST) M) (+ (KOL M (CDR LST)) 1) ) ( T (KOL M (CDR LST))) ) ))
Тестовые примеры:
$ (KOLAM '(1 2 1 2 3 3 3 4)) ((1 2) (2 2) (3 3) (4 1)) $ (KOLAM '(1 5)) ((1 1) (5 1))
(A B C A B B) --> (A A B B B C)
Решение:
(DEFUN SOSEDI (LAMBDA (LST) (COND ( (NULL LST) NIL ) ( T (COND ( (MEMBER (CAR LST) (CDR LST)) (CONS (CAR LST) (SOSEDI (CONS (CAR LST) (DELETEFIRST (CAR LST) (CDR LST))))) ) ( T (CONS (CAR LST) (SOSEDI (CDR LST))) ) ) ) ) )) ; ------------------------------ ; (DEFUN DELETEFIRST (LAMBDA (A LST) ; Удаление первого вхождения элемента А в список LST ; (COND ( (NULL LST) NIL ) ( (EQUAL (CAR LST) A) (CDR LST) ) ( T (CONS (CAR LST) (DELETEFIRST A (CDR LST))) )) ))
Тестовые примеры:
$ (SOSEDI '(1 2 3 11 1 3)) (1 1 2 3 3 11) $ (SOSEDI '(0 1)) (0 1) $ (SOSEDI '()) NIL
Решение:
(DEFUN UPV (LAMBDA (LST) (COND ( (EQUAL LST (SORTING LST)) PRIN1 "Да" ) ( T PRIN1 "Нет" ) ))) ; ------------------------ ; (DEFUN SORTING (LAMBDA (LST) ; Сортировка неупорядоченного списка ; (COND ( (NULL LST) NIL ) ( T (INSERT (CAR LST) (SORTING (CDR LST))) ) ) )) ; ------------------------- ; (DEFUN INSERT (LAMBDA (A LST) ; Добавляет элемент А в упорядоченный список LST так, ; ; чтобы сохранилась упорядоченность ; (COND ( (NULL LST) (LIST A) ) ( (< A (CAR LST)) (CONS A LST) ) ( T (CONS (CAR LST) (INSERT A (CDR LST))) ) ) ))
Тестовые примеры:
$ (UPV '(1 2 3 4)) Да $ (UPV '(1 2 3 1)) Нет $ (UPV '()) Да
Ниже определены фильтры:
1) (DELETE-IF-PREDICAT LST) 2) (DELETE-IF-NON-PREDICAT LST),
Решение:
(DEFUN DELETE-IF-PREDICAT (LAMBDA (LST) (COND ( (NULL LST) NIL ) ( (EQ (PREDICAT (CAR LST)) F ) (CONS (CAR LST) (DELETE-IF-PREDICAT (CDR LST))) ) ( T (DELETE-IF-PREDICAT (CDR LST)) ) ) )) ; --------------------------------------- ; (DEFUN DELETE-IF-NON-PREDICAT (LAMBDA (LST) (COND ( (NULL LST) NIL ) ( (EQ (PREDICAT (CAR LST)) T ) (CONS (CAR LST) (DELETE-IF-NON-PREDICAT (CDR LST))) ) ( T (DELETE-IF-NON-PREDICAT (CDR LST)) ) ) )) ; ----------------------- ; (DEFUN PREDICAT (LAMBDA (X) ; Предикат проверяет равенство элемента 0 ; (COND ( (EQ X 0) T ) ( T F ) ) ))
Тестовые примеры:
$ (DELETE-IF-PREDICAT '(1 0 4 0 5)) (1 4 5) $ (DELETE-IF-PREDICAT '()) NIL $ (DELETE-IF-PREDICAT '(0 0)) NIL $ (DELETE-IF-NON-PREDICAT '(1 0 3 0 5)) (0 0) $ (DELETE-IF-NON-PREDICAT '(0 0 0)) (0 0 0) $ (DELETE-IF-NON-PREDICAT '(1 5)) NIL $ (DELETE-IF-NON-PREDICAT '()) NIL
Решение:
(DEFUN PATOM (LAMBDA (X LST) (NTH (- (NATOM X LST) 1) LST) )) ; ---------------------- ; (DEFUN NTH (LAMBDA (N LST) ; Функция возвращает N-й элемент списка LST ; (COND ( (EQ N 1) (CAR LST) ) ( T (NTH (- N 1) (CDR LST)) ) ) )) ; ------------------------ ; (DEFUN NATOM (LAMBDA (X LST) ; Функция возвращает позицию заданного элемента ; (COND ( (NULL LST) 0) ( (EQ X (CAR LST)) 1) ( (MEMBER X LST) (+ 1 (NATOM X (CDR LST))) ) ) ))
Тестовые примеры:
$ (PATOM 5 '(9 7 2 7 5 3)) 7 $ (PATOM 2 '(9 7 2 7 5 3)) 7 $ (PATOM 3 '(9 7 2 7 5 3)) 5
(DEFUN SWAP (LAMBDA (N M LST) ; Обмен значениями N-го и M-го элементов списка LST ; (INSERT (NTH N LST) M (DELETE M (INSERT (NTH M LST) N (DELETE N LST)))) )) ; ---------------------- ; (DEFUN NTH (LAMBDA (N LST) ; Функция возвращает N-й элемент списка LST ; (COND ( (EQ N 1) (CAR LST) ) ( T (NTH (- N 1) (CDR LST)) ) ) )) ; --------------------------- ; (DEFUN INSERT (LAMBDA (X N LST) ; Функция вставляет элемент X на N-ю позицию ; ; в список LST ; (COND ( (NULL LST) (CONS X LST) ) ( (EQ N 1) (CONS X LST) ) ( T (CONS (CAR LST) (INSERT X (- N 1) (CDR LST))) ) ) )) ; ------------------------- ; (DEFUN DELETE (LAMBDA (N LST) ; Функция удаляет N-й элемент из списка LST ; (COND ( (EQ N 1) (CDR LST) ) ( T (CONS (CAR LST) (DELETE (- N 1) (CDR LST))) ) ) ))
(A (B1 B2 ... BN)) --> ((A B1) (A B2) ... (A BN))
((A1 A2 ... AN) B) -- > ((A1 B) (A2 B) ... (AN B)).
(THE ANSWER IS 12).
Y = A W = ((A B) A (C (A (A D)))),
0 < Элемент <= Номер_элемента в списке LST
(DEFUN BOUNDP (LAMBDA (X) (COND ( (NOT (ATOM X)) NIL ) ( (EQ X (QUOTE X)) T ) ( T NIL ) ) ))
1) Команда : 2 3 @ 4 7 8 2 4 6 Результат выполнения: 4 7 8 2 4 6 2) Команда : 4 2 @ 7 8 4 Результат выполнения: 7 8 4 7 8 4 7 8 3) Команда : 3 4 @ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Результат выполнения: 1 2 3 4 5 6 7 8 9 10 11 12
Числа, стоящие слева от знака операции, определяют структуру результирующей матрицы, а именно: число строк и число столбцов матрицы. Числа, стоящие справа от знака операции, используются для построения массива, они располагаются по строкам.
Здесь уместно сделать два замечания.
Во-первых, если у Вас недостаточно элементов для того, чтобы построить массив, APL возвращается к началу "кучи" данных, находящихся в правой части, и начинает вновь выбирать из нее элемент за элементом.
Во-вторых, если у нас, напротив, слишком много элементов, то выбирается ровно столько, сколько нужно, остальные игнорируются.
Напишите функцию SRF, значением которой является ее собственное определение. SRF не имеет входных параметров.
Если SRF определяется как
(SRF (LAMBDA () (...Тело...))),
(SRF (LAMBDA () (...Тело...))).
На следующем шаге мы приведем задачи на обработку строк.