gpt4 book ai didi

scheme - Racket 方案 - 从流中删除重复的连续字符

转载 作者:太空宇宙 更新时间:2023-11-03 18:48:34 25 4
gpt4 key购买 nike

我正在尝试实现一个函数,该函数以递归方式从给定流中删除所有额外的空格。任何连续的空格都应该被删除,允许单词之间有一个最大的空格。我不知道如何正确实现。

我已尝试将流转换为列表并以这种方式对其进行操作,但根据我对每个元素的测试所提供的内容,我根本无法弄清楚如何构建新流并返回它。我曾尝试使用流图,但在这种情况下它似乎对我不起作用(删除元素,构建新流)

这是我目前对 remove-extra-spaces 的错误实现:

    (define remove-extra-spaces
(lambda (str)
(cond (not (not-more-than-one-space str 0) (stream-append (stream-first str) (remove-extra-spaces (stream-rest str))))
(else (remove-extra-spaces (stream-rest str)))
)))


(define not-more-than-one-space
(lambda (str count)
(cond ((stream-empty? str) #T)
((equal? (stream-first str) #\space) (not-more-than-one-space (stream-rest str) (+ count 1)))
((> count 1) #F)
(else #T)
)
))

我写了一个测试来帮助我找出何时有多个连续的空格。但是,我无法弄清楚如何使用此测试根据通过它的内容创建新流。当我尝试将它与流图结合使用时,流过滤器对我不起作用。

最佳答案

你知道如何使用stream-cons吗?这可能是实现它的最简单方法。这是我的实现(使用 SRFI 41 流库而不是 racket/stream 因为我对此更熟悉):

(require srfi/41)
(define-stream (collapse-spaces strm)
(stream-let loop ((was-space #f)
(strm strm))
(cond ((stream-null? strm) strm)
((char=? (stream-car strm) #\space)
(if was-space
(loop #t (stream-cdr strm))
(stream-cons #\space (loop #t (stream-cdr strm)))))
(else (stream-cons (stream-car strm)
(loop #f (stream-cdr strm)))))))

样本运行:

> (stream->list (collapse-spaces (stream #\f #\o #\o #\space #\space #\b #\a #\r)))
(#\f #\o #\o #\space #\b #\a #\r)

关于scheme - Racket 方案 - 从流中删除重复的连续字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40955011/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com