fork download
  1. (defun calculate-level-sums (lst)
  2. (let ((acc '())) ; Начальный аккумулятор
  3. (prepare-result (calculate-level-sums-helper lst 1 acc))))
  4.  
  5. (defun calculate-level-sums-helper (lst level acc)
  6. (cond
  7. ((null lst) acc) ; Базовый случай: пустой список
  8. (t (let ((item (car lst))
  9. (rest (cdr lst)))
  10. (cond
  11. ((numberp item)
  12. (calculate-level-sums-helper rest level (update-level-sum acc level item)))
  13. ((listp item)
  14. (let ((inner-result (calculate-level-sums-helper item (1+ level) acc)))
  15. (calculate-level-sums-helper rest level inner-result)))
  16. (t (calculate-level-sums-helper rest level acc)))))))
  17.  
  18. (defun update-level-sum (acc level value)
  19. (let ((existing (assoc level acc)))
  20. (if existing
  21. (let ((new-acc (remove existing acc :test #'equal)))
  22. (cons (list level (+ value (cadr existing))) new-acc))
  23. (cons (list level value) acc))))
  24.  
  25. (defun prepare-result (acc)
  26. (if (assoc 1 acc)
  27. (sort acc #'< :key #'car)
  28. (sort (cons '(1 0) acc) #'< :key #'car)))
  29.  
  30.  
  31. ;; Тесты
  32. (format t "~a~%" (calculate-level-sums '(a (b (4 (2 e (3) k 15) e 5) 7))))
  33. (format t "~a~%" (calculate-level-sums '(a b c)))
  34. (format t "~a~%" (calculate-level-sums '(1 (2 (3)))))
  35. (format t "~a~%" (calculate-level-sums '(1 2 (3 4 (5 6)))))
Success #stdin #stdout #stderr 0.02s 9544KB
stdin
Standard input is empty
stdout
((1 0) (2 7) (3 9) (4 17) (5 3))
((1 0))
((1 1) (2 2) (3 3))
((1 3) (2 7) (3 11))
stderr
Warning: reserving address range 0x80000c0000...0x1fffffffffff that contains memory mappings. clisp might crash later!
Memory dump:
  0x8000000000 - 0x80000bffff
  0x154a39000000 - 0x154a392e4fff
  0x154a39400000 - 0x154a39402fff
  0x154a39403000 - 0x154a39601fff
  0x154a39602000 - 0x154a39602fff
  0x154a39603000 - 0x154a39603fff
  0x154a39615000 - 0x154a39639fff
  0x154a3963a000 - 0x154a397acfff
  0x154a397ad000 - 0x154a397f5fff
  0x154a397f6000 - 0x154a397f8fff
  0x154a397f9000 - 0x154a397fbfff
  0x154a397fc000 - 0x154a397fffff
  0x154a39800000 - 0x154a39803fff
  0x154a39804000 - 0x154a39a03fff
  0x154a39a04000 - 0x154a39a04fff
  0x154a39a05000 - 0x154a39a05fff
  0x154a39a5f000 - 0x154a39a60fff
  0x154a39a61000 - 0x154a39a70fff
  0x154a39a71000 - 0x154a39aa4fff
  0x154a39aa5000 - 0x154a39bdbfff
  0x154a39bdc000 - 0x154a39bdcfff
  0x154a39bdd000 - 0x154a39bdffff
  0x154a39be0000 - 0x154a39be0fff
  0x154a39be1000 - 0x154a39be2fff
  0x154a39be3000 - 0x154a39be3fff
  0x154a39be4000 - 0x154a39be5fff
  0x154a39be6000 - 0x154a39be6fff
  0x154a39be7000 - 0x154a39be7fff
  0x154a39be8000 - 0x154a39be8fff
  0x154a39be9000 - 0x154a39bf6fff
  0x154a39bf7000 - 0x154a39c04fff
  0x154a39c05000 - 0x154a39c11fff
  0x154a39c12000 - 0x154a39c15fff
  0x154a39c16000 - 0x154a39c16fff
  0x154a39c17000 - 0x154a39c17fff
  0x154a39c18000 - 0x154a39c1dfff
  0x154a39c1e000 - 0x154a39c1ffff
  0x154a39c20000 - 0x154a39c20fff
  0x154a39c21000 - 0x154a39c21fff
  0x154a39c22000 - 0x154a39c22fff
  0x154a39c23000 - 0x154a39c50fff
  0x154a39c51000 - 0x154a39c5ffff
  0x154a39c60000 - 0x154a39d05fff
  0x154a39d06000 - 0x154a39d9cfff
  0x154a39d9d000 - 0x154a39d9dfff
  0x154a39d9e000 - 0x154a39d9efff
  0x154a39d9f000 - 0x154a39db2fff
  0x154a39db3000 - 0x154a39ddafff
  0x154a39ddb000 - 0x154a39de4fff
  0x154a39de5000 - 0x154a39de6fff
  0x154a39de7000 - 0x154a39decfff
  0x154a39ded000 - 0x154a39deffff
  0x154a39df2000 - 0x154a39df2fff
  0x154a39df3000 - 0x154a39df3fff
  0x154a39df4000 - 0x154a39df4fff
  0x154a39df5000 - 0x154a39df5fff
  0x154a39df6000 - 0x154a39df6fff
  0x154a39df7000 - 0x154a39dfdfff
  0x154a39dfe000 - 0x154a39e00fff
  0x154a39e01000 - 0x154a39e01fff
  0x154a39e02000 - 0x154a39e22fff
  0x154a39e23000 - 0x154a39e2afff
  0x154a39e2b000 - 0x154a39e2bfff
  0x154a39e2c000 - 0x154a39e2cfff
  0x154a39e2d000 - 0x154a39e2dfff
  0x560e52bd3000 - 0x560e52cc3fff
  0x560e52cc4000 - 0x560e52dcdfff
  0x560e52dce000 - 0x560e52e2dfff
  0x560e52e2f000 - 0x560e52e5dfff
  0x560e52e5e000 - 0x560e52e8efff
  0x560e52e8f000 - 0x560e52e92fff
  0x560e54752000 - 0x560e54772fff
  0x7ffc26e9f000 - 0x7ffc26ebffff
  0x7ffc26fd5000 - 0x7ffc26fd8fff
  0x7ffc26fd9000 - 0x7ffc26fdafff