Найти элемент, кото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