Написать функцию, которая находит чаще всего встречающийся в двумерном массиве атом типа «строка» - 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`bb
cc
) (aa
bb
dd
). Результатом работы функции является строка ``aa
`bb``.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д