使用两个字符串开始和结束覆盖一个字符串的函数
我使用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))))
我允许使用辅助功能等基本数学函数,但这是我以前从未做过的事情。太糟糕的方案/球拍没有一些易于使用的替换功能。 在此先感谢!这是非常具体的,因为我可以得到这个非常。
使用您的一个在线解决方案:只
(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
长度大于beg
和end
长度相结合,在这种情况下,您只需将追加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"
显然想通了,这是一个单行的答案。 Bullcrap!
(define (overwrite s beg end) (string-append beg (substring s (string-length beg) (- (string-length s) (string-length end))) end))
我的意思是,如果任何人有这样做的更好的方式,随时分享。
我会接受这是一个很好的答案但我们刚刚了解条件语句分配给出了,我们被告知,我们间没有”后允许用于这个特定的问题。 –