fork download
  1.  
  2. ;; Функция вычисляет суммы чисел на каждом уровне вложенности списка lst
  3. (defun calculate-level-sums (lst)
  4.  
  5. ;; Рекурсивная функция, которая проходит по списку lst на заданном уровне level.
  6. ;;Накапливает суммы чисел в аккумуляторе acc. Аккумулятор acc - это список пар
  7.  
  8. (defun calculate-level-sums-helper (lst level acc)
  9.  
  10. (cond
  11. ((null lst) acc) ; Базовый случай: если список пуст, возвращает аккумулятор
  12. (t (let ((head (car lst)) ; Берет первый элемент списка
  13. (tail (cdr lst))) ; Берет остаток списка
  14. (multiple-value-bind (new-acc remaining-tail) ; Обрабатывает текущий элемент
  15. (process-item head level acc) ; Функция process-item определяет, что делать с элементом
  16. (calculate-level-sums-helper tail level new-acc)))))) ; Рекурсивно вызывает себя для остатка списка
  17.  
  18. ;; Обработка одного элемента item на заданном уровне level
  19. (defun process-item (item level acc)
  20.  
  21. (cond
  22. ((numberp item) ; Если элемент - число
  23. (values (update-level-sum acc level item) nil)) ; Обновляет сумму для уровня
  24. ((listp item) ; Если элемент - список
  25. (values (calculate-level-sums-helper item (1+ level) acc) nil)) ; Рекурсивно вызывает себя для списка, увеличив уровень
  26. (t (values acc nil)))) ; Если элемент - не число и не список, игнорирует его
  27.  
  28. ;; Обновление аккумулятора acc суммой для заданного уровня level
  29. (defun update-level-sum (acc level value)
  30. (let ((existing (assoc level acc))) ; Ищет существующую запись для уровня
  31. (if existing ; Если уровень уже есть в аккумуляторе
  32. (let ((new-acc (remove existing acc :test #'equal))) ; Удаляет старую запись
  33. (cons (list level (+ value (cadr existing))) new-acc)) ; Добавляет обновленную запись с новой суммой
  34. (cons (list level value) acc)))) ; Иначе, добавляет новую пару (уровень value) в аккумулятор
  35.  
  36. ;; Подготавка результата
  37. (defun prepare-result (acc)
  38.  
  39. (sort (cons '(1 0) acc) #'< :key #'car))) ; Иначе, добавляет (1 0) и сортирует
  40.  
  41. ;; Тесты
  42. (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))
  43. (format t "~a~%" (calculate-level-sums '(a b c))) ; ((1 0))
  44. (format t "~a~%" (calculate-level-sums '(1 (2 (3))))) ; ((1 1) (2 2) (3 3))
  45. (format t "~a~%" (calculate-level-sums'(1 (2 3 (4 (5 6)))))) ; ((1 1) (2 5) (3 4) (4 11))
  46.  
Success #stdin #stdout #stderr 0.01s 9508KB
stdin
Standard input is empty
stdout
PREPARE-RESULT
PREPARE-RESULT
PREPARE-RESULT
PREPARE-RESULT
stderr
Warning: reserving address range 0x80000c0000...0x1fffffffffff that contains memory mappings. clisp might crash later!
Memory dump:
  0x8000000000 - 0x80000bffff
  0x14861c400000 - 0x14861c6e4fff
  0x14861c815000 - 0x14861c839fff
  0x14861c83a000 - 0x14861c9acfff
  0x14861c9ad000 - 0x14861c9f5fff
  0x14861c9f6000 - 0x14861c9f8fff
  0x14861c9f9000 - 0x14861c9fbfff
  0x14861c9fc000 - 0x14861c9fffff
  0x14861ca00000 - 0x14861ca02fff
  0x14861ca03000 - 0x14861cc01fff
  0x14861cc02000 - 0x14861cc02fff
  0x14861cc03000 - 0x14861cc03fff
  0x14861cc80000 - 0x14861cc8ffff
  0x14861cc90000 - 0x14861ccc3fff
  0x14861ccc4000 - 0x14861cdfafff
  0x14861cdfb000 - 0x14861cdfbfff
  0x14861cdfc000 - 0x14861cdfefff
  0x14861cdff000 - 0x14861cdfffff
  0x14861ce00000 - 0x14861ce03fff
  0x14861ce04000 - 0x14861d003fff
  0x14861d004000 - 0x14861d004fff
  0x14861d005000 - 0x14861d005fff
  0x14861d139000 - 0x14861d13cfff
  0x14861d13d000 - 0x14861d13dfff
  0x14861d13e000 - 0x14861d13ffff
  0x14861d140000 - 0x14861d140fff
  0x14861d141000 - 0x14861d141fff
  0x14861d142000 - 0x14861d142fff
  0x14861d143000 - 0x14861d150fff
  0x14861d151000 - 0x14861d15efff
  0x14861d15f000 - 0x14861d16bfff
  0x14861d16c000 - 0x14861d16ffff
  0x14861d170000 - 0x14861d170fff
  0x14861d171000 - 0x14861d171fff
  0x14861d172000 - 0x14861d177fff
  0x14861d178000 - 0x14861d179fff
  0x14861d17a000 - 0x14861d17afff
  0x14861d17b000 - 0x14861d17bfff
  0x14861d17c000 - 0x14861d17cfff
  0x14861d17d000 - 0x14861d1aafff
  0x14861d1ab000 - 0x14861d1b9fff
  0x14861d1ba000 - 0x14861d25ffff
  0x14861d260000 - 0x14861d2f6fff
  0x14861d2f7000 - 0x14861d2f7fff
  0x14861d2f8000 - 0x14861d2f8fff
  0x14861d2f9000 - 0x14861d30cfff
  0x14861d30d000 - 0x14861d334fff
  0x14861d335000 - 0x14861d33efff
  0x14861d33f000 - 0x14861d340fff
  0x14861d341000 - 0x14861d346fff
  0x14861d347000 - 0x14861d349fff
  0x14861d34c000 - 0x14861d34cfff
  0x14861d34d000 - 0x14861d34dfff
  0x14861d34e000 - 0x14861d34efff
  0x14861d34f000 - 0x14861d34ffff
  0x14861d350000 - 0x14861d350fff
  0x14861d351000 - 0x14861d357fff
  0x14861d358000 - 0x14861d35afff
  0x14861d35b000 - 0x14861d35bfff
  0x14861d35c000 - 0x14861d37cfff
  0x14861d37d000 - 0x14861d384fff
  0x14861d385000 - 0x14861d385fff
  0x14861d386000 - 0x14861d386fff
  0x14861d387000 - 0x14861d387fff
  0x555cf7175000 - 0x555cf7265fff
  0x555cf7266000 - 0x555cf736ffff
  0x555cf7370000 - 0x555cf73cffff
  0x555cf73d1000 - 0x555cf73fffff
  0x555cf7400000 - 0x555cf7430fff
  0x555cf7431000 - 0x555cf7434fff
  0x555cf7783000 - 0x555cf77a3fff
  0x7ffd2e48f000 - 0x7ffd2e4affff
  0x7ffd2e4b3000 - 0x7ffd2e4b6fff
  0x7ffd2e4b7000 - 0x7ffd2e4b8fff