1

ユーザーが空でない文字列を入力し、入力から長さ1のサブ文字列でランダムな文字を返すプロシージャを作成しようとしています。

すなわち

(pick-at-random "word")

~"w"

(pick-at-random "word")

~"r"

これまでのところ私は持っています:

    (define pick-at-random
      (lambda (s)
        (substring s (random(string-length s)) ())))

これにより、表示したい文字の位置がわかり、()がどこにあるかを感じます。部分文字列の開始値を表す変数をいくつか用意して、それに1つ追加する必要があります。しかし、私はこれを行う方法がわかりません。簡単に言えば、開始値でランダム関数を使用しながら、サブストリングを長さ1に制限する方法を尋ねています。

4

3 に答える 3

2

を使用letして、乱数を変数にバインドできます。

(define pick-at-random
  (lambda (s)
    (let ((index (random (string-length s))))
      (substring s index (+ index 1)))))
于 2012-09-04T00:48:50.813 に答える
1

を使用しない別の答えを次に示します。この方法では、バインディングsubstringにインデックスを保存する必要はありません。letこれは、問題に対するより機能的な(したがって慣用的な)解決策です。

(define (pick-at-random s)          ; read the following lines from bottom to top
  (string                           ; convert single character to string
    (string-ref s                   ; access character in string, given an index
      (random (string-length s))))) ; generate a random valid index in the string

(pick-at-random "word")
> "d"   ; random result

前の手順では、ランダムに有効なインデックスを生成してから、文字列内のその位置にある文字を選択します。最後のステップとして、1文字を長さ1の文字列に戻します。

于 2012-09-04T02:21:23.667 に答える
0

前の2つの答えは問題ありません。または、この問題を2つの問題に分割することもできます。

  • 単語とインデックスを受け取り、単語のn番目の文字を含む文字列を返す関数「nth-char」を開発します。

  • 説明したことを実行する関数「pick-at-random」を開発します。(ちなみに、「random-char」などの名前は「pick-at-random」よりもいくらか優れていると思います。)

この分解は、別の関数への引数にすることで、説明した問題を解決します。

「内部」では、これは「let」を使用するソリューションと同じソリューションです。

于 2012-09-04T21:31:08.467 に答える