はてなキーワード: to_iとは
https://www.youtube.com/watch?v=yhDLmGpjdms
これよりもっとひどい動画はごまんとあるが、ここまでタイトルで煽っている以上指摘するわ。
プロフィール見るとCTOを経て独立してプログラミングスクールの会社やっているっぽいけど、すごい時代だな。
晒しになっちゃったけど、他にも有名(と思われる)プログラミング系YouTuberが実際にコードを書いている場合でひどいのはザクザク見つけられるから、見つけてため息をつくといいと思います。
初心者の自分にはひねったコードは書けないので期待しないでね。
なれている人のコードはショートハンドとかバリバリ使っててあまり読めないorz。
#小さい順に数え上げて、既知の素数で割りきれないもを素数として表示。 #既知の素数は配列に格納する。 puts '0からどこまでの範囲の素数を探しますか?終端の数を入力してください。' last_num = gets.chomp.to_i if last_num < 1 puts '素数はありません' elsif last_num < 2 puts '素数は1だけです。' else puts 1 puts 2 sosuu_hairetu = [2]#既知の素数を格納する配列 ichi = 0#素数の入っている配列を参照する時に使う count = 3#これが素数であるか比較する対象 while count <= last_num sosuu_hairetu.each do |waru|#それまでに分かっている素数と比較する if count%waru == 0#割りきれたら他のに移る count = count+1 retry end end puts count sosuu_hairetu[(ichi = ichi + 1)] = count count = count+1 end puts last_num.to_s + 'までに素数は' + ( sosuu_hairetu.length + 1 ).to_s + '個ありました。'
それからしごとホスイ。
相談乗ってもらってる立場なのに気づかず時間開いてすまん。
まあファイル内容いったんメモリ上の配列にしてもいいのかもしれないけど、どうせならIOごと減らすアプローチからと欲張っているのだ…やりすぎたかな。メモリ消費はあんまり気にしないけど、ともかく動作時間はストレスなんで減らしたい。まあバイナリサーチも考えたけど、アベレージがわかってればそっちの方が早いかな…と欲張っている状態。それと行数!=IDなんでちょっとややこしい。
あと文字列オブジェクトのメンバ関数to_iは、整数化メンバらしいです。
#実は /^( ID1 )\t( ID2 )\t( DATA )$/ なるもっと嫌なファイルが控えていたり…げんにょり
http://anond.hatelabo.jp/20071211012602
改訂:2:30
増田今夜は寝ます、おやすみー
お、いらっしゃいましたか。
このコードのコンセプトは、「馬鹿でかいファイルから幾つかの特定行を参照するにあたり、なるべくディスクIOを減らしつつメモリ消費も押える」と解釈したけどあってるのかな?
キャッシュした行番号はソートしたリストにしておけばバイナリサーチで比較的早く最近傍を見つけることができるし、見つけた場所へ今回キャッシュした行を挿入すればソートが維持できる。
キャッシュの大きさにもよるけれど、シークしながら探すより、オンメモリで探す方が早い気がする。そういうモジュールがすでにあるかも知れないし。
キャッシュがでかくなるなら、いっそ全部読んじゃった方が良いかも知れないし、でかいならDB使っちゃった方が効率的かも知れない。
その辺はアクセスパターンや規模や行長のバラツキやあれやによるからなんともいえないけれど。
ところで、実はruby知らないんで聞くんだけど。
なんかデーターが見つからない危険性を感じるというか。ファイルがでかいからreadlinesとか使いたくないんだけれども無理かな。
class Id_sorted_data def initialize path, avarage_bytes_by_one_data, search_margin @f = File.open(path); @v = avarage_bytes_by_one_data; @cash = {}; @margin = search_margin; return self end def read number if @cash.member?(number) return @cash[number]; end @f.seek([(number - @margin) * @v, 0].max); for i in 1..20 @f.readline; temp = @f.readline; @cash[temp.to_i] = temp; if temp.to_i == number return @cash[number]; elsif (number - @margin .. number).include?(temp.to_i) return near(number); end @f.seek((number - temp.to_i - @margin) * (@v * (20 - i) / 20), IO::SEEK_CUR); end end def near number for i in 1..@margin temp = @f.readline; @cash[temp.to_i] = temp; if temp.to_i == number return @cash[number]; end end end end
http://anond.hatelabo.jp/20070508170219
「%(剰余演算子)使用禁止」みたいな話があったので、逆に無駄に馬鹿っぽいプログラムが出てくると、どれくらい間抜けな「剰余を求める関数」になるか見てみたい。
……いざ間抜けに作ろうとすると、それはそれで難しい。
#!ruby -Ks # 3で割り切れるなら0を返す # 割り切れないときは各桁の数を足した数字が返ってくるけど、再帰用だから気にしないでね>< def mod3_equal_zero(i) s = i.to_s num = 0 s.split('').each {|c| num += c.to_i } if (num > 9) then num = mod3_equal_zero(num) end num=0 if num == 3 || num == 6 || num == 9 num end # 5で割り切れるなら0を返す def mod5_equal_zero(i) s =i.to_s i=0 if s[-1,1] == "0" i=0 if s[-1,1] == "5" i end # メイン (1..100).each{|i| str ="" str += "Fizz" if mod3_equal_zero(i) == 0 str += "Buzz" if mod5_equal_zero(i) == 0 str = i.to_s if (str == "") print str,"\n" }