Namaran

Code daily. Without assist.

2026-09-12

reaches_target.rs

fn reaches_target(start: i32, step: i32, target: i32) -> bool {
    // write this: repeatedly add `step` to `start`, and return true
    // if the running value ever equals `target` exactly, without
    // looping forever when it never will
}

startstepを繰り返し足していったとき、途中でちょうどtargetと等しい値になればtrue、そうならないならfalseを返すreaches_targetを実装してください。「足していけばいつか等しくなるはず」という思い込みだけで!=をループ条件にすると危険な場合があります。

Reference
fn reaches_target(start: i32, step: i32, target: i32) -> bool {
    let mut current = start;
    while current != target {
        if step == 0 {
            return false;
        }
        let next = current + step;
        if (step > 0 && next > target) || (step < 0 && next < target) {
            return false;
        }
        current = next;
    }
    true
}

current != targetだけをループ条件にすると、steptargetをまたいで通り過ぎる場合(例えば0から3ずつ足して10を狙う場合)に、値が一致することなく無限ループします。「増え続ければいつか等しくなる」という等値比較への期待は、刻み幅次第では成立しません。stepが0の場合と、次の一歩で行き過ぎる場合の両方を先に検出して打ち切るのが安全です。これは参考実装であり、唯一の正解ではありません。