Ruby 初心者スレッド Part 57©2ch.netat TECH
Ruby 初心者スレッド Part 57©2ch.net - 暇つぶし2ch1006:デフォルトの名無しさん
16/01/30 09:41:10.38 uXFVRCYk.net
>>990
ID:E1SYsv9d だろお前
いい加減しつこいぞ

1007:デフォルトの名無しさん
16/01/30 12:51:22.28 /T0e1x1G.net
お前平田だろ

1008:デフォルトの名無しさん
16/01/30 18:28:49.50 FojFAs7d.net
時々思い出したように Ruby でスクリプト書くといつもインクリメントで syntax error になる
なぜ忘れてしまうのか

1009:デフォルトの名無しさん
16/01/30 21:45:32.06 QMlo5tQL.net
他の言語でインクリメントをよく書いてるからでしょ
そんなにインクリメントを書く機会ってあるのか

1010:デフォルトの名無しさん
16/01/30 21:49:31.70 NWwyNWcX.net
Rubyはeachがあるからほとんど書かなくていいよな

1011:デフォルトの名無しさん
16/01/31 13:52:09.13 XXEMiKnQ.net
まぁ他の言語でも使わなくて済むなら使わないわな
for拡張なりsemaphore的なものなりでインクリメントデクリメントを使わなきゃいけない場面もかなり減ったし
インクリメントデクリメントは登場回数の割にバグを産みやすすぎる

1012:デフォルトの名無しさん
16/01/31 14:28:47.18 Q+LCs9MU.net
例えばこんなの
n=0; f=filesize; while(f/1024.0>=1){ f/=1024.0; n++; } return [f, " KMG"[n]]
再帰や対数でも書けるだろうけどさすがにちょっと
ruby ならあるだろうという謎の信頼感
ところでループ内で最後の要素だけ別の処理するみたいな場合にスマートな書き方ある?

1013:デフォルトの名無しさん
16/01/31 15:13:59.27 IomQZ6/B.net
こういうとき俺も困るわ
n += 1で凌いでるけどいい書き方あるの?

1014:sage
16/01/31 17:39:08.12 cEIhLW7n.net
>>997

1015:sage
16/01/31 17:41:00.39 cEIhLW7n.net
ごめん、本文抜けてた
" KMG#".each_char {|kmg|
  return f, kmg if f < 1024.0 || kmg == '#'
  f /= 1024.0
}

1016:sage
16/01/31 17:44:27.63 cEIhLW7n.net
バグってる、番兵の'#'はいらなくって、kmg=='G'までだったね。

1017:デフォルトの名無しさん
16/01/31 19:20:47.09 iwDB+Nos.net
簡単な書き方思いつかんね
f = 100000
%w(B KB MB GB).map.with_index{|u,i|[f/1024**i,u]}.reverse.find{|n,u|n>=1}
=> [97, "KB"]
最後だけ別ってのも直接そういうやり方は知らないなあ
a[0..-2].処理
a[-1].処理
って分けるくらいか

1018:デフォルトの名無しさん
16/01/31 19:41:35.09 oGNCocg8.net
本題からは反れるけど、この種のアルゴリズムとしては、除算より乗算、乗算よりビット演算か定数比較を推したいなぁ。

1019:デフォルトの名無しさん
16/01/31 22:13:03.97 DPmT4LpP.net
def vp(value, unit, prefixes)
value < unit || prefixes.size <= 1 ? [value, prefixes.first] : vp(value / unit, unit, prefixes.drop(1))
end
p vp(1023, 1024.0, %w(B KB MB GB))
p vp(1024 ** 1, 1024.0, %w(B KB MB GB))
p vp(1024 ** 2, 1024.0, %w(B KB MB GB))
p vp(1024 ** 3, 1024.0, %w(B KB MB GB))
p vp(1024 ** 4, 1024.0, %w(B KB MB GB))

[1023, "B"]
[1.0, "KB"]
[1.0, "MB"]
[1.0, "GB"]
[1024.0, "GB"]

1020:デフォルトの名無しさん
16/02/01 21:06:53.32 LsZlPhNI.net
うーん 981 の n+=1 でいくわ
ありがと

1021:デフォルトの名無しさん
16/02/01 21:55:23.68 d5xPHHkz.net
ruby は範囲が決まってないループについてスマートに処理書けなくてもやもやする

1022:sage
16/02/01 22:42:16.05 0IqKHljv.net
対数で行くと、こうかな?
scale =

1023:sage
16/02/01 22:44:12.56 0IqKHljv.net
scale = " KMG"
n = [[Math.log( val.abs, 1024 ), scale.size-1].min, 0].max.to_i
return val/1024.0**n, scale[n]
# 0や負でもいける
なんでうまくい書けないんだろう?

1024:デフォルトの名無しさん
16/02/01 22:58:58.20 FfN537Ew.net
log_2()の計算するときはたまにFixnum#bit_lengthを使うことがある

1025:デフォルトの名無しさん
16/02/01 23:02:48.11 0uPvYgHa.net
>>1008
ダブルクォーテーションが入ってるとなぜかそこでレスが途切れることがある
ただし、そのあとなぜかレス投稿に成功したりするからイラつく

1026:過去ログ ★
[過去ログ]
■ このスレッドは過去ログ倉庫に格納されています


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch