> 1 <

Автор Сообщение

Config13

Members


Статус

6 сообщений

Где: Russia
Род занятий:
Возраст:

#4841   2011-10-19 15:53 GMT+3 часа(ов)      
Здравствуйте, есть задача - Написать программу инверсии атомов для заданного списка. Инверсия состоит в замене местами атома самого высокого уровня атомом самого низкого уровня в циклическом порядке следования. У меня просто сын родился - и с этим счастьем я смог напрячь мозг только до вот этого:


(setq n 0 m1 0 m2 0)
(setq t1 ())
(defun p8(x)
(setq y x)
(setq a1 ()) ; список атомов саого высокого уровня
(setq a2 ()) ; список атомов саого низкого уровня
(setq x1 ()) ; преобразованный список
;(print y)
;(princ "\n")
(foreach z y
(setq m1 0)
(if (listp z)
(progn
(p8r z )
;(princ m1)
; (princ "\n")
(if (< n m1)
(setq n m1)
)
)
)
)
(if (atom z)
(progn
(setq a1 (cons z a1))
)

)
(princ n)
(princ "\n")


(foreach z y
(if (listp z)
(progn
;(p8p n t m1)
(setq v (cons t v))
)
)
)
(princ "nienee naiiai ieceiai o?iaiy \ n")
(princ v)
(princ )
)


(defun p8r (L )
(setq m1 (+ 1 m1))
(princ L)
(princ "\n")
(princ m1)
(princ "\n")
(foreach z1 L
(if (listp z1)
(p8r z1)
)
)
)


но вот чую - что неправ, помогите пожалуйста Пишем в автакадовском лиспе

отредактировал(а) Config13: 2011-10-19 16:14 GMT+3 часа(ов)

megamanx

Members


Статус

307 сообщений

Где: Russia
Род занятий:
Возраст:

#4843   2011-10-19 22:17 GMT+3 часа(ов)      
Я не совсем понял, что тебе нужно. Будем делать по частям. Только я на CL, но постараюсь всё через стандартные функции.
(defun foo(L &optional (depth 1))
(cond
((null L) nil)
((listp (car L))
(append (foo (car L) (1+ depth)) (foo (cdr L) depth)))
((null (cdr L)) (list (cons (car L) depth)))
(T (cons (cons (car L) depth) (foo (cdr L) depth)))))

Эта штука возвратит ассоциативный список типа (ключ . глубина вложения)
(a ((b)) ((((c) d))) (e)) -> ((A . 1) (B . 3) (C . 5) (D . 4) (E . 2))

Что дальше? Хочешь заменить A->C, B->B, C->A, D->E, E->D? Тогда
(defun asoc(L1 L2)
(cond
((null L1) nil)
(T (cons (cons (caar L1) (caar L2)) (asoc (cdr L1) (cdr L2))))))
 
(defun resolve(L)
(let* ((A (sort (foo L) #'(lambda(x y)(< (cdr x)(cdr y)))))
(pattern (asoc A (reverse A))))
(labels ((ret (L)
(cond
((null L) nil)
((atom L) (cdr (assoc L pattern)))
(T (cons
(ret (car L))
(ret (cdr L)))))))
(ret L))))


(resolve '(a ((b)) ((((c) d))) (e)))
(C ((B)) ((((A) E))) (D))

отредактировал(а) megamanx: 2011-10-19 22:57 GMT+3 часа(ов)
I wish I'd made you angry earlier

Config13

Members


Статус

6 сообщений

Где: Russia
Род занятий:
Возраст:

#4856   2011-10-21 14:56 GMT+3 часа(ов)      
Спасибо ОГРОМНОЕ - буду разбираться, а что нужно поменять что бы как по заданию.
ВОт Вы привели список, в нём нужно менять только атоиы 1 и 5 уровней, т.е. самый высокий
и самый низкий?????
А почему в цикле, - пример:
из (a ((b)) ((((c) d))) (e))должно получиться (с ((b)) ((((а) d))) (e)),
а вот в таком списке (a ((b)) ((((c) d))) (e((f)))) , (ой не напутал ли с кол-вом скобок)
мы A меняем на C, но F - тоже самого низкого уровня, и по циклу получается, что менять
его нужно на A и т.д

отредактировал(а) Config13: 2011-10-21 15:07 GMT+3 часа(ов)

megamanx

Members


Статус

307 сообщений

Где: Russia
Род занятий:
Возраст:

#4860   2011-10-21 22:00 GMT+3 часа(ов)      
Я не знаю, что там нужно менять. Меня смущает формулировка "замена местами атома самого высокого уровня атомом самого низкого уровня в циклическом порядке следования"
Смысл в том, что первая функция вытаскивает глубину вложения.
Последняя функция - это просто копирование списка, только вместо ((atom L) L) делается ((atom L) (подмена на другой атом))
Вторая просто вспомогательная и делает из двух списков - сортированного по глубине и сортированного как надо список для подмены.
I wish I'd made you angry earlier
> 1 <


Онлайн :

0 пользователь(ей), 18 гость(ей) :




Реклама на сайте: