Найти элемент, котоpый встречается в матрице чаще других - Lisp
Формулировка задачи:
Дана матрица А размера 8*6. Найти элемент, котоpый встречается в массиве чаще других. Заменить элементы столбцов, в которых содержится такой элемент на этот элемент. Написать на LISP.
Есть код на Питоне :
#!/usr/bin/python # -*- coding: utf-8 -*- """ %Дана матрица А размера 8*6. Найти элемент, котоpый встречается в массиве чаще %других. Заменить элементы столбцов, в которых содержится такой элемент на этот %элемент. """ import sys def find_frequency_el(m): fi_el_hash = {} #создадим хеш таблицу числа встречаемых в матрице элементов for i in range(len(m)): len_ms = len(m[i]) for j in range(len_ms): if fi_el_hash.has_key(m[i][j]): fi_el_hash[m[i][j]] = fi_el_hash[m[i][j]]+1 else: fi_el_hash[m[i][j]] = 1 #найдем элемент с максимальной встречаемостью elem_max = m[0][0] #инициализируем начальный элемент для поиска наиболее часто встречающегося элемента count_max = fi_el_hash[elem_max] for k in fi_el_hash.keys(): if fi_el_hash[k] > count_max: count_max = fi_el_hash[k] elem_max = k return [elem_max, count_max] def print_matr(m): for i in range(len(m)): len_ms = len(m[i]) for j in range(len_ms-1): print "%d," % m[i][j], print "%d" % m[i][len_ms-1] def replace_column_by_find_el(m,e): ind_hash = {} #пробежимся по матрице и найдем все индексы колонок в которых есть элемент е for i in range(len(m)): len_ms = len(m[i]) for j in range(len_ms): if m[i][j] == e: if not ind_hash.has_key(j): ind_hash[j] = 1 #теперь по известным индексам колонок проведем замену всех элементов. for i in range(len(m)): for j in ind_hash.keys(): m[i][j] = e return m def work(m): print "Base matrix: " print_matr(m) [elem_max, count_max] = find_frequency_el(m) print "frequency element is %d, count is %d" % (elem_max, count_max) replace_column_by_find_el(m,elem_max) print "Rezult matrix: " print_matr(m) def test1(): m = [ [2, 4, 1, 8, 5, 2], [0, 2, 1, 2, 8, 4], [6, 1, 4, 8, 5, 2], [3, 2, 4, 5, 1, 3], [5, 4, 2, 7, 6, 1], [2, 3, 1, 4, 234, 12], [23,2, 3, 6, 1, 4], [8, 3, 4, 2, 1, 2]] work(m) def test2(): m = [ [2, 4, 1, 8, 5, 2], [0, 2, 1, 8, 8, 4], [6, 1, 4, 8, 5, 1], [3, 2, 4, 5, 1, 3], [5, 4, 2, 7, 6, 1], [2, 3, 1, 4, 234, 12], [23,1, 3, 6, 1, 4], [8, 3, 4, 2, 1, 2]] work(m) if __name__ == "__main__": test1() test2()
Решение задачи: «Найти элемент, котоpый встречается в матрице чаще других»
textual
Листинг программы
(ns aeon.core) (def ^:const matrix1 [[2 4 1 8 5 2] [0 2 1 2 8 4] [6 1 4 8 5 2] [3 2 4 5 1 3] [5 4 2 7 6 1] [2 3 1 4 234 12] [23 2 3 6 1 4] [8 3 4 2 1 2]]) ;; => #'aeon.core/matrix1 (def ^:const matrix2 [[2 4 1 8 5 2] [0 2 1 8 8 4] [6 1 4 8 5 1] [3 2 4 5 1 3] [5 4 2 7 6 1] [2 3 1 4 234 12] [23 1 3 6 1 4] [8 3 4 2 1 2]]) ;; => #'aeon.core/matrix2 (defn print-matrix [matrix] (doseq [row matrix] (doseq [elem row] (printf "%4d" elem)) (newline))) ;; => #'aeon.core/print-matrix (defn task [matrix] (let [transpose (partial apply mapv vector) [max-elem _] (apply max-key val (-> matrix flatten frequencies)) [x :as tpose] (transpose matrix)] (-> (for [v tpose] (if (.contains v max-elem) (repeat (count x) max-elem) v)) transpose))) ;; => #'aeon.core/task (println "base-matrix1: ") (print-matrix matrix1) (println "result-matrix1: ") (print-matrix (task matrix1)) (println "base-matrix2: ") (print-matrix matrix2) (println "result-matrix2: ") (print-matrix (task matrix2)) ;; *out* ;; base-matrix1: ;; 2 4 1 8 5 2 ;; 0 2 1 2 8 4 ;; 6 1 4 8 5 2 ;; 3 2 4 5 1 3 ;; 5 4 2 7 6 1 ;; 2 3 1 4 234 12 ;; 23 2 3 6 1 4 ;; 8 3 4 2 1 2 ;; result-matrix1: ;; 2 2 2 2 5 2 ;; 2 2 2 2 8 2 ;; 2 2 2 2 5 2 ;; 2 2 2 2 1 2 ;; 2 2 2 2 6 2 ;; 2 2 2 2 234 2 ;; 2 2 2 2 1 2 ;; 2 2 2 2 1 2 ;; base-matrix2: ;; 2 4 1 8 5 2 ;; 0 2 1 8 8 4 ;; 6 1 4 8 5 1 ;; 3 2 4 5 1 3 ;; 5 4 2 7 6 1 ;; 2 3 1 4 234 12 ;; 23 1 3 6 1 4 ;; 8 3 4 2 1 2 ;; result-matrix2: ;; 2 1 1 8 1 1 ;; 0 1 1 8 1 1 ;; 6 1 1 8 1 1 ;; 3 1 1 5 1 1 ;; 5 1 1 7 1 1 ;; 2 1 1 4 1 1 ;; 23 1 1 6 1 1 ;; 8 1 1 2 1 1
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д