fork download
  1. (defun calculate-level-sums (lst)
  2. (let ((level-sums (make-hash-table)))
  3.  
  4. (labels ((process-level (sublist level)
  5. (let () ; Необязательное, но делает код понятнее
  6. (dolist (item sublist)
  7. (cond
  8. ((numberp item)
  9. (incf (gethash level level-sums 0) item))
  10. ((listp item)
  11. (process-level item (1+ level))))))))
  12.  
  13. (process-level lst 1))
  14.  
  15. (let ((result '()))
  16. ; Всегда добавляем уровень 1 с суммой 0, если он еще не был обработан
  17. (unless (gethash 1 level-sums)
  18. (setf (gethash 1 level-sums) 0)) ; Устанавливаем сумму для уровня 1
  19.  
  20. (maphash (lambda (level sum)
  21. (push (list level sum) result))
  22. level-sums) ; Собираем пары level/sum
  23.  
  24. (sort result #'< :key #'car))))
  25.  
  26.  
  27. (format t "~a~%" (calculate-level-sums '(a (b (4 (2 e (3) k 15) e 5) 7))))
  28. ; Теперь должно выводить ((1 0) (2 7) (3 9) (4 17) (5 3))
  29.  
  30. ;Проверка другими входными значениями
  31. (format t "~a~%" (calculate-level-sums '(a b c))) ;((1 0))
  32. (format t "~a~%" (calculate-level-sums '(1 (2 (3))))) ;Выводит ((1 1) (2 2) (3 3))
  33.  
Success #stdin #stdout #stderr 0.01s 9500KB
stdin
Standard input is empty
stdout
((1 0) (2 7) (3 9) (4 17) (5 3))
((1 0))
((1 1) (2 2) (3 3))
stderr
Warning: reserving address range 0x80000c0000...0x1fffffffffff that contains memory mappings. clisp might crash later!
Memory dump:
  0x8000000000 - 0x80000bffff
  0x14624fc00000 - 0x14624fee4fff
  0x146250015000 - 0x146250039fff
  0x14625003a000 - 0x1462501acfff
  0x1462501ad000 - 0x1462501f5fff
  0x1462501f6000 - 0x1462501f8fff
  0x1462501f9000 - 0x1462501fbfff
  0x1462501fc000 - 0x1462501fffff
  0x146250200000 - 0x146250202fff
  0x146250203000 - 0x146250401fff
  0x146250402000 - 0x146250402fff
  0x146250403000 - 0x146250403fff
  0x146250480000 - 0x14625048ffff
  0x146250490000 - 0x1462504c3fff
  0x1462504c4000 - 0x1462505fafff
  0x1462505fb000 - 0x1462505fbfff
  0x1462505fc000 - 0x1462505fefff
  0x1462505ff000 - 0x1462505fffff
  0x146250600000 - 0x146250603fff
  0x146250604000 - 0x146250803fff
  0x146250804000 - 0x146250804fff
  0x146250805000 - 0x146250805fff
  0x146250836000 - 0x146250839fff
  0x14625083a000 - 0x14625083afff
  0x14625083b000 - 0x14625083cfff
  0x14625083d000 - 0x14625083dfff
  0x14625083e000 - 0x14625083efff
  0x14625083f000 - 0x14625083ffff
  0x146250840000 - 0x14625084dfff
  0x14625084e000 - 0x14625085bfff
  0x14625085c000 - 0x146250868fff
  0x146250869000 - 0x14625086cfff
  0x14625086d000 - 0x14625086dfff
  0x14625086e000 - 0x14625086efff
  0x14625086f000 - 0x146250874fff
  0x146250875000 - 0x146250876fff
  0x146250877000 - 0x146250877fff
  0x146250878000 - 0x146250878fff
  0x146250879000 - 0x146250879fff
  0x14625087a000 - 0x1462508a7fff
  0x1462508a8000 - 0x1462508b6fff
  0x1462508b7000 - 0x14625095cfff
  0x14625095d000 - 0x1462509f3fff
  0x1462509f4000 - 0x1462509f4fff
  0x1462509f5000 - 0x1462509f5fff
  0x1462509f6000 - 0x146250a09fff
  0x146250a0a000 - 0x146250a31fff
  0x146250a32000 - 0x146250a3bfff
  0x146250a3c000 - 0x146250a3dfff
  0x146250a3e000 - 0x146250a43fff
  0x146250a44000 - 0x146250a46fff
  0x146250a49000 - 0x146250a49fff
  0x146250a4a000 - 0x146250a4afff
  0x146250a4b000 - 0x146250a4bfff
  0x146250a4c000 - 0x146250a4cfff
  0x146250a4d000 - 0x146250a4dfff
  0x146250a4e000 - 0x146250a54fff
  0x146250a55000 - 0x146250a57fff
  0x146250a58000 - 0x146250a58fff
  0x146250a59000 - 0x146250a79fff
  0x146250a7a000 - 0x146250a81fff
  0x146250a82000 - 0x146250a82fff
  0x146250a83000 - 0x146250a83fff
  0x146250a84000 - 0x146250a84fff
  0x5579d039a000 - 0x5579d048afff
  0x5579d048b000 - 0x5579d0594fff
  0x5579d0595000 - 0x5579d05f4fff
  0x5579d05f6000 - 0x5579d0624fff
  0x5579d0625000 - 0x5579d0655fff
  0x5579d0656000 - 0x5579d0659fff
  0x5579d13c8000 - 0x5579d13e8fff
  0x7ffcfd228000 - 0x7ffcfd248fff
  0x7ffcfd275000 - 0x7ffcfd278fff
  0x7ffcfd279000 - 0x7ffcfd27afff