2012-03-02 20 views
0

私はSchemeを使い始めています。Scheme - 文字列を操作する

私はString Libraryからいくつかの手順を使用しようとしています。ここで

は私が必要なものです:

入力: "ccaAaAaAa"

機能:はABAに可能なすべてのAAAを代入し、すべての文字列を生成し、1個の置換のみ

出力:「ccaBaAaAa」および「ccaAaBaAa」および「ccaAaAaBa」

これを行う簡単な方法はありますか?おそらく、パターンのインデックスのリストを返すプロシージャですか?

明らかに、検索関数string-containsは最初のオカレンスのみを返します。

最初の文字列 "ccaBaAaAa"を作成した後、見つかったパターンの最初のインデックスにトリムします。元の "ccaAaAaAa"は "AaAaAa"になります。繰り返す(再帰的に)。

ありがとうございました。

+0

この宿題はありますか?そうであれば、タグ付けする必要があります。 – Perry

+0

いいえ、そうではありません... – ercliou

答えて

0

私が知りませんでした、より良い文字列ライブラリがあると思いました。しかし、私は質問で私が提案したことをやり遂げる。 (一般的な入力の場合)

(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

string-containsは、すべての部分文字列のリストを表示しませんが、インデックスがあるかどうか、存在する場合はそのインデックスを示します。また、文字列内の特定の範囲に検索を制限することもできます。これに基づいて、一致するものが見つかると、一致しなくなるまで残りの文字列を再帰的に検索することができます。

そこから、それぞれのマッチに対して置換を行うことができます。

0

このような関数を書いて何が問題になりますか?

(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分の作業。