Search code examples
schemeracketsliding-windowsubsequence

Racket: sliding window over a vector


What are some good ways to perform a sliding window over a finite sequence in Racket, such as finding the highest sum of any sub-sequence of 4 numbers?

(define example #(3 1 4 5 10 23 1 50 0 12 40 12 43 20))

Solution

  • First find prefix sums:

    #lang racket
    (define example #(3 1 4 5 10 23 1 50 0 12 40 12 43 20))
    
    (define-values (sums sum)
      (for/fold ([sums '()] [sum 0]) ([x example])
        (values (cons sum sums) (+ sum x))))
    (list->vector (cons sum sums))
    

    Result:

    '#(224 204 161 149 109 97 97 47 46 23 13 8 4 3 0)
    

    Then ... profit.

    Where profit could be this:

    #lang racket
    (define example #(3 1 4 5 10 23 1 50 0 12 40 12 43 20))
    
    (define (prefix-sums xs)
      (define-values (sums sum)
        (for/fold ([sums '()] [sum 0]) ([x xs])
          (values (cons sum sums) (+ sum x))))
      (list->vector (reverse (cons sum sums))))
    
    (define (sum4 xs i)
      (- (vector-ref xs (+ i 4))
         (vector-ref xs    i)))
    
    (define (sum4s xs)
      (for/list ([i (- (vector-length xs) 4)])
        (sum4 (prefix-sums xs) i)))
    
    (apply max (sum4s example))