Написать функцию, которая находит чаще всего встречающийся в двумерном массиве атом типа «строка» - 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. В строке с номером 1 функция mx объявлена с помощью defun. Аргументом является a, который является двумерным массивом. Также определён вспомогательный список aux.
  2. В строке с номером 4, в aux записывается результат работы функции remove-if-not, которая удаляет все элементы массива a, которые не являются строками. Результат этого выражения — новый массив, состоящий только из строк.
  3. В строке с номером 5, в aux записывается результат работы функции remove-duplicates, которая удаляет все дублирующиеся строки из предыдущего массива.
  4. В строке с номером 6, в aux записывается результат работы цикла, который перебирает все элементы в v, и для каждой строки собирает количество её вхождений в массив w. Таким образом, в z хранятся список строк и количество их вхождений.
  5. В строке с номером 7, в aux записывается результат работы цикла, который перебирает все элементы в z, и для каждой строки проверяет, является ли она наиболее часто встречающейся. Если да, то записывает эту строку в новый массив m.
  6. В строке с номером 10, в aux записывается результат работы цикла, который перебирает все элементы в z, и для каждой строки проверяет, является ли она наиболее часто встречающейся. Если да, то записывает эту строку в новый массив m.
  7. В строке с номером 13, функция 2d-array-list объявлена с помощью defun. Эта функция принимает двумерный массив a и возвращает список всех его элементов.
  8. В строке с номером 14, функция flatten объявлена с помощью defun. Эта функция принимает список w и возвращает одноплоскостный список, состоящий из всех его элементов.
  9. В строке с номером 15, вызывается функция mx с аргументом #2A((aa`bb cc) (aa bb dd). Результатом работы функции является строка ``aa `bb``.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.273 из 5
Похожие ответы