変数値を範囲内に丸める

整数値を持つ変数 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個目の要素になることが分かります。

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

投稿者:

dyama

佐世保のシステムエンジニアです。詳しいプロフィールやこのブログについてはこちらをご覧ください。

コメントを残す

メールアドレスが公開されることはありません。

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