Rust で尺取り

Rust で この問題 が解きたいですが,C-style for は Rust では煩雑になりがちです.

問題 1

let ans = (0..a.len())
    .scan((0, 0), |(right, sum), left| {
        *right += a[*right..]
            .iter()
            .position(|&a| {
                *sum + a > k || {
                    *sum += a;
                    false
                }
            })
            .unwrap_or(a[*right..].len());
        *sum -= a[left];
        Some(*right - left)
    })
    .sum::<usize>();

問題 2

let ans = (0..a.len())
    .scan((0, 0), |(right, sum), left| {
        *right += a[*right..]
            .iter()
            .position(|&a| {
                *sum + a > k || {
                    *sum += a;
                    false
                }
            })
            .unwrap_or(a[*right..].len());
        *sum -= a[left];
        Some(a.len() - *right)
    })
    .sum::<usize>();

解説

なし

おわりに

cond && { expr; true } の良い感じの改善策を募集しています.