Схема - Манипулирующие строки - PullRequest
0 голосов
/ 02 марта 2012

Я только начинаю со Схемы.

Я пытаюсь использовать некоторые процедуры из Библиотеки строк.

Вот что мне нужно:

input:"ccaAaAaAa"

функция: генерирует все строки, подставляя все возможные aAa в aBa, только одна подстановка

выход:"ccaBaAaAa" и "ccaAaBaAa" и "ccaAaAaBa"

Есть ли простой способ сделать это?Может быть, процедура, которая возвращает список найденных индексов шаблона?

Видимо, функция поиска строки string-only возвращает только первое вхождение.

Что я подумал: после создания первой строки "ccaBaAaAa", обрезать до первого индекса найденного шаблона: оригинал" ccaAaAaAa "становится" AaAaAa ".Повторите (рекурсивно).

Спасибо.

Ответы [ 3 ]

0 голосов
/ 12 марта 2012

Что плохого в написании такой функции?

(define (replace input)
  (let loop ((done '())
             (remaining (string->list input))
             (output '()))
    (if (pair? remaining)
        (if (char=? #\a (car remaining))
            (let ((remaining (cdr remaining)))
              (if (pair? remaining)
                  (if (char=? #\A (car remaining))
                      (let ((remaining (cdr remaining)))
                        (if (pair? remaining)
                            (if (char=? #\a (car remaining))
                                (loop (append done (list #\a #\A))
                                      remaining
                                      (cons (list->string
                                             (append done
                                                     (cons #\a
                                                           (cons #\B
                                                                 remaining))))
                                            output))
                                (loop (append done (list #\a #\A
                                                         (car remaining)))
                                      (cdr remaining)
                                      (reverse output)))
                            (reverse output)))
                      (loop (append done (list #\a (car remaining)))
                            (cdr remaining)
                            (reverse output)))
                  (reverse output)))
            (loop (append done (list (car remaining)))
                  (cdr remaining)
                  (reverse output)))
        (reverse output))))

(replace "ccaAaAaAa") ;=> ("ccaBaAaAa" "ccaAaBaAa" "ccaAaAaBa")

Работает около 15 минут.

0 голосов
/ 17 марта 2012

Я думал, что могут быть лучшие библиотеки строк, о которых я не знал. Но в итоге я делаю то, что предложил в вопросе. (Для общего случая ввода)

(define (aplicarRegra cadeia cadeiaOriginal regra n)
  (let* ((antes (car regra))
         (depois (cdr regra))
         (index (string-contains cadeia antes))
         (tamanho (string-length antes))
         (diferenca (- (string-length cadeiaOriginal) (string-length cadeia))))

    (if index
       (let* ((cadeiaGerada (string-replace cadeiaOriginal depois (+ index diferenca) (+ index diferenca tamanho))))

          (if(<= (string-length cadeiaGerada) n)
             (lset-union equal? (list cadeiaGerada) (aplicarRegra(substring cadeia (+ 1 index)) cadeiaOriginal regra n))
             (aplicarRegra (substring cadeia (+ 1 index)) cadeiaOriginal regra n)))
       (list))))

Но все равно спасибо!

0 голосов
/ 02 марта 2012

string-contains не даст вам список всех вхождений подстроки, но сообщит, есть ли она, и если есть, то каков ее индекс. Это также позволяет вам ограничить поиск определенным диапазоном в строке. Исходя из этого, если вы получите совпадение, вы можете рекурсивно искать остальную часть строки, пока не перестанете получать совпадение.

Оттуда вы можете сделать замену для каждого матча.

...