ruby

SICP 4.3.2

Baker, Cooper, Fletcher, Miller, Smithは五階建てアパートの異なる階に住んでいる。Bakerは最上階には住んでいない。Cooperは最下階に住んでいない。Fletcherは最上階にも最下階にも住んでいない。MillerはCooperより上の階に住んでいる。SmithとFletcher…

你好世界

#!ruby -Ku require 'iconv' # 簡体字 gb2312 = ["baecb1a6caaf"].pack("H*") iconvGB2U = Iconv.new('UTF-8', 'GB2312') str = iconvGB2U.iconv(gb2312) str << iconvGB2U.iconv(nil) p str p str.unpack("H*") # => "&#32418;宝石" # => ["e7baa2e5ae9de79…

間接的にメソッドを呼び出す

def foo(x) p ["foo", x] end send( :foo, "send") #=> ["foo", "send"] v = "foo" send( :"#{v}", "send-v") #=> ["foo", "send-v"] m = method( :foo) m.call("method") #=> ["foo", "method"] p = lambda {|x| foo(x)} p.call("proc") #=> ["foo", "proc"…

アホなことをしたのでメモ

環境: ruby 1.8.5 i386-mswin32 ruby/SDL 1.3.0SDL.initを呼ぶ前に p SDL::WM.captionするとrubyごと落ちる.初めて[BUG]を見れた.まだの人は是非.(これを直すにはそこらじゅうのメソッドで初期化したかチェックしなきゃいけなくなるんだろうか?だとした…

リンクリストの探索

ポインタの無いrubyでどうやってリストを実現するのか?とgoogleに聞いてみたところ,ルート探索(2) - バリケンのRuby日記 - Rubyistを教えてくれた.ハッシュか配列に一意なキーを入れてそれで検索すればいいのか. #!ruby -Ks route_map = { :A => [:B, :D…

構造体を保存する

fname = 'words.dat' base = "BCDFGHJKLMNPQRSTVWXYZ" (1..rand(5)+10).inject(words=[]) {|w,i| w << (0..rand(10)+5).inject(str="") {|x,i| x << base[rand(base.size)] } } p words #=> "BJXNRN", "KTVRCZFZXJKCQZ", "NLDLHTMHF", "LGZRCSFGGTT", "KHNRN…

二重ループ(2)

callccを使いこなせないとダメらしいので,二重ループ - ロバの耳にcallccを突っ込んでみる.これでbreakしても二重ループから脱出しない.逆にreturnでも二重ループから脱出出来ない訳だが….でもそれもcallccで解決. def twin_loop(a,b) c = nil begin a.…

デストラクタ

class TestDestructor @@refcount = 0 @@filelist = [] # TestDestructorが開いているファイルのリスト def initialize _set_finalizer(nil) @@refcount+=1 end def _set_finalizer( data) ObjectSpace.undefine_finalizer(self) ObjectSpace.define_finaliz…

xmlファイルを読む

test.xml: <test> <head version="1.2.0" size="512"> </head> <foo index="0"> foobar0 </foo> <foo index="1" h="1"> foobar1 </foo> </test> require 'rexml/document' file = File.new( "test.xml" ) doc = REXML::Document.new file p doc.elements["test/head"].attributes["version"] #=> "1.2.0" p doc.elements["t…

xlsファイルを読む

暫定版 require 'win32ole' class OpenCalc def initialize @document = nil begin @manager = WIN32OLE.new("com.sun.star.ServiceManager") @desktop = @manager.createInstance("com.sun.star.frame.Desktop") rescue puts "OpenOfficeがインストールされ…

gresreg

#!ruby -Ks require "optparse" # エラーメッセージを表示して終了する def disp_error_exit( str) $stderr.puts str exit(2) end # fnameを上書きする def save_file( fname, strs) tmpname = fname + '.tmp' bakname = fname + '.bak' open( tmpname, 'w')…

二重ループ

def twin_loop(a,b) a.each {|x| b.each {|y| yield(x,y) }} end と書いてみたが, twin_loop(ARGF, rexs) {|l,x| if x =~ l puts "#{ARGF.filename} #{ARGF.file.lineno}:#{l}" flag_found = true break end } は ARGF.each {|l| rexs.each {|x| if x =~ l …

クリップボードを操作する

require "win32/clipboard" include Win32 str = Clipboard.data # クリップボードからデータを取得 str.upcase! Clipboard.set_data( str) # クリップボードに転送 p str # クリップボードのデータを消去 Clipboard.empty win32/clipboardはhttp://rubyforg…

おもいついた

a = str.scan(/.{1,4}/) # タブ幅4 a = a.map {|x| x.sub(/ +\z/,"\t") } puts a.join('') 相変わらず元の文字列にタブが混じっていると意図通りに動作しない.あと日本語が混じっててもダメそうな気が.タブを空白に,空白をタブに変える - ロバの耳にコピ…

手続き的

相変わらず,perl cookbookの内容をrubyで書き直す練習をしているんだけれど,手続き的な記述しか出来ないとかなり負けた気分になる. たとえばこんなコード: tab_size = 4 str = "test test test" a = str.split(/( +)/) p = 0 a = a.map {|x| if x !~ /( …

多次元配列,多重配列

def nd_array( arg, init=0) lm = arg.size - 1 route = lambda {|x| Array.new( arg[x]) { (x

配列の内容をシャッフル

class Array def swap!(a,b) self[a], self[b] = self[b], self[a] self end def shuffle!() (1..size-1).each {|n| swap!( n, rand(n+1))} self end end a = (1..10).map {|x| x} p a.shuffle! #=> [6, 8, 7, 3, 10, 9, 4, 5, 2, 1] このコードはcくさいな…

循環リスト

class Array def circle_head() ret = self.shift() self.push(ret) ret end def circle_tail() ret = self.pop() self.unshift(ret) ret end end c = [1,4,6,8,9] 5.times { p c.circle_head()} 5.times { p c.circle_tail()} c/c++だったら,配列+どこを見…

配列をソート

p [1,2,2,3,4,6,1,3,7,8,9].sort #=> [1, 1, 2, 2, 3, 3, 4, 6, 7, 8, 9] # 指定の方法でソート a = [['xx', 16], ['yy', 8], ['xx', 10], [ 'zz', 12]] p a.sort #=> [["xx", 10], ["xx", 16], ["yy", 8], ["zz", 12]] p a.sort {|x, y| x[1] <=> y[1] } #=…

条件を満たす要素をすべて見つける

a = [1,2,2,3,4,6,1,3,7,8,9] p a.delete_if {|x| (x % 2)==0 } #=> [1, 3, 1, 3, 7, 9] p a #=> [1, 3, 1, 3, 7, 9] a = [1,2,2,3,4,6,1,3,7,8,9] p a.find_all {|x| (x % 2)==0 } #=> [2, 2, 4, 6, 8] p a #=> [1, 2, 2, 3, 4, 6, 1, 3, 7, 8, 9] p %w[red…

テストを通る最初の要素(の位置)を取得する

a = [1,2,2,3,4,6,1,3,7,8,9] p a.index(3); #=> 3 p a.index(5); #=> nil # bで始まる単語を探す b = %w[red green blue white black] p b.find() {|x| x=~/\Ab/} #=> "blue" 1.9以降では p b.index {|x| x=~/\Ab/} こういう書き方で,位置を取れるらしい.…

配列の複数の要素を処理する

配列から取り出す.基本編. a = [1,2,3,4,5,6,7,8,9] p a.shift #=>1 前から p a.pop #=>9 後ろから p a #=> [2, 3, 4, 5, 6, 7, 8] # 指定箇所から,指定個数取り出す a = [1,2,3,4,5,6,7,8,9] p a.slice!(3,3) p a 追加は,unshiftとpush2つ同時に取り出…

インデックスでアクセス

(1..5).inject(a = []) {|x,y| x << (rand()*100).to_i} a.size.times {|x| p a[x]} a.each_index {|x| p a[x]}

配列を逆順にする

a = (1..10).map {|x| x } p a.reverse 参照:ファイルを行単位で逆向きに読む - ロバの耳

二つの配列を結合する

a = (1..10).map {|x| x*3} b = (1..10).map {|x| x*5} a.concat(b) p a a = (1..10).map {|x| x*3} b = (1..10).map {|x| x*5} a += b p a

片方の配列にあって,他方に無いものを見つける

a = (1..10).map {|x| x*3} b = (1..10).map {|x| x*5} p a p b p a - b # aからbにもあるものを取り除いた配列を得る.差集合 p a & b # a,b両方に含まれるものを新たな配列に入れる.積集合 p a | b # a,bのどちらかに含まれるものを新たな配列に入れる(重…

配列内の重複を取り除く

p %w[a a bb a aa c bbb].uniq #複雑なだけ? h = {} uniq = [] %w[a a bb a aa c bbb].each {|x| uniq << x unless h[x]; h[x] = 1 } p uniq

配列への参照でアクセス?

意味不明.要調査.

リストの全要素に何かする

#順番に取り出す [2,3,5,7,11,13,17,19,23,29,31,37].each{|x| p x} #ソートしつつ,順番に何かする. # もっともましな方法があるかも a = [] 10.times {|x| a << (rand()*100).to_i} a.sort.each{|x| p x} #配列の内容の計算結果を新しい配列にして返す a …

カンマ付きで出力する

c = 'quick brown fox jumps over the lazy dog'.split(/\s/) p c.join(',') d = [] p d.join(',') p "#{c[0]}( #{c[1..-1].join(', ')});" if c.size>0 # 引数の数に応じてつける字を変える.