Красиво вывести дерево - Lisp

Узнай цену своей работы

Формулировка задачи:

Что-то первое сентября уже прошло, а тишина раздела осталась не тронута Предлагаю задачку - есть дерево в форме списка - первый элемент значение узла, остальные - лес У нас же динамика. Типа такого
Листинг программы
  1. (a b (c d e) f (g h (i j (k (l)) m n o)))
Задача - красиво визуализировать его на экране - в текстовом или в графическом виде, горизонтально или вертикально и т.п. - как фантазия подскажет Я взял простую классику:
Листинг программы
  1. (defn show-tree (t)
  2. (defn foldl-last (f g a l)
  3. (defn go (a l) (cond (null? l) a
  4. (null? (cdr l)) (g (car l) a)
  5. (go (f (car l) a) (cdr l)) ))
  6. (go a l))
  7. (defn go (t v)
  8. (defn f (c d)
  9. lambda (x a) ++ a \n v "|" \n v c "- " (go x (++ v d " ")))
  10. (cond (list? t)
  11. (++ "<" (car t) ">"
  12. (foldl-last (f "+" "|") (f "`" " ") "" (cdr t)))
  13. t))
  14. (go t ""))
  15. => OK
  16. def t '(a b (c d e) f (g h (i j (k (l)) m n o)))
  17. => OK
  18. t
  19. => (a b (c d e) f (g h (i j (k (l)) m n o)))
  20. ++ \n (show-tree t)
  21. =>
  22. <a>
  23. |
  24. +- b
  25. |
  26. +- <c>
  27. | |
  28. | +- d
  29. | |
  30. | `- e
  31. |
  32. +- f
  33. |
  34. `- <g>
  35. |
  36. +- h
  37. |
  38. `- <i>
  39. |
  40. +- j
  41. |
  42. +- <k>
  43. | |
  44. | `- <l>
  45. |
  46. +- m
  47. |
  48. +- n
  49. |
  50. `- o

Решение задачи: «Красиво вывести дерево»

textual
Листинг программы
  1. (defun dwtree (tree w x y &optional (lv 0))
  2.   (cond ((null tree) y)
  3.         ((atom (car tree))
  4.          (let ((xn (+ x 20))
  5.                (yn (+ y 15)))          
  6.              (grwLine w x y x yn _BLACK)
  7.              (grwLine w x yn xn yn _BLACK)
  8.              (grwPrint w xn (+ y 7) (output (car tree)) _RED)
  9.              (dwtree (cdr tree) w x yn lv)))
  10.         (t
  11.          (let ((xn (+ x 30 (* lv 5)))
  12.                (yn (+ y 15)))
  13.               (grwLine w x y x yn _BLACK)
  14.               (grwLine w x yn xn yn _BLACK)
  15.               (grwPrint w xn (- yn 7) "<*>" _BLACK)
  16.               (let* ((new-v (dwtree (car tree) w xn yn (+ lv 1)))
  17.                      (yy (if (null (cdr tree)) new-v (+ 15 new-v))))
  18.                     (when (cdr tree) (grwLine w x y x yy _BLACK))
  19.                     (dwtree (cdr tree) w x yy lv)
  20.                     yy)))))

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут