> 1 <

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

Tomogochi

Members


Статус

7 сообщений

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

#3654   2010-12-10 23:28 GMT+3 часа(ов)      
Добрый день(или вечер,у кого как). Нужна помощь в решении задачи в AutoLisp. Для вас она не сложная,я думаю,а я не знаю,как написать.
Даны строка слов и строка текста. Проверить текст на наличие хотя бы одного из слов и выдать соответствующее сообщение. Разделителями слов в строках являются один или несколько пробелов.
Заранее огромное спасибо!(и ещё,может есть какая-то литература по обработке строк?)

Tomogochi

Members


Статус

7 сообщений

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

#3719   2010-12-17 18:20 GMT+3 часа(ов)      
Никто не поможет бедной девушке?эх..

VH

Members


Статус

289 сообщений

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

#3720   2010-12-18 01:43 GMT+3 часа(ов)      
(defun F (text words)
(apply 'or
(mapcar
'(lambda (word)
(member word (read (strcat "(" text ")"))))
(read (strcat "(" words ")")))))

Схитрим - превратим строку текста и строку слов в списки, затем будем искать элементы списка слов в списке текста.

ander-skirnir

Members


Статус

227 сообщений
http://lisper.ru
Где: Ukraine
Род занятий: `'`,`',`',
Возраст: 30

#3721   2010-12-18 02:43 GMT+3 часа(ов)      
> apply 'or
Интересно. А там or является макросом?

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#3722   2010-12-18 03:12 GMT+3 часа(ов)      
А действительно) впервые вижу OR реализованный в виде процедуры. Или там APPLY какой-то хитрый)
Я бы использовал регулярные выражения, хотя не уверен, что их поддерживает AutoLisp.

отредактировал(а) misha: 2010-12-18 03:18 GMT+3 часа(ов)

Tomogochi

Members


Статус

7 сообщений

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

#3723   2010-12-18 03:24 GMT+3 часа(ов)      
VH,ой,как-то не понятно...Это AutoLisp у Вас?
а вот так пойдёт,ребят? а то я написала и не знаю, ка-то мутно... По идее строки можно рассматривать,как списки?
(defun stroki(s1 s2)
(cond
((null s2) nil)
((null s1) nil)
(t (or (member(car s1) s2)
(stroki (cdr s1) s2)))))

ander-skirnir

Members


Статус

227 сообщений
http://lisper.ru
Где: Ukraine
Род занятий: `'`,`',`',
Возраст: 30

#3725   2010-12-18 05:45 GMT+3 часа(ов)      
АвтоЛиспа не знаю, но на Common Lisp решил бы так:
(defun split-by (string separator)
(let (indexes)
(dotimes (i (length string))
(when (char= separator (elt string i))
(push i indexes)))
(maplist (lambda (cons)
(subseq string (1+ (car cons))
(cadr cons)))
(cons -1 (nreverse indexes)))))
 
(defun quux (words text)
(destructuring-bind (fst snd)
(mapcar (lambda (string)
(remove "" (split-by string
#\Space)))
(list words text))
(intersection fst snd
:test #'equal)))
 
(quux "asd deq qwe" "quux bar baz")
=> NIL
(quux "asd deq qwe" "quux bar qwe asd")
=> ("qwe" "asd")


Алгоритм здесь самый тривиальный - строки разбиваются на списки слов
пробелами, затем находится пересечение (в теоретико-множественном смысле) этих списков.

Вполне вероятно, что это заработает и на AutoLisp в таком же виде.

Tomogochi

Members


Статус

7 сообщений

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

#3726   2010-12-18 14:02 GMT+3 часа(ов)      
ander-skirnir, Common Lisp не изучаю,так что непонятно ничего.
Но спасибо,может кому-то поможет и пригодится

ander-skirnir

Members


Статус

227 сообщений
http://lisper.ru
Где: Ukraine
Род занятий: `'`,`',`',
Возраст: 30

#3727   2010-12-18 18:59 GMT+3 часа(ов)      
Здесь вообщем-то всё, кроме destructuring-bind достаточно каноничное для Лиспов. Можешь запустить, глянуть каких функций в автолиспе нет и спросить.

А такие вот рекурсии с cond, конечно прелестны, завораживают моноиконичностью, пуризмом, духом олдскульной научной фантастики и т.д, но уже в 70х Лиспы обзавелись большим количеством механизмов, часто позволяющих решать задачи удобнее, потому совсем всё писать на таких cond'ах - это как-бы маргинализм.

VH

Members


Статус

289 сообщений

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

#3728   2010-12-18 20:16 GMT+3 часа(ов)      
>Tomogochi
Конечно, это обычный AutoLISP.
Один из вариантов - работать со строками "напрямую", то есть разобрать строку текста в список по словам, разобрать строку слов в список по словам, далее посредством (member) искать слово из списка текста в списке слов, пока не найдется.
Другой вариант - превратить строку в список посредством функции (read). Для этого надо посредством (strcat) присоединить к строке спереди знак "(", сзади - знак ")" и полученную строку отправить аргументом в функцию (read) - в результате получается список символов из тех слов, которые были в строке (только все буквы будут в верхнем регистре). Собственно, это в моем варианте и было сделано, но Ваш подход лучше, так как в среднем быстрее добирается до завершения (у меня выполняется поиск всех слов строки слов, а у Вас по одному).

Tomogochi

Members


Статус

7 сообщений

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

#3729   2010-12-18 20:45 GMT+3 часа(ов)      
ander-skirnir, ну, в универе учат с cond-ами и всякими такими штуками.С преподами не поспоришь...(

ander-skirnir

Members


Статус

227 сообщений
http://lisper.ru
Где: Ukraine
Род занятий: `'`,`',`',
Возраст: 30

#3730   2010-12-18 21:03 GMT+3 часа(ов)      
Да ничего плохого в них нет. Просто ими язык не заканчивается, это всего-лишь один примитивный оператор ветвления. Грустно видеть, как десятки задач, которые вообще по-хорошему либо обычными циклами, либо базовыми ФВП решаются, криво натаскивают на рекурсию с cond. А преподы по Лиспу, судя по местным запросам студентов, все как один застряли где-то так в 62-63.

VH

Members


Статус

289 сообщений

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

#3731   2010-12-18 21:11 GMT+3 часа(ов)      
Первый вариант.
Функция (F0) преобразует строку в список слов:
(defun F0 (S)
(if (= S "")
(cons "" nil)
((lambda (char result)
(if (= char " ")
(if (= (car result) "")
result
(cons "" result))
(cons
(strcat char (car result))
(cdr result))))
(substr S 1 1)
(F0 (substr S 2)))))

Функция (F1) определяет, находятся ли в списке текста слова из списка слов:
(defun F1 (text words)
(if text
(or
(member (car text) words)
(F1 (cdr text) words))))

Функция (F) выполняет задание:
(defun F (text words)
(F1
(F0 text)
(F0 words)))

Tomogochi

Members


Статус

7 сообщений

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

#3732   2010-12-18 21:32 GMT+3 часа(ов)      
VH,спасибо!уже столько способов все предложили

megamanx

Members


Статус

307 сообщений

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

#3733   2010-12-19 02:07 GMT+3 часа(ов)      
I wish I'd made you angry earlier
> 1 <


Онлайн :

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