Форум программистов, компьютерный форум, киберфорум
Языки JVM
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 07.10.2014
Сообщений: 7
1

Clojure Сортировка атомов списка по частоте появления

09.10.2014, 15:53. Показов 888. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите решить задачу:

Есть список атомов. Написать программу, возвращающую список вида: первый элемент — атом исходного списка, появляющийся в списке один раз, второй элемент — атом, появляющийся два раза и т.д. Если есть несколько атомов,
появляющихся одинаковое количество раз, то их объединить в список.

Привести набор тестовых вызовов описанной функции, демонстрирующих все
варианты ее работы.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.10.2014, 15:53
Ответы с готовыми решениями:

Задача: сделать программу подсчета частоты появления каждого символ и Отсортировать по частоте появления
Прошу помочь не понимаю даже как начать делать. Суть задания, есть...

Получить из списка произвольных атомов список атомов, которые в исходном списке встречаются один раз
Построить список атомов, которые встречаются в заданном списке ровно один раз.

Clojure Добавление атомов в список после элемента с заданным свойством
Помогите сделать, желательно на homelisp.. Определить функцию, добавляющую атом/атомы в исходный...

Clojure Описать функцию, которая находила бы сумму всех числовых атомов в списке, учитывая все атомы подсписков
Описать функцию, которая находила бы сумму всех числовых атомов в списке, учитывая все атомы...

6
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,640
Записей в блоге: 13
09.10.2014, 16:49 2
HomeLisp:

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
(defun mk-pair (lst)
  (cond ((null lst) nil)
        (t (let* ((a (car lst))
                  (lstr (remove a lst)))
           (cons (list a (- (length lst) (length lstr))) (mk-pair lstr)))))) 
 
(defun merge (lst)
  (let ((prev (car lst)) (r nil) )
    (iter (for curr in (cdr lst))
       (cond ((> (cadr curr) (car (last prev))) (collecting prev into r) (setq prev curr))
             (t (setq prev (cons (car curr) prev)) (setq curr nil))))
       (append r (list prev))))
 
(defun task (lst)
  (merge (qsort-a (mk-pair lst) 'cadr)))
 
(task '(a a a s s v v z a s v b))
 
==> ((z b 1) (s v 3) (a 4))
 
(task '(a s v v z a s v b))
 
==> ((z b 1) (a s 2) (v 3))
 
(task '(a s v b))
 
==> ((a s v b 1))
2
defun
603 / 617 / 44
Регистрация: 30.04.2011
Сообщений: 702
09.10.2014, 18:13 3
Lisp
1
2
3
4
5
6
7
8
9
10
(defun f (lst)
            (loop 
               with res for a in lst
               for c = (count a lst)
               do (let ((pos (position c res :key #'first)))
                    (if pos 
                        (setf (nth pos res)
                              (list c (pushnew a (second (nth pos res)))))
                        (push (list c (list a)) res)))
               finally (return (sort res #'< :key #'first))))
3
505 / 511 / 42
Регистрация: 12.12.2013
Сообщений: 484
09.10.2014, 19:34 4
Clojure: не совсем по заданию, но все же:
Lisp
1
2
3
4
5
6
7
8
9
10
11
(defn task [coll]
  (into (sorted-map)
        (apply group-by ((juxt identity keys) (frequencies coll)))))
;; => #'user/task
 
(task '(a a a s s v v z a s v b))
;; => {1 [z b], 3 [s v], 4 [a]}
(task '(a s v v z a s v b))
;; => {1 [z b], 2 [a s], 3 [v]}
(task '(a s v b))
;; => {1 [a s v b]}
3
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
09.10.2014, 19:38 5
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
;;; racket-lang.org
(define (make-duplicates lst)
  (if (null? lst)
      null
      (append (list (filter (lambda (i) (eq? i (car lst))) lst))
              (make-duplicates (remove* (list (car lst)) lst)))))
 
(define (foo lst)
  (let ((l (sort (make-duplicates lst) (lambda (i j) (< (length i) (length j))))))
    (let loop ((lst l) (acc null))
      (if (null? lst)
          acc
          (loop (filter (lambda (i) (not (eq? (length i) (length (car lst))))) lst)
                (append acc (list (map car (filter (lambda (i) (eq? (length i) (length (car lst)))) lst)))))))))
 
(foo '(a a s s s d d f f f f))
;'((a d) (s) (f))
2
0 / 0 / 0
Регистрация: 07.10.2014
Сообщений: 7
10.10.2014, 20:28  [ТС] 6
Catstail, transformator.t, smoke853, castorsky, Большое спасибо за помощь!
0
4699 / 4394 / 380
Регистрация: 12.05.2012
Сообщений: 3,096
13.10.2014, 13:51 7
как вариант:
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
(defun sort-atoms-by-freq (w)
  (sort-atoms (sort (atom-freq w) #'< :key #'cadr)))
 
(defun atom-freq (w &aux (v (remove-duplicates w)))
  (mapcar #'(lambda (a) (list a (count a w))) v))
 
(defun sort-atoms (w &optional ac acc &aux (a (car w)) (d (cdr w)))
  (cond ((null w) (nreverse (cons (caar ac) acc)))
        ((or (null ac) (eq (cadar ac) (cadr a)))
         (sort-atoms d (cons a ac) acc))
        ((sort-atoms d (list a) (cons (if (cdr ac)
                                          (nreverse (mapcar #'car ac))
                                          (caar ac))
                                       acc)))))
 
> (sort-atoms-by-freq '(a a s s s d d f f f f))
((A D) S F)
2
13.10.2014, 13:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.10.2014, 13:51
Помогаю со студенческими работами здесь

Clojure Написать функцию, для замены элементов списка y на соответствующие элементы списка x в списке w
Здравствуйте. Помогите написать функцию, осуществляющую замену элементов списка y на...

Clojure Создать два списка, поместив в первый отрицательные, а во второй – положительные элементы исходного списка
Помогите пожалуйста решить следующие задачи: 1. Задан список чисел. Создать два списка, поместив...

Формирование списка атомов
Добрый день!Помогите пожалуйста решить задачу на LISP. Написать программу формирования списка,...

Перестановка атомов списка
Здравствуйте! помогите пожалуйста написать функцию перестановки атомов верхнего уровня и нижнего...


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

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