> 1 <

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

Vasilevs

Members


Статус

3 сообщений

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

#6777   2012-11-30 01:59 GMT+3 часа(ов)      
Условные переходы: Определить предикат, реализующий подсчет голосов, который воз-вращающий значение Т, если решение принято. Аргументом преди-ката является список формата ((ivanov za) (petrov protiv) (sidorov za)).Длина списка не более трех элементов.

Итерационные алгоритмы: Реализовать простейший переводчик текста (минимум на 10 слов). Если слова не в словаре, то в результирующий список оно заносится без изменений. Например
$(func ‘(This is dog Tommy))
(ЭТО ЕСТЬ СОБАКА TOMMY)

Рекурсивные функции: Реализовать простейший переводчик текста (минимум на 10 слов). Если слова не в словаре, то в результирующий список оно заносится без изменений. Например
$(func ‘(This is dog Tommy))
(ЭТО ЕСТЬ СОБАКА TOMMY)
с помощью рекурсии

Aoloa

Members


Статус

37 сообщений

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

#6811   2012-11-30 21:35 GMT+3 часа(ов)      
(defun podschet-golosov (arg)
(cond
((null arg)
NIL)
((null (cdr arg))
(eq (cadar arg) 'za))
((null (caddr arg))
(and (eq (cadar arg) 'za) (eq (cadadr arg) 'za)))
(t
(or (and (eq (cadar arg) 'za) (eq (cadadr arg) 'za))
(and (eq (cadar arg) 'za) (eq (car (cdaddr arg)) 'za))
(and (eq (cadadr arg) 'za) (eq (car (cdaddr arg)) 'za))))))


Эта функция специально написана такой громоздкой, т.к. в ней используются только условные команды. В реальном коде всё было бы проще.

Пример использования:
(podschet-golosov '((ivanov za) (petrov protiv) (sidorov za)))
;;результат: T
 
(podschet-golosov '((ivanov za) (baba-Yaga protiv)))
;;результат: NIL
 
(podschet-golosov '((ivanov za) (petrov za)))
;;результат: T


Цитата

Итерационные алгоритмы


Скажите, что именно вы проходили. Do? Dolist? Loop? Mapcar?

А то я-то могу написать, но как я узнаю, что вы проходили, а что нет?

Как представлять слова в словаре? Вы проходили хэш-таблицы? Ассоциативные списки?
With iTeX* your entire life can be encapsulated into a dynamic hyperdocument, downloadable by anybody you designate (Donald E. Knuth, An Earthshaking Announcement)

Aoloa

Members


Статус

37 сообщений

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

#6812   2012-11-30 22:03 GMT+3 часа(ов)      
Вот пример с использованием mapcar. Словарь китайско-русский (китайский вводится латиницей с тонами):
 
(defparameter *dictionary*
'((wo3 . я) (ni3 . ты) (ta1 . он/она) (wo3men0 . мы)
(ni3men0 . вы) (ta1men0 . они) (zhi1dao4 . знать)
(hui4 . мочь) (neng2 . мочь)
(ai4 . любить) (hen4 . ненавидеть) (hen3 . очень)
(bu4 . не) (bu4guo4 . но) (ru2guo3 . если)
(de0hua4 . то) (xi3huan0 . любить) (kan4 . смотреть)
(shu1 . книга)))
 
(defun translate-word (word)
(let ((a (assoc word *dictionary*)))
(if a
(cdr a)
word)))
 
(defun translate-sentence (list)
(mapcar #'translate-word list))


Пример использования:
(translate-sentence '(Bu4guo4 wo3 hen3 xi3huan0 Wang2 Fei1))
;; результат: (НО Я ОЧЕНЬ ЛЮБИТЬ WANG2 FEI1)
With iTeX* your entire life can be encapsulated into a dynamic hyperdocument, downloadable by anybody you designate (Donald E. Knuth, An Earthshaking Announcement)

Vasilevs

Members


Статус

3 сообщений

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

#6814   2012-12-01 20:01 GMT+3 часа(ов)      
Мы проходили только DO и LOOP, извиняюсь, что сразу не написал.
А представляю слова в словаре так:
(DEFUN f(a)
 
(setq res )
 
(loop
(when (NULL a) (return (REVERSE res)) )
 
(setq X(CAR a))
 
(if (EQL X This) (setq h(CAR '(ETO EST SOBAKA TOMMY)) ) )
(if (EQL X is) (setq h(CADR '(ETO EST SOBAKA TOMMY)) ) )
(if (EQL X dog) (setq h(CADDR '(ETO EST SOBAKA TOMMY)) ) )
(if (EQL X Tommy)(setq h(CADDDR '(ETO EST SOBAKA TOMMY)) ) )
 
(setq res(cons h res))
 
(setq a (cdr a))
)
)


Но по заданию еще нужно так- если слова не в словаре, то в результирующий список они заносится без изменений.

отредактировал(а) Vasilevs: 2012-12-01 20:18 GMT+3 часа(ов)

Aoloa

Members


Статус

37 сообщений

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

#6820   2012-12-04 22:38 GMT+3 часа(ов)      
У вас что-то очень странное. Честно — я не понимаю, что делает Ваша программа. В моём CLISP’е она вообще не запускается.


Зачем Вы используете (setq h(CADDR '(ETO EST SOBAKA TOMMY)))? Ведь можно просто использоватт (setq h 'SOBAKA) — это гораздо проще и смотрится лучше.

Я предлагаю вынести перевод отдельного слова в свою функцию, которая будет принимать английское слово и возвращать русское (так как вы проходили defun, думаю, с этим нет проблем):
(defun w (word)
(let ((res word))
(when (eq word 'THIS) (setq res 'ETO))
(when (eq word 'IS) (setq res 'EST))
(when (eq word 'DOG) (setq res 'SOBAKA))
(when (eq word 'CAT) (setq res 'KOSHKA))
res))


В этой функции я объявляю переменную res (с помощью let) с начальным значением word. Если она равна известным словам (this, is, dog, cat) — тогда мы заменяем значение res, иначе оно останется равно word (то есть Tommy останется Tommy). Потом я возвращаю res как результат функции.

Вот пример работы: (w 'THIS) даст ETO, а (w 'abracadabra) даст ABRACADABRA (в Lisp’е по умолчанию все символы делаются большими).

Теперь переводчик предложений можно написать, используя только что определённую функцию w. Для этого удобно использовать loop, если Вы его проходили:

(defun f (a)
(loop for i in a collect (w i)))


Пример работы: (f '(this is dog Tommy)) даст (ETO EST SOBAKA TOMMY). То, что и требовалось.
With iTeX* your entire life can be encapsulated into a dynamic hyperdocument, downloadable by anybody you designate (Donald E. Knuth, An Earthshaking Announcement)

Vasilevs

Members


Статус

3 сообщений

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

#6821   2012-12-05 00:04 GMT+3 часа(ов)      
Спасибо, ничего странного, я работаю в muLisp Все хорошо, вот только (defun f (a) (loop for i in a collect (w i))) не работает, а программа должна быть в один defun с LOOP или DO.
> 1 <


Онлайн :

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