2017-09-27 52 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)))) 

我允許使用輔助功能等基本數學函數,但這是我以前從未做過的事情。太糟糕的方案/球拍沒有一些易於使用的替換功能。 在此先感謝!這是非常具體的,因爲我可以得到這個非常。

回答

1

使用您的一個在線解決方案:只

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

的原因是,substring

(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" 

,但下面會失敗接受非負整數作爲參數。由於參數

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

變爲負每當s字符串長度小於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

我會接受這是一個很好的答案但我們剛剛瞭解條件語句分配給出了,我們被告知,我們間沒有」後允許用於這個特定的問題。 –

1

顯然想通了,這是一個單行的答案。 Bullcrap!

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

我的意思是,如果任何人有這樣做的更好的方式,隨時分享。

相關問題