Написать функцию, которая находит чаще всего встречающийся в двумерном массиве атом типа «строка» - Lisp
Формулировка задачи:
Помогите
Решение задачи: «Написать функцию, которая находит чаще всего встречающийся в двумерном массиве атом типа «строка»»
textual
Листинг программы
(defun mx (a
&aux
(w (remove-if-not #'stringp (flatten (2d-array-list a))))
(v (remove-duplicates w :test #'string-equal))
(z (loop for e in v
collect (list e (count e w :test #'string-equal))))
(m (loop for x in z maximize (cadr x))))
(loop for e in z when (= (cadr e) m) collect (car e)))
(defun 2d-array-list (a)
(loop for i below (array-dimension a 0)
collect (loop for j below (array-dimension a 1)
collect (aref a i j))))
(defun flatten (w)
(loop for a in w if (listp a)
nconc (flatten a) else collect a))
> (mx #2A(("aa" "bb" "cc") ("aa" "bb" "dd")))
("aa" "bb")
Объяснение кода листинга программы
В этом коде реализована функция mx, которая находит наиболее часто встречающуюся строку в двумерном массиве.
- В строке с номером 1 функция
mxобъявлена с помощьюdefun. Аргументом являетсяa, который является двумерным массивом. Также определён вспомогательный списокaux. - В строке с номером 4, в
auxзаписывается результат работы функцииremove-if-not, которая удаляет все элементы массиваa, которые не являются строками. Результат этого выражения — новый массив, состоящий только из строк. - В строке с номером 5, в
auxзаписывается результат работы функцииremove-duplicates, которая удаляет все дублирующиеся строки из предыдущего массива. - В строке с номером 6, в
auxзаписывается результат работы цикла, который перебирает все элементы вv, и для каждой строки собирает количество её вхождений в массивw. Таким образом, вzхранятся список строк и количество их вхождений. - В строке с номером 7, в
auxзаписывается результат работы цикла, который перебирает все элементы вz, и для каждой строки проверяет, является ли она наиболее часто встречающейся. Если да, то записывает эту строку в новый массивm. - В строке с номером 10, в
auxзаписывается результат работы цикла, который перебирает все элементы вz, и для каждой строки проверяет, является ли она наиболее часто встречающейся. Если да, то записывает эту строку в новый массивm. - В строке с номером 13, функция
2d-array-listобъявлена с помощьюdefun. Эта функция принимает двумерный массивaи возвращает список всех его элементов. - В строке с номером 14, функция
flattenобъявлена с помощьюdefun. Эта функция принимает списокwи возвращает одноплоскостный список, состоящий из всех его элементов. - В строке с номером 15, вызывается функция
mxс аргументом#2A((aa`bbcc) (aabbdd). Результатом работы функции является строка ``aa`bb``.