Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

一定値以下の値を固定値で返したい場合、配列とArray#maxでちょっと楽しく書くことができる

その発想がなかったのでメモ。

一定値以下の値を固定値で返したい場合……
例えば、値がマイナスの時、0にしたいというようなケースでは、
配列とArray#maxでちょっと楽しく書くことができます。

Rubyだと

ary = Array.new(10) {rand(0xf)}
#=> [9, 4, 5, 6, 7, 8, 7, 6, 12, 0]

ary.map {|x| ((x -= 8) > 0) ? x : 0}
#=> [1, 0, 0, 0, 0, 0, 0, 0, 4, 0]

これが、こんな感じの実装になります。

ary = Array.new(10) {rand(0xf)}
#=> [9, 4, 5, 6, 7, 8, 7, 6, 12, 0]

tmp=->x{[0,x-8].max}
ary.map(&tmp)
#=> [1, 0, 0, 0, 0, 0, 0, 0, 4, 0]

速度的なお話

と、まぁProcの常で速度はやや残念なことになっています。

Benchmark.realtime { ary.map {|x| ((x -= 8) > 0) ? x : 0} }
#=> 7.06e-06

Benchmark.realtime { tmp=->x{[0,x-8].max}; ary.map(&tmp) }
#=> 9.337e-06