循環配列
const cycle = [0, 1, 2, 3, 4, 5]
>>> 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 0 -> 1 -> 2 -> 3 ...
距離は配列内での要素間の絶対値ではなく循環参照時に於いての距離、例えば
「現在4にいる。次に2を参照するのは何回後か」
を導出したい
以降現在地(例で言う4)をp、目的地(例で言う2)をt、配列全体の長さをLと表記する
なおp
、t
は配列内の位置、インデックスである
愚直なやり方
配列内で p <= t のとき
簡単
t-p
配列内で p > t のとき
上の例のような場合、t-p
では距離が負の値になってしまうため1周分を足して
t-p+L
とする必要がある。
p<=t
とp>t
の場合で条件分岐させるのは面倒。
結論
(t-p+L)%L
%
は剰余。t-p+L
÷L
の余り。p<=t
とp>t
で商が1か0かに変わるだけで、剰余はいずれの場合も同じ
使い道
- 曜日を循環配列に格納して「今日の曜日から起算して次の月曜日は何日後」
- 干支を循環配列に以下略
注意点
初めに言及した通り現在地と目的地が要素内容ではなくインデックスで判明していることが条件なので「次に内容が〇〇である要素までの距離」などにはそのままでは使えない