3

Nyquist(xlispに非常に似ています)の文字列から特定の文字を削除して、結果を返すにはどうすればよいですか?

「ABBAAAABBBAABAAAB」のような文字列に「A」がいくつあるかを数えたいです。(はい、文字列には「A」と「B」のみが含まれます。)

ナイキストには(カウント)関数がないので、次のようなものを試しました

(length (remove #\B mystring))

また

(length (remove #\B mystring :test equal))

しかし、それは機能しません。

文字数を少し忘れて、文字列から「B」を削除するにはどうすればよいですか?

4

2 に答える 2

2

文字列には常にAsとBsだけが含まれますか?そうでない場合は、次のようなことをしたいかもしれません

(remove #\A yourstring :test-not 'char=)

のXLISPリファレンスにremoveよると、ナイキストはsremoveを処理せず、stringsのみを処理しlistます。このように操作するには、をに変換する必要がありますが、どちらもありstringません。ちょっとハッキーですが、私が見る最も簡単な方法は、とそれをストリーミングすることです。これにより、で操作できるのが生成されます。listcoercestringread-charlistcharremove

(defun string->list (a-string)
  (let ((collector nil)
        (stream (make-string-input-stream a-string)))
    (dotimes (c (length a-string) (reverse collector))
      (setf collector (cons (read-char stream) collector)))))

これで可能になるはずです

(remove #\A (string->list yourstring) :test-not 'char=)
于 2012-01-28T02:00:39.290 に答える
1

これは古い質問だと思いますが、800を超えるビューがあるため、簡単な答えを得る価値があります。

(defun remove-char (character sequence)
  (let ((out ""))
    (dotimes (i (length sequence) out)
      (setf ch (char sequence i))
      (unless (char= ch character)
        (setf out (format nil "~a~a" out ch))))))

(setf mystring "ABBAABABCCCCBBCCCCAAA")
(remove-char #\B mystring) ;returns "AAAACCCCCCCCAAA"
于 2019-09-03T22:47:57.890 に答える