fork download
  1. (defun calculate-level-sums (lst)
  2. (calculate-level-sums-helper lst 1 '()))
  3.  
  4. (defun calculate-level-sums-helper (lst level acc)
  5. (cond
  6. ((null lst) acc) ; Базовый случай: пустой список
  7. (t (multiple-value-bind (new-acc remaining-list)
  8. (process-level lst level acc)
  9. (calculate-level-sums-helper remaining-list level new-acc)))))
  10.  
  11. (defun process-level (lst level acc)
  12. (cond
  13. ((null lst) (values acc nil)) ; Базовый случай: пустой список, возвращаем аккумулятор и nil, как признак окончания
  14. ((numberp (car lst))
  15. (let ((new-acc (update-level-sum acc level (car lst))))
  16. (values new-acc (cdr lst)))) ; Обновляем аккумулятор и переходим к следующему элементу
  17. ((listp (car lst))
  18. (multiple-value-bind (inner-acc remaining-inner)
  19. (calculate-level-sums-helper (car lst) (1+ level) acc) ; Рекурсивно обрабатываем подсписок
  20. (values inner-acc (cdr lst)))); Возвращаем аккумулятор от подсписка и остаток исходного
  21. (t (values acc (cdr lst))))) ; Игнорируем не числовые атомы и продолжаем обработку
  22.  
  23. (defun update-level-sum (acc level value)
  24. (let ((existing (assoc level acc)))
  25. (if existing
  26. (let ((new-acc (remove existing acc :test #'equal)))
  27. (cons (list level (+ value (cadr existing))) new-acc))
  28. (cons (list level value) acc))))
  29.  
  30. (defun prepare-result (acc)
  31. (let ((has-level-one (assoc 1 acc)))
  32. (if has-level-one
  33. (sort acc #'< :key #'car)
  34. (sort (cons '(1 0) acc) #'< :key #'car))))
  35.  
  36. (defun calculate-level-sums (lst)
  37. (let ((acc '())) ; Initial accumulator
  38. (let ((result (calculate-level-sums-helper lst 1 acc)))
  39. (prepare-result result))))
  40.  
  41.  
  42. ; Тесты
  43. (format t "~a~%" (calculate-level-sums '(a (b (4 (2 e (3) k 15) e 5) 7)))) ; ((1 0) (2 7) (3 9) (4 17) (5 3))
  44. (format t "~a~%" (calculate-level-sums '(a b c))) ; ((1 0))
  45. (format t "~a~%" (calculate-level-sums '(1 (2 (3))))) ; ((1 1) (2 2) (3 3))
  46. (format t "~a~%" (calculate-level-sums '(1 2 (3 4 (5 6))))) ; ((1 3) (2 3) (3 10))
Success #stdin #stdout #stderr 0.02s 9476KB
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
  0x14d82ca00000 - 0x14d82cce4fff
  0x14d82ce15000 - 0x14d82ce39fff
  0x14d82ce3a000 - 0x14d82cfacfff
  0x14d82cfad000 - 0x14d82cff5fff
  0x14d82cff6000 - 0x14d82cff8fff
  0x14d82cff9000 - 0x14d82cffbfff
  0x14d82cffc000 - 0x14d82cffffff
  0x14d82d000000 - 0x14d82d002fff
  0x14d82d003000 - 0x14d82d201fff
  0x14d82d202000 - 0x14d82d202fff
  0x14d82d203000 - 0x14d82d203fff
  0x14d82d280000 - 0x14d82d28ffff
  0x14d82d290000 - 0x14d82d2c3fff
  0x14d82d2c4000 - 0x14d82d3fafff
  0x14d82d3fb000 - 0x14d82d3fbfff
  0x14d82d3fc000 - 0x14d82d3fefff
  0x14d82d3ff000 - 0x14d82d3fffff
  0x14d82d400000 - 0x14d82d403fff
  0x14d82d404000 - 0x14d82d603fff
  0x14d82d604000 - 0x14d82d604fff
  0x14d82d605000 - 0x14d82d605fff
  0x14d82d619000 - 0x14d82d61cfff
  0x14d82d61d000 - 0x14d82d61dfff
  0x14d82d61e000 - 0x14d82d61ffff
  0x14d82d620000 - 0x14d82d620fff
  0x14d82d621000 - 0x14d82d621fff
  0x14d82d622000 - 0x14d82d622fff
  0x14d82d623000 - 0x14d82d630fff
  0x14d82d631000 - 0x14d82d63efff
  0x14d82d63f000 - 0x14d82d64bfff
  0x14d82d64c000 - 0x14d82d64ffff
  0x14d82d650000 - 0x14d82d650fff
  0x14d82d651000 - 0x14d82d651fff
  0x14d82d652000 - 0x14d82d657fff
  0x14d82d658000 - 0x14d82d659fff
  0x14d82d65a000 - 0x14d82d65afff
  0x14d82d65b000 - 0x14d82d65bfff
  0x14d82d65c000 - 0x14d82d65cfff
  0x14d82d65d000 - 0x14d82d68afff
  0x14d82d68b000 - 0x14d82d699fff
  0x14d82d69a000 - 0x14d82d73ffff
  0x14d82d740000 - 0x14d82d7d6fff
  0x14d82d7d7000 - 0x14d82d7d7fff
  0x14d82d7d8000 - 0x14d82d7d8fff
  0x14d82d7d9000 - 0x14d82d7ecfff
  0x14d82d7ed000 - 0x14d82d814fff
  0x14d82d815000 - 0x14d82d81efff
  0x14d82d81f000 - 0x14d82d820fff
  0x14d82d821000 - 0x14d82d826fff
  0x14d82d827000 - 0x14d82d829fff
  0x14d82d82c000 - 0x14d82d82cfff
  0x14d82d82d000 - 0x14d82d82dfff
  0x14d82d82e000 - 0x14d82d82efff
  0x14d82d82f000 - 0x14d82d82ffff
  0x14d82d830000 - 0x14d82d830fff
  0x14d82d831000 - 0x14d82d837fff
  0x14d82d838000 - 0x14d82d83afff
  0x14d82d83b000 - 0x14d82d83bfff
  0x14d82d83c000 - 0x14d82d85cfff
  0x14d82d85d000 - 0x14d82d864fff
  0x14d82d865000 - 0x14d82d865fff
  0x14d82d866000 - 0x14d82d866fff
  0x14d82d867000 - 0x14d82d867fff
  0x55c8487a6000 - 0x55c848896fff
  0x55c848897000 - 0x55c8489a0fff
  0x55c8489a1000 - 0x55c848a00fff
  0x55c848a02000 - 0x55c848a30fff
  0x55c848a31000 - 0x55c848a61fff
  0x55c848a62000 - 0x55c848a65fff
  0x55c849cbf000 - 0x55c849cdffff
  0x7ffef2b8d000 - 0x7ffef2badfff
  0x7ffef2bf2000 - 0x7ffef2bf5fff
  0x7ffef2bf6000 - 0x7ffef2bf7fff