Advertisement
Guest User

Untitled

a guest
Apr 4th, 2020
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lisp 1.70 KB | None | 0 0
  1. (defun isList (ls) (AND (LISTP ls) (NOT (NULL ls))) )
  2. (defun sum (ls)
  3.     (COND ((NULL ls) 0)
  4.         (T (+ (valueof (car ls)) (sum (cdr ls))))
  5.     )
  6. )
  7. (defun valueOf (el)
  8.     (COND ((isList el) (sum el))
  9.         ((NUMBERP el) el)
  10.         (T 0)
  11.     )
  12. )
  13. (defun cmp (a b)
  14.     (- (valueOf a) (valueOf b))
  15. )
  16. (defun compareAdjacent (ls)
  17.     (< (cmp (car ls) (cadr ls)) 0)
  18. )
  19. ; sort maybe?
  20. (defun sm (ls)
  21.     (COND
  22.         ((isList ls) (sortAscNested ls))
  23.         (T ls)
  24.     )
  25. )
  26. (defun bubbleUp (ls)
  27.     ; (format t "bubble up: ~s ~s ~s less? ~b ~%" (car ls) (cadr ls) (cdr ls) (compareAdjacent ls))
  28.     (COND ((null (cdr ls)) ls)
  29.         ; первый меньше второго?
  30.         ((COND
  31.             ; да, берем второй как новый наибольший и конкатенируем с отсортированным остатком
  32.             ((compareAdjacent ls) (CONS
  33.                 (sm (car ls))
  34.                 (bubbleUp (cdr ls))
  35.             ))
  36.             ; нет, первый больше. тогда конкатенуем второй с первым + отсортированным остатком
  37.             (T (CONS (cadr ls) (bubbleUp (CONS
  38.                     (sm (car ls))
  39.                     (cddr ls)
  40.                 ))
  41.             ))
  42.         ))
  43.     )
  44. )
  45. (defun sortAsc (depth ls)
  46.     ; (format t "sort asc: ~d ~s~%" depth ls)
  47.     (cond ((= depth 1) (bubbleUp ls))
  48.         (T (sortAsc (- depth 1) (bubbleUp ls)))
  49.     )
  50. )
  51. (defun sortAscNested (ls)
  52.     (sortAsc (length ls) ls)
  53. )
  54.  
  55. (print (sortAscNested `(5 6 9 11 0 5 2) ))
  56. (print (sortAscNested `(5 6 9 11 (3 1) 0 5 2) ))
  57. (print (sortAscNested `(9 2 (1 2) 5 (3 6 2) 12 (6 (3 1)))))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement