> 1 <

Автор Сообщение

diver92

Members


Статус

3 сообщений

Где: Russia Барнаул
Род занятий: iOS developer, студент
Возраст: 27

#5598   2012-01-26 23:01 GMT+3 часа(ов)      
Доброго времени суток!

В общем есть такое задание:
построить список, определяющий, сколько раз встречается каждый элемент в нем.
(A B A C B C A B D) —> ((A 3) (B 3) (C 2) (D 1))

Реализовал я это таким вот образом:
(DEFUN AAA (LST)
(COND
( (NULL LST) (LIST NIL) )
( T (loop for i in (remove-duplicates LST) collect ( list i (
loop for j in LST when (equalp i j) sum 1
)
)
)
)
)
)


У меня есть предположение, что это можно было сделать намного изящнее и короче. Плюс, у меня вывод результата получается в другом порядке.
Может кто-нибудь что-нибудь посоветовать ?

VH

Members


Статус

289 сообщений

Где: ---
Род занятий:
Возраст:

#5599   2012-01-27 16:56 GMT+3 часа(ов)      
(defun F (L)
(if L
((lambda (elem result)
((lambda (node)
(if node
(cons
(cons (car node) (1+ (cdr node)))
(remove node result :test 'EQUAL))
(cons
(cons elem 1)
result)))
(assoc elem result)))
(car L)
(F (cdr L)))))

или
(defun F (L)
(if L
(let*
((elem (car L))
(result (F (cdr L)))
(node (assoc elem result)))
(if node
(cons
(cons (car node) (1+ (cdr node)))
(remove node result :test 'EQUAL))
(cons
(cons elem 1)
result)))))

bokunopico

Members


Статус

54 сообщений

Где: Russia Нижний Новгород
Род занятий:
Возраст:

#5603   2012-01-27 19:31 GMT+3 часа(ов)      
; Укороченная запись
(defun f (lst)
(loop for i in (remove-duplicates lst) collect `(,i ,(count i lst))))
 
; Более быстрый вариант
(defun foo (lst)
(nreverse (reduce #'(lambda (acc x)
(let ((res (member x acc :key #'first)))
(if res
(progn (incf (second (first res))) acc)
(cons (list x 1) acc)))) lst :initial-value '())))

megamanx

Members


Статус

307 сообщений

Где: Russia
Род занятий:
Возраст:

#5613   2012-01-28 00:20 GMT+3 часа(ов)      
(defun foo(L)
(let ((S (make-hash-table))
(R nil))
(labels ((ret(L)
(mapcar #'(lambda (x)
(if (gethash x S)
(incf (gethash x S))
(setf (gethash x S) 1))) L)))
(declare (inline ret))
(ret L)
(maphash #'(lambda (x y) (push (cons x y) R)) S) R)))

В заисимости от распределения, такая может работать гораздо быстрее.
I wish I'd made you angry earlier

joba

Members


Статус

157 сообщений

Где: ---
Род занятий:
Возраст:

#5614   2012-01-28 03:11 GMT+3 часа(ов)      
Все соснули.
(defun f (lst)
(if lst (g (car lst) (f (cdr lst))) nil))
(defun g (x xs) (if xs (gh x xs) `((,x 1))))
(defun gh (x xs) (ghh x (caar xs) (cadar xs) (cdr xs)))
(defun ghh (x y n xs)
(if (equal x y)
(cons `(,y ,(+ 1 n)) xs)
(cons `(,y ,n) (g x xs))))

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#5618   2012-01-28 21:32 GMT+3 часа(ов)      
(defun f (list)
(loop for e in list
for a = (assoc e r)
if a
do (incf (cadr a))
else
collect `(,e 1) into r
finally (return r)))

CG-USER(41): (F '(A B A C B C A B D))
((A 3) (B 3) (C 2) (D 1))
> 1 <


Онлайн :

0 пользователь(ей), 35 гость(ей) :




Реклама на сайте: