Ruby

C で定義されたメソッドと Ruby で定義されたメソッドで Continuation オブジェクトへの変数の保存のされ方が違う

callcc で遊んでいてローカル変数の保存のされ方ってどうなっているんだ?とふと思って試してみました。 試していたら、 C で実装されたメソッドと、Ruby で実装されたメソッドで変数の保存のされ方が違うことに気づきました。 cont = nil 10.times do |i| p…

Generator の再発明

思考実験: returnを関数と思ってみる話 - d.y.d.をきっかけにちょっぴり継続がわかりました。 そこで、Generatorを再発明してみました。 class MyGenerator class StopIteration < IndexError; end def initialize(obj, method_name=:each) @obj = obj @meth…

裁判員になる確率は1/100です - www.textfile.org

883840239413745673888484367614071057790536685391943120866342686853088554088962741529800523812714432924482598710613913144352575140063676571506082961578643064214433481064949969375249999 / 88817841970012523233890533447265625000000000000000000…

Shift_JIS(CP932)の重複している文字の列挙

参考: Microsoftコードページ932 - Wikipedia 出力結果: http://www.fujidig.com/misc/sjis-duplication.txt なんか自分の区番号の認識が間違ってたぽい。第二バイトが40-7Eだったら奇数で80-FCだったら偶数と思ってたんだけど。正しくはどうなんだろう 区点…

Ruby 1.9 SUPPORT_JOKE の bitblt を試してみる

$ cat bitblt.rb def bitblt c = nil 10000.times { a = [1, 1606, 396, 933960, 3775901511, 1044, 244711859] b = a.map {|i| s = '' while i > 0 i, a = (i-1).divmod(26) s << 97 + a end s.reverse } b[3] += ',' c = b.join(' ') } c end p bitblt $ t…

ファイルの二分割

でかいファイルを二分割して渡そうと思って、 #!/usr/bin/ruby path = ARGV.shift path1 = path + '.1' path2 = path + '.2' size = File.size(path) size1 = size / 2 size2 = size - size1 open(path) do |file| open(path1, 'w') do |file1| size1.times …

自分のTwitter全ステータスを保存

コマンドライン引数にユーザ名とパスワードを指定すること。 #!/usr/bin/ruby -Ku require 'rexml/document' require 'net/http' require 'date' Net::HTTP.version_1_2 user, pass = ARGV hr = '-' * 100 open('twitter.txt', 'w') do |out| Net::HTTP.star…

sqlite3-ruby で自動的に文字コードを変換

入出力で毎回文字コードを変換するのが面倒だったから。 #!/usr/local/bin/ruby -Ks require 'sqlite3' require 'sqlite3/driver/native/driver' require 'kconv' class MyDriver < SQLite3::Driver::Native::Driver def bind_text( stmt, index, value, utf…

ObjectSpace._id2ref

Object#object_id で得たオブジェクトIDからオブジェクトを得ることができる。 irb(main):001:0> a = "hoge" => "hoge" irb(main):002:0> b = ObjectSpace._id2ref( a.object_id ) => "hoge" irb(main):003:0> a.equal?( b ) => true 既にGCされたオブジェク…

VALUE

README.EXT.ja読んだ。 へええ、VALUEは1ビット目(LSB)でFixnumかそれ以外(メモリアドレスとか)かを判別しているんだなーー。ヒープからアロケートしたメモリアドレスはまずほとんどの処理系で2の倍数になっているだろうというのを利用して。つまり Fixn…

記号もメソッド名に使える

class C define_method( '(>_<)', proc{ puts 'hello' } ) end p C.new.methods - Object.new.methods #=> ["(>_<)"] C.new.send( '(>_<)' ) #=> hello

ポスター44種類コンプリート問題

CD1枚購入のたびに、ポスターが44種類のうち1種類ランダムに得られるとする。Q1. 44種類コンプリートするには、平均何枚のCDを購入する必要があるか。Q2. 44種類コンプリートした人はその時点で何種類のポスターを持っているか。 http://d.hatena.ne.jp/text…

PostfixNotationTokens#to_infix_notationでカンマを出力できるように

when TokenType::FUNCTION raise Error, 'オペランドが足りない' unless stack.size >= token.val.argc dest.list.insert( dest.list.size, Token.new( TokenType::RIGHT_BRACKETS ) ) stack.pop if token.val.argc > 0 ( token.val.argc - 1 ).times do pos…

関数呼び出し実装できたよー

変数と関数の区別は後ろに括弧がつくかでやってる。 可変長の引数が可能になるように作ってみた。 PostfixNotationTokens#to_infix_notationでカンマを出力できていないのでそれをなんとかしたい。 putchar( 72, 101, 108, 108, 111, 44, 32, 119, 111, 114,…

変数実装できたよー

Operatorまわりの構造も変更。 class Calc class Error < RuntimeError end class Operator def initialize( mark, priority, proc, is_assignment = false ) @mark = mark @priority = priority @proc = proc @is_assignment = is_assignment end attr_read…

右から左に結合する演算子あっさりできた

というか、さっき投稿したのにはバグが潜んでいた。 next_token = @list[i+1] token = dest.list[dest_ptr] while rop_end?( rs_stack, brackets_level, token, next_token ) ではnext_tokenとtokenがループ毎に更新されない。 while rop_end?( rs_stack, br…

数式計算スクリプトをいじり中

また数式計算スクリプトをいじくってます。 右から左に結合する演算子とか、関数とか、変数とか、式の最適化とか色々やってみたいのです! クラス構造を少し変更して、逆ポーランド記法→中置記法の変換を追加してみました。 class Calc class Operator def i…

赤黒木の実装できたよ!

参考 http://www.geocities.jp/h2fujimura/mutter/tree/red-black-tree.html class RedBlackTree class Node def initialize( key, value, is_red = false, left = nil, right = nil, is_nilnode = false ) @key = key @value = value @is_red = is_red if i…

赤黒木を実装中 削除はまだ

参考 http://www.geocities.jp/h2fujimura/mutter/tree/red-black-tree.html class RedBlackTree class Node def initialize( key, value, is_red = false, left = nil, right = nil, is_nilnode = false ) @key = key @value = value @is_red = is_red if i…

2分探索木の連想配列で削除方法を変えたら速くなった

連想配列の再発明(線形検索、二分探索木、ハッシュテーブル)してそれぞれの時間計測 - fujidigの雑記の2分探索木バージョンの改良。 クラス名をMyHash2Mに変更し上記の記事のコードに追加してみると、 user system total real Hash 0.032000 0.000000 0.03…

連想配列の再発明(線形検索、二分探索木、ハッシュテーブル)してそれぞれの時間計測

class MyHash1 include Enumerable Pair = Struct.new( :key, :value ) def initialize @table = [] end def []( key ) @table.each do |pair| return pair.value if pair.key.eql?( key ) end return nil end def []=( key, value ) @table.each do |pair| …

演算子の優先度できたよ!

昨日のメモの通りでいけた。 ついでに、クラス化したり、単行演算子も実装したりした。 class Calc class Operator def initialize( priority, proc ) @priority = priority @proc = proc end attr_reader :priority, :proc end class TokenType def initial…

式の計算(カッコあり、演算子の結合優先順位なし)

何も見ずに書いたのですが、逆ポーランド記法に変換する処理に頭を使いました>< まだ演算子の結合優先順位が残ってる、ひー>< # 式を逆ポーランド記法に変換して計算 # カッコあり # 演算子の結合優先順位なし token_defs = [ [:space, /\s+/], [:operat…

新しくプログラミング言語を覚えたいときに行うべき10の練習問題をRubyで

出来たのから投稿していく 1:なんらかのカウントアップメッセージを1から100まで出すけど、3のときだけアホになる!(例:1万円!2万円!しゃ〜ん万円!とか) 一つ目 loop{puts '俺って天才!'} 二つ目 (1..100).each do |i| if i == 3 print 'しゃ〜ん' el…

バイナリとダンプの相互変換

バイナリからダンプ print 'ファイル名:' filename = gets.chomp File.open(filename, 'r') do |file| i = 0 file.each_byte do |c| if i != 0 print ( i % 16 == 0 ) ? "\n" : ' ' end print '%02x' % c i += 1 end end ダンプからバイナリ puts '16進ダン…

配列とハッシュの速度比較

require 'benchmark' table_a=nil table_h=nil puts '*add' n = 1000 Benchmark.bm(7) do |x| x.report("array:") do n.times do table_a = [] 10000.times do table_a << rand() end end end x.report("hash:") do n.times do table_h = {} 10000.times do …