2012-09-03 3 views
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로 제한 할 수있는 방법을 묻습니다.

답변

2

let을 사용하면 난수를 변수에 바인딩 할 수 있습니다.

(define pick-at-random 
    (lambda (s) 
    (let ((index (random (string-length s)))) 
     (substring s index (+ index 1))))) 
1

다음은이 방법으로 당신이 바인딩 let에 인덱스를 저장하지 않아도, substring를 사용하지 않고 다른 대답. 이 문제에 더 많은 기능 (따라서, 관용적) 해결책 :

(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 인 문자열로 되돌립니다.

0

이전 두 답변은 정상입니다. 다른 방법으로는 두 가지 문제로이 문제를 깰 수 :

  • 는 개발 기능 단어 및 인덱스를 받아, 단어의 n 번째 문자가 포함 된 문자열을 반환 "n 번째 문자".

  • 설명하는 것을 수행하는 "pick-at-random"기능을 개발하십시오. (덧붙여, 나는 "픽업에서 랜덤"보다 다소 더 예 : "임의 문자"로 이름을 생각한다.)

이 분해가 당신이 설명하는 문제가 다른 함수로 그것을 인수함으로써, 해결 .

"Under the hood"는 "let"을 사용하는 것과 같은 솔루션입니다.