Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
84 / 83 / 8
Регистрация: 31.03.2015
Сообщений: 447
1

Покритиковать, улучшить, закончить

04.01.2016, 01:55. Показов 888. Ответов 22
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Покритиковать, улучшить, закончить, помочь.
Нужно рассказать, что не так в моей программе: где её можно улучшить, где велосипеды или костыли, можно ли сделать быстрее(важно), что подправить и т.д. , помочь её закончить(осталась одна функция). Всем заранее спасибо. Собственно говоря, вот что она делает.
Дана квадратная матрица M размера n, элементы которой - целые числа.
Дальше R=(m(0), m(1), ..., m(k-1)) массив состоящий из k подматриц матрицы M.
1. Определить количество уникальных сумм подматриц(klasa abstrakcji (не знаю как правильно перевести) из R. 2. Определить количество сумм которые встречались больше всего раз. 3. Найти целую часть среднего арифметического всех сумм.
Ввод
n k
матрица размера n
k-количество координат для подматриц
(две координаты левого угла, две - правого)
Вывод
Пункт1 Пункт2 Пункт3

Ограничения
n [1 ; 10^4], k [1 ; 10^8], M - целые числа [-10^3,10^3]
Лимиты
По времени O(n^2+klgk), по памяти O(n^2+k)

Пример
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
;;Ввод
4 8        ;;n k
-2 -2 -3 1     ;;\
3 0 1 3        ;;| сама матрица
1 3 -3 3       ;;|
2 0 0 -2       ;;/
0 0 2 1 ;;\
2 2 2 3 ;;|
1 2 1 3 ;;|Координаты для подматриц
3 2 3 3 ;;|
3 0 3 3 ;;|
0 1 2 1 ;;|
3 3 3 3 ;;|
1 3 1 3 ;;/
;;Вывод:
5 3 0
Вот что написал, проблема с функцией нахождения подматрицы, я не знаю как её сделать.

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
(defun get-sum (lst)
    "Returns sum of given list"
    (reduce #'+ lst))
 
(defun get-average-entire-part (list-of-subs)
    "Возвращает целую часть среднего арифметического данного листа"
    (truncate 
        (/ (get-sum list-of-subs) (length list-of-subs))))
 
(defun get-unique-sums (lst)
    "Возвращает список элементов без дубликатов и количество этих элементов"
    (let ((tmp (remove-duplicates lst)))
        (values tmp (length tmp))))
 
(defun most-repeats (check-lst lst)
    "Возвращает список элементов, которые повторяются в 
    данном списке(и соответствуют искомым элементам из check-list)
    наибольшее количество раз и количество этих элементов
    Пример:
    (most-repeats '(1 2 3) '(2 2 3 3 4 1 5 5 5 5 5)) -> (2 3) 2"
    (let ((most nil) (cnt 0))
        (dolist (i check-lst)
            (let ((tmp (count i lst)))
                (cond
                    ((= tmp cnt) (push i most))
                    ((> tmp cnt) (setf most (list i) cnt tmp))
                    (t most))))
        (values most cnt)))
 
(defun get-size-coor (line)
    "Возвращает два числа из строки
    (в данном частном случае размер М и количество подматриц)"
    (let (size coor (pos 0))
        (multiple-value-setq (size pos) (parse-integer line :start pos :junk-allowed t))
        (multiple-value-setq (coor pos) (parse-integer line :start pos :junk-allowed t))
        (values size coor)))
 
(defun get-coordinates (line)
    "Возвращает массив с 4 числами из данной строки
    (в данном случае координаты)"
    (let ((coordinates (make-array 4 :element-type 'integer)) (pos 0) tmp)
        (dotimes (i 4)
            (multiple-value-setq (tmp pos) (parse-integer line :start pos :junk-allowed t))
            (setf (aref coordinates i) tmp))
        coordinates))
 
(defun create-fill-matrix (size)
    ;;Странное поведение если запускать из repl!!!
    "Создает квадратную матрицу размера SIZE x SIZE
    и считывает её элементы из standart-input. 
    Ну и заполняет."
    (let ((matrix (make-array (list size size) :element-type 'integer)))
        (dotimes (i size)
            (let ((line (read-line))
                  (pos 0)
                   tmp)
                (dotimes (i2 size)
                    (multiple-value-setq (tmp pos) (parse-integer line :start pos :junk-allowed t))
                    (setf (aref matrix i i2) tmp))))
        matrix))
 
(defun get-submatrix (matrix coordinates)
    ;;Не знаю как сделать
    "Возвращает массив элементов из подматрицы по координатам данным в виде массива
    Пример:
    (get-submatrix #2A((0 1 2) (3 4 5) (6 7 8)) #(0 0 1 2)) -> #(0 1 2 3 4 5)"
    )
(defun main ()
    "Главная функция"
    (let (size coor-num)
        (multiple-value-setq (size coor-num) (get-size-coor (read-line)))
        (let ((matrix (create-fill-matrix size))
              (all-sums nil)
              (unique-sums nil)
              (num-of-unique 0)
              (most nil)
              (num-of-most 0)
              (shit 0))
            (dotimes (i coor-num)
                (push (get-sum (get-submatrix matrix (get-coordinates (read-line)))) all-sums ))
            (multiple-value-setq (unique-sums num-of-unique) (get-unique-sums all-sums))
            (multiple-value-setq (most num-of-most) (most-repeats unique-sums all-sums))
            (setf shit (get-average-entire-part all-sums))
            (format t "~s ~s ~s" num-of-unique num-of-most shit))))
Пример подматрицы по координатам
0 1 2
3 4 5
6 7 8
-> 0 0 1 2
0 1 2
3 4 5

6 7 8

Если что-то непонятно обьяснил, спросите расскажу как смогу
2
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.01.2016, 01:55
Ответы с готовыми решениями:

Просьба покритиковать сайт
Добрый день уважаемые ! Хотелось бы, чтобы знающие люди, покритиковали или наоборот похвалил за...

Просьба покритиковать сайт ...
ок ... это исправлю..спс

Прошу потестировать и покритиковать
Наткнулся вот на эту тему. Заинтересовала задачка! Вот посидел - подумал - написал. Прошу общество...

Прошу покритиковать сайт
Привет всем доброжелательным :) форумчанам! Прошу оценить - критиковать (или одобрить) дизайн...

22
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
12.01.2016, 16:19 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от Vaderkos Посмотреть сообщение
Вот что у меня вышло
Несомненно, читатели раздела о C++ оценили бы.

Цитата Сообщение от Vaderkos Посмотреть сообщение
Последний раз редактировалось Catstail
Ещё бы вырезать и перенести.
1
188 / 155 / 17
Регистрация: 18.12.2015
Сообщений: 179
13.01.2016, 00:55 22
Vaderkos, а зачем тебе в программе lprint, которая умеет выводить на экран только положительные числа? Причём, судя по тексту, ты её ни где не используешь.

Я б ещё про деление с остатком спросил. Но, я на Си++ ничего, сложнее "Hello, World!" не писал, так что не буду о таких тонкостях.
1
84 / 83 / 8
Регистрация: 31.03.2015
Сообщений: 447
13.01.2016, 15:36  [ТС] 23
rdt, С делением все там ок, если инт то берется целая часть от числа(судя по всему). Насчет lprint, я видимо сбросил не тот вариант, в другом я добавил поддержку отрицательных чисел и сделал вывод через него. Сам на С++ не много пишу, только базовые знания.
0
13.01.2016, 15:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.01.2016, 15:36
Помогаю со студенческими работами здесь

Покритиковать модифицированный стек
Задача (придумал сам): реализовать слегка навороченный стэк и стандартные арифметические операции...

Просьба покритиковать сайт на юзабилити
Здравствуйте! У меня просьба покритиковать сайт на юзабилити. Какой он ГС или СДЛ? Критика...

Змейка на JS от новичка (прошу покритиковать)
Начал осваивать JavaScript. Написал простенькую змейку. Код подсматривал из других разных...

Подготовил свой ТЗ. Просим покритиковать/посоветовать.
Задача банальна, да сложна одновременно. Нужно удаленно (небольшие расстояния на небольшой период...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
23
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru