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

我的意思是,如果任何人有这样做的更好的方式,随时分享。

相关问题