fork download
  1. ;; Вспомогательная функция: проверка, является ли элемент числом
  2. (defun numberp-custom (x)
  3. (and (atom x) (numberp x)))
  4.  
  5. ;; Основная функция: вычисление сумм по уровням
  6. (defun sum-by-levels (lst)
  7. (let ((result (make-hash-table))) ; Используем hash table для хранения сумм по уровням
  8.  
  9. ;; Внутренняя рекурсивная функция
  10. (labels ((process-level (sub-lst level)
  11. (cond
  12. ((null sub-lst) nil) ; Конец списка
  13.  
  14. ((atom sub-lst)
  15. (if (numberp-custom sub-lst)
  16. (progn
  17. (incf (gethash level result 0) sub-lst) ; Добавляем число к сумме уровня
  18. nil) ; Возвращаем nil
  19. nil)) ; Игнорируем не числовые атомы
  20.  
  21. (t ; Список
  22. (process-level (car sub-lst) (1+ level)) ; Обрабатываем первый элемент (углубляемся)
  23. (process-level (cdr sub-lst) level)))) ; Обрабатываем остаток списка
  24. )
  25. (process-level lst 1) ; Начинаем обработку с уровня 1
  26.  
  27. ;; Преобразуем hash table в список требуемого формата ((level сумма)) и сортируем по уровню
  28. (sort (loop for level being the hash-keys of result
  29. using (hash-value sum)
  30. collect (list level sum))
  31. #'< :key #'car))))
  32.  
  33. ;; Примеры использования:
  34. (print (sum-by-levels '(a (b (4 (2 e (3) k 15) e 5) 7))))
  35. ;; → ((1 0) (2 7) (3 9) (4 17) (5 3))
  36.  
  37. (print (sum-by-levels '(1 (2 (3 (4) 5) 6) 7)))
  38. ;; → ((1 1) (2 7) (3 11) (4 4))
  39.  
Success #stdin #stdout #stderr 0.01s 9476KB
stdin
Standard input is empty
stdout
((3 7) (4 9) (5 17) (6 3)) 
((2 8) (3 8) (4 8) (5 4)) 
stderr
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