2017-09-27 15 views
1

저는 처음에는 끝점과 끝에서 두 문자열을 덮어 쓸 때 Racket의 이상한 언어를 사용하고 있습니다. 예를 들어시작과 끝에서 두 문자열로 한 문자열을 덮어 쓰는 함수를 만듭니다.

(define overwrite (s beg end)... 

, (overwrite "catapult" "dog" "blah") 출력해야 "dogablah" (overwrite "greenbeans" "munk" "grub") 출력해야 "munknbgrub".

가끔 덮어 쓰기가 중앙 단어를 완전히 따라 잡을 수 있습니다. (overwrite "dog" "mouse" "flea")"mouseflea"을 출력해야합니다.

주요 문제는이 문제를 해결하기 위해 세 가지 기본 제공 함수 만 사용할 수 있다는 것입니다. 내가 도우미 기능과 기타 기본적인 수학 함수를 사용할 수있어

(define (overwrite s beg end) 
    (string-append (substring s 0 (string-length beg)) "" 
       (substring s (- (string-length s) (string-length end)) 
          (string-length s)))) 

있지만 : (문자열 길이), (문자열)와 (문자열 APPEND는)

나는 아무 소용이 다음 시도했다 이것은 내가 전에 해선 안된 일이다. 너무 나쁜 계획/라켓에는 사용하기 쉬운 몇 가지 교체 기능이 없습니다. 미리 감사드립니다. 이것은 제가 이걸 꽤 많이 얻을 수있는만큼 구체적입니다.

답변

1

:

(overwrite "greenbeans" "munk" "grub") 
=> "munknbgrub" 

을하지만, 다음과 실패 :

(define (overwrite s beg end) 
    (string-append beg (substring s (string-length beg) (- (string-length s) (string-length end))) end) 

통지는 다음과 같은 것이 작동 할

(overwrite "dog" "mouse" "flea") 

이유는, substring 만 비 음수 정수를 인수로 허용합니다. s의 문자열 길이는 예를 들면,보다 작은 end 때마다 인수 이후

(- (string-length s) (string-length end)) 

음수가된다. "개"대 "벼룩"은 예외를 발생시킵니다.

당신은 s의 길이는 단순히 begend를 추가 할 경우 결합 begend의 길이보다 작은 경우 확인하여이 문제를 해결할 수 있습니다. 예 :

다음
(define (overwrite s beg end) 
    (let ((l1 (string-length s)) 
     (l2 (string-length beg)) 
     (l3 (string-length end))) 
    (if (>= (+ l2 l3) l1) 
     (string-append beg end) 
     (string-append beg (substring s l2 (- l1 l3)) end)))) 

당신은해야합니다 :

(overwrite "greenbeans" "munk" "grub") 
=> "munknbgrub" 
(overwrite "dog" "mouse" "flea") 
=> "mouseflea" 
+0

나는 그러나 우리가 조건문에 대해 배운 좋은 대답은 이것을 받아 들일 것입니다 할당이 밖으로 주어졌다 그리고 우리는 우리가 'weren 히라고 들었다 후 이 특정 질문에 사용하도록 허용되지 않았습니다. –

1

분명히 한 줄 대답이었습니다. 헛소리!

(define (overwrite s beg end) (string-append beg (substring s (string-length beg) (- (string-length s) (string-length end))) end))

나는 누구의이 일을 더 좋은 방법을 가지고있는 경우, 공유 주시기 의미한다. 당신의 한 줄 솔루션을 사용