2017-09-27 10 views
1

私は奇妙な言語のラケットを使用して先頭と最後に2つの文字列を上書きします。例えば先頭と末尾に2つの文字列で1つの文字列を上書きする関数を作成します。

(define overwrite (s beg end)... 

(overwrite "catapult" "dog" "blah")べき出力"dogablah" (overwrite "greenbeans" "munk" "grub")べき出力"munknbgrub"

場合によっては、上書きによって中央の単語が完全に追い越されることがあります。 (overwrite "dog" "mouse" "flea")は、"mouseflea"を出力する必要があります。

主な問題は、この問題を解決するために3つの組み込み関数しか使用できないことです。 (文字列の長さ)、(サブ)と(文字列APPEND)

私は無駄に以下試してみた:

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

私はヘルパー関数やその他の基本的な数学関数を使用することを許可していますが、これは私が以前にしたことのないものです。あまりにも悪いスキーム/ラケットには、使い易い交換機能がありません。 ありがとうございます!これは私がこれでかなり得ることができるほど具体的です。

答えて

1

ご一行ソリューションの使用:次はうまくいくことを

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

予告:

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

が、次は失敗になります。理由は

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

を、substringのみ非負の整数を引数として受け入れます。 sの文字列の長さは、例えば、より小さいendある時はいつでも、引数ので

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

は負になります。 "犬"対 "ノミ"、これは例外を発生させます。

sの長さが、あなたは、単にbegendを追加します。その場合にはbegと組み合わせendの長さは、より小さい場合は、チェックすることでこれを解決することができます。例えば:

(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

明らかに、これは1行の回答でした。ブルックトラップ!

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

誰のは、これを行うためのより良い方法を得た場合、私は意味し、共有すること自由に感じ。

関連する問題