;; Вспомогательная функция: проверка, является ли элемент числом (defun numberp-custom (x) (and (atom x) (numberp x))) ;; Основная функция: вычисление сумм по уровням (defun sum-by-levels (lst) (let ((result (make-hash-table))) ; Используем hash table для хранения сумм по уровням ;; Внутренняя рекурсивная функция (labels ((process-level (sub-lst level) (cond ((null sub-lst) nil) ; Конец списка ((atom sub-lst) (if (numberp-custom sub-lst) (progn (incf (gethash level result 0) sub-lst) ; Добавляем число к сумме уровня nil) ; Возвращаем nil nil)) ; Игнорируем не числовые атомы (t ; Список (process-level (car sub-lst) (1+ level)) ; Обрабатываем первый элемент (углубляемся) (process-level (cdr sub-lst) level)))) ; Обрабатываем остаток списка ) (process-level lst 1) ; Начинаем обработку с уровня 1 ;; Преобразуем hash table в список требуемого формата ((level сумма)) и сортируем по уровню (sort (loop for level being the hash-keys of result using (hash-value sum) collect (list level sum)) #'< :key #'car)))) ;; Примеры использования: (print (sum-by-levels '(a (b (4 (2 e (3) k 15) e 5) 7)))) ;; → ((1 0) (2 7) (3 9) (4 17) (5 3)) (print (sum-by-levels '(1 (2 (3 (4) 5) 6) 7))) ;; → ((1 1) (2 7) (3 11) (4 4))
Standard input is empty
((3 7) (4 9) (5 17) (6 3)) ((2 8) (3 8) (4 8) (5 4))
Warning: reserving address range 0x80000c0000...0x1fffffffffff that contains memory mappings. clisp might crash later! Memory dump: 0x8000000000 - 0x80000bffff 0x154451c00000 - 0x154451ee4fff 0x154452015000 - 0x154452039fff 0x15445203a000 - 0x1544521acfff 0x1544521ad000 - 0x1544521f5fff 0x1544521f6000 - 0x1544521f8fff 0x1544521f9000 - 0x1544521fbfff 0x1544521fc000 - 0x1544521fffff 0x154452200000 - 0x154452202fff 0x154452203000 - 0x154452401fff 0x154452402000 - 0x154452402fff 0x154452403000 - 0x154452403fff 0x154452480000 - 0x15445248ffff 0x154452490000 - 0x1544524c3fff 0x1544524c4000 - 0x1544525fafff 0x1544525fb000 - 0x1544525fbfff 0x1544525fc000 - 0x1544525fefff 0x1544525ff000 - 0x1544525fffff 0x154452600000 - 0x154452603fff 0x154452604000 - 0x154452803fff 0x154452804000 - 0x154452804fff 0x154452805000 - 0x154452805fff 0x15445295b000 - 0x15445295efff 0x15445295f000 - 0x15445295ffff 0x154452960000 - 0x154452961fff 0x154452962000 - 0x154452962fff 0x154452963000 - 0x154452963fff 0x154452964000 - 0x154452964fff 0x154452965000 - 0x154452972fff 0x154452973000 - 0x154452980fff 0x154452981000 - 0x15445298dfff 0x15445298e000 - 0x154452991fff 0x154452992000 - 0x154452992fff 0x154452993000 - 0x154452993fff 0x154452994000 - 0x154452999fff 0x15445299a000 - 0x15445299bfff 0x15445299c000 - 0x15445299cfff 0x15445299d000 - 0x15445299dfff 0x15445299e000 - 0x15445299efff 0x15445299f000 - 0x1544529ccfff 0x1544529cd000 - 0x1544529dbfff 0x1544529dc000 - 0x154452a81fff 0x154452a82000 - 0x154452b18fff 0x154452b19000 - 0x154452b19fff 0x154452b1a000 - 0x154452b1afff 0x154452b1b000 - 0x154452b2efff 0x154452b2f000 - 0x154452b56fff 0x154452b57000 - 0x154452b60fff 0x154452b61000 - 0x154452b62fff 0x154452b63000 - 0x154452b68fff 0x154452b69000 - 0x154452b6bfff 0x154452b6e000 - 0x154452b6efff 0x154452b6f000 - 0x154452b6ffff 0x154452b70000 - 0x154452b70fff 0x154452b71000 - 0x154452b71fff 0x154452b72000 - 0x154452b72fff 0x154452b73000 - 0x154452b79fff 0x154452b7a000 - 0x154452b7cfff 0x154452b7d000 - 0x154452b7dfff 0x154452b7e000 - 0x154452b9efff 0x154452b9f000 - 0x154452ba6fff 0x154452ba7000 - 0x154452ba7fff 0x154452ba8000 - 0x154452ba8fff 0x154452ba9000 - 0x154452ba9fff 0x55b61678d000 - 0x55b61687dfff 0x55b61687e000 - 0x55b616987fff 0x55b616988000 - 0x55b6169e7fff 0x55b6169e9000 - 0x55b616a17fff 0x55b616a18000 - 0x55b616a48fff 0x55b616a49000 - 0x55b616a4cfff 0x55b617af0000 - 0x55b617b10fff 0x7fffa4f51000 - 0x7fffa4f71fff 0x7fffa4ff2000 - 0x7fffa4ff5fff 0x7fffa4ff6000 - 0x7fffa4ff7fff