Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > LISP > Сжатие английских слов


Автор: Tomsk11 13.1.2013, 12:26
Приветствую всех!
Буду благодарен за помощь в решение данной задачи:

Построить программу «сжатия», назначение которой - преобразование английских слов в их "звуковой" код. Этот процесс предусматривает "сжатие" примерно одинаково звучащих слов в одинаковый их код - своего рода, аббревиатуру этих слов. Слова "сжимаются" в соответствии со следующими правилами:
первая буква слова сохраняется;
все последующие за ней гласные, а также буквы "h", "w" и "у" удаляются;
сдвоенные буквы заменяются одиночными;
закодированное слово состоит не более чем из четырех букв, остальные буквы удаляются.
Напишите функцию (f w), которая выдает результат сжатия слова, представленного в виде списка букв w. Примеры: (f '(b arringto n)) = (b r n g) и (f '(11 e we 11 у n)) =: (1 n). 

Автор: _sg 14.1.2013, 13:57
Код

(defun compress-word (w &optional ac &aux (a (car w)))
  (cond ((or (null w)(= (length ac) 4)) (reverse ac))
        ((or (member a '(a e i o u y h w)) (eq a (car ac)))
         (compress-word (cdr w) ac))
        ((compress-word (cdr w) (cons a ac)))))

> (compress-word '(b a r r i n g t o n))
(B R N G)
> (compress-word '(1 1 e w e 1 1 y n))
(1 N)

Автор: Tomsk11 8.3.2013, 21:37
Приветствую! Но в XLisp это не работает. :-(

Автор: _sg 10.3.2013, 18:31
Код

(defun compress-word (w)
  (compress w nil))

(defun compress (w ac)
  (cond ((or (null w)(= (length ac) 4)) (reverse ac))
        ((or (mmb (car w) '(a e i o u y h w)) (eql (car w) (car ac)))
         (compress (cdr w) ac))
        ((compress (cdr w) (cons (car w) ac)))))

(defun mmb (a w)
    (cond ((null w) nil)
    ((eql a (car w)) (cons (car w) (cdr w)))
    ((mmb a (cdr w)))))

> (compress-word '(b a r r i n g t o n))
(B R N G)
> (compress-word '(1 1 e w e 1 1 y n))
(1 N)

Автор: Tomsk11 13.3.2013, 14:21
Этот код тоже не работает. В любом случае- спасибо.

Автор: Tomsk11 14.3.2013, 21:51
Первый элемент, согласно задания, должен сохраняться независимо от того, какой он.

Добавлено через 2 минуты и 10 секунд
> (compress-word '(a r r i n g t o n))
(R N G T)

а должно быть (A R N G T)

Автор: _sg 16.3.2013, 22:39
ANSI Comon Lisp:
Код

(defun compress-word (w)
  (compress (cdr w) (list (car w))))

(defun compress (w ac &aux (a (car w)))
  (cond ((or (null w)(= (length ac) 4)) (reverse ac))
        ((or (member a '(a e i o u y h w)) (eq a (car ac)))
         (compress (cdr w) ac))
        ((compress (cdr w) (cons a ac)))))

> (compress-word '(a r r i n g t o n))
(A R N G)

Автор: _sg 25.4.2014, 17:04
Код

(defun compress-word (w)
  (compress (cdr w) `(,(car w))))

(defun compress (w ac &aux (a (car w)))
  (if (or (null w)(= (length ac) 4))
      (reverse ac)
      (compress (cdr w)
                (if (or (member a '(a e i o u y h w))
                        (eq a (car ac)))
                    ac
                    (cons a ac)))))

> (compress-word '(a r r i n g t o n))
(A R N G)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)