変数値を範囲内に丸める

整数値を持つ変数 x を min 〜 max で定義される範囲内に丸めたいというお話。

素直な書くと次のようになると思います。

## snip, ただし mim <= max の時。
if x < min
  x = min
elsif x > max
  x = max
end 

でも、何だかつまらないので、次のようにしてみました。

## snip
x = [min, x, max].sort[1] 

変数 x, min, max を一つの配列に入れて昇順ソートすると、取り出したい値は常に1個目の要素に入ります。min <= max という条件も不要となりました。

## snip
min = 1
max = 10
x = 3
[min, x, max].sort # => [1, 3, 10] 
x = -1
[min, x, max].sort # => [-1, 1, 10]
x = 20
[min, x, max].sort # => [1, 10, 20] 

範囲内の場合は元の値、min より小さければ min の値、max より大きければ max の値が1個目の要素になることが分かります。

コードゴルフ用ですかね。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください