(defun calculate-level-sums (lst) (calculate-level-sums-helper lst 1 '())) (defun calculate-level-sums-helper (lst level acc) (cond ((null lst) acc) ; Базовый случай: пустой список (t (multiple-value-bind (new-acc remaining-list) (process-level lst level acc) (calculate-level-sums-helper remaining-list level new-acc))))) (defun process-level (lst level acc) (cond ((null lst) (values acc nil)) ; Базовый случай: пустой список, возвращаем аккумулятор и nil, как признак окончания ((numberp (car lst)) (let ((new-acc (update-level-sum acc level (car lst)))) (values new-acc (cdr lst)))) ; Обновляем аккумулятор и переходим к следующему элементу ((listp (car lst)) (multiple-value-bind (inner-acc remaining-inner) (calculate-level-sums-helper (car lst) (1+ level) acc) ; Рекурсивно обрабатываем подсписок (values inner-acc (cdr lst)))); Возвращаем аккумулятор от подсписка и остаток исходного (t (values acc (cdr lst))))) ; Игнорируем не числовые атомы и продолжаем обработку (defun update-level-sum (acc level value) (let ((existing (assoc level acc))) (if existing (let ((new-acc (remove existing acc :test #'equal))) (cons (list level (+ value (cadr existing))) new-acc)) (cons (list level value) acc)))) (defun prepare-result (acc) (let ((has-level-one (assoc 1 acc))) (if has-level-one (sort acc #'< :key #'car) (sort (cons '(1 0) acc) #'< :key #'car)))) (defun calculate-level-sums (lst) (let ((acc '())) ; Initial accumulator (let ((result (calculate-level-sums-helper lst 1 acc))) (prepare-result result)))) ; Тесты (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)) (format t "~a~%" (calculate-level-sums '(a b c))) ; ((1 0)) (format t "~a~%" (calculate-level-sums '(1 (2 (3))))) ; ((1 1) (2 2) (3 3)) (format t "~a~%" (calculate-level-sums '(1 2 (3 4 (5 6))))) ; ((1 3) (2 3) (3 10))
Standard input is empty
((1 0) (2 7) (3 9) (4 17) (5 3)) ((1 0)) ((1 1) (2 2) (3 3)) ((1 3) (2 7) (3 11))
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