Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (defun isList (ls) (AND (LISTP ls) (NOT (NULL ls))) )
- (defun sum (ls)
- (COND ((NULL ls) 0)
- (T (+ (valueof (car ls)) (sum (cdr ls))))
- )
- )
- (defun valueOf (el)
- (COND ((isList el) (sum el))
- ((NUMBERP el) el)
- (T 0)
- )
- )
- (defun cmp (a b)
- (- (valueOf a) (valueOf b))
- )
- (defun compareAdjacent (ls)
- (< (cmp (car ls) (cadr ls)) 0)
- )
- ; sort maybe?
- (defun sm (ls)
- (COND
- ((isList ls) (sortAscNested ls))
- (T ls)
- )
- )
- (defun bubbleUp (ls)
- ; (format t "bubble up: ~s ~s ~s less? ~b ~%" (car ls) (cadr ls) (cdr ls) (compareAdjacent ls))
- (COND ((null (cdr ls)) ls)
- ; первый меньше второго?
- ((COND
- ; да, берем второй как новый наибольший и конкатенируем с отсортированным остатком
- ((compareAdjacent ls) (CONS
- (sm (car ls))
- (bubbleUp (cdr ls))
- ))
- ; нет, первый больше. тогда конкатенуем второй с первым + отсортированным остатком
- (T (CONS (cadr ls) (bubbleUp (CONS
- (sm (car ls))
- (cddr ls)
- ))
- ))
- ))
- )
- )
- (defun sortAsc (depth ls)
- ; (format t "sort asc: ~d ~s~%" depth ls)
- (cond ((= depth 1) (bubbleUp ls))
- (T (sortAsc (- depth 1) (bubbleUp ls)))
- )
- )
- (defun sortAscNested (ls)
- (sortAsc (length ls) ls)
- )
- (print (sortAscNested `(5 6 9 11 0 5 2) ))
- (print (sortAscNested `(5 6 9 11 (3 1) 0 5 2) ))
- (print (sortAscNested `(9 2 (1 2) 5 (3 6 2) 12 (6 (3 1)))))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement