2007-05-01から1ヶ月間の記事一覧

語彙

gaucheは左手という意味じゃなくて,不器用を意味していたのか.

多次元配列,多重配列

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つ同時に取り出…

備忘録目次 - ロバの耳 逆引きRubyや他のblogが,#=>と書いていたので,# =>を#=>に変えてみたが,リファレンスのほうは# =>と#=>を混在させてるな.別にどっちでもいいのか?

インデックスでアクセス

(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 # 引数の数に応じてつける字を変える.

配列の初期化

a = ['quick', 'brown', 'fox'] b = %w[jumps over the lazy dog] c = 'quick brown fox jumps over the lazy dog'.split(/\s/) d = 'quick brown fox jumps over the lazy dog'.scan(/[^\s]+/) # ファイルから読み込んで配列に入れる open('test.txt') {|f|…

備忘録目次 - ロバの耳 出力例がまったくないな.あとで追加するかも.

1日後や1ヶ月前の日付を得る

require 'date' def time_to_date( t) DateTime.new( t.year, t.mon, t.day, t.hour, t.min, t.sec) end def date_to_time( d) Time.mktime( d.year, d.mon, d.day, d.hour, d.min, d.sec) end t1 = Time.now # 基準日 d1 = time_to_date( t1) p (d1 + 1).st…

今日の日付を得る

p Time.now p (Time.now+1*60*60*24) # 1日後 p Time.now.strftime("%Y/%m/%d %H:%M:%S") strftimeの書式はstrftime(3)を参照する.直接,数値を取得するには: p Time.now.day p Time.now.min

16進数を10進数にする

p "ff".hex #=> 255 p sprintf("0x%04x", "a5".hex) # 16進数にする #=> "0x00a5" p [0,16,32,128,255].pack('c*').unpack('H*') #=> ["00102080ff"] p ["ff20"].pack('H*').unpack('C*') # 符号無し #=> [255, 32] p ["ff20"].pack('H*').unpack('c*') # 符…

三角関数

pi = Math.atan2(1, 1)*4; のようにクラスを指定して使うかinclude Math pi2 = atan2(1, 1)*4 のようにインクルードして使う(らしい)cos,sin,exp,log,atan2,sqrtがあればとりあえずは足りるか. p Math::PI # 円周率

連続する整数を操作する

3.times {|n| p n} p "-" (5..9).each {|n| p n} p "-" 7.step(10,2) {|n| p n} p "-" stepがあれば,uptoやdowntoは使わなくてもいいような気がするので,メモせず.

文字列が数値かどうか調べる

p "32" =~ /^[+-]?\d+$/ # 整数かどうか? p "0xff5A" =~ /^0x[0-9a-f]+$/i # 16進数かどうか? p "-256.03" =~ /^[+-]?\d+\.?\d*$/ # 小数.ただし .0とかを見逃す .0とか別にいいよね. チェックしたかったら,無理に奇妙な正規表現にするより,もう一つ正規…

備忘録目次 - ロバの耳

全角半角,ひらがなカタカナの変換

require 'jcode' p "ひらがなカタカナ112934ンァヲ".tr('a-zA-Zァ-ン0-9', 'a-zA-Zぁ-ん0-9') #=> "ひらがなかたかな112934んぁを" jocdeを入れないと全角文字を正しく扱えない.

文字コードの変換

require 'kconv' str = "文字コード" str_sj = str.tosjis str_u8 = str.toutf8 p str.kconv(Kconv::UTF8, Kconv::SJIS) # s-jisからutf8に変換

#文字コードとの比較? p ("abc"[1]==?b)? "yes": "no" #ダブルクォートのエスケープを軽減 str = %q(XYZZYX,"","xxx","zzz, yyy","a \"fff\" aaa,",2,"yyy, qqq eee"); p str #=> "XYZZYX,\"\",\"xxx\",\"zzz, yyy\",\"a \\\"fff\\\" aaa,\",2,\"yyy, qqq e…

csv形式のデータを解析する

# 読み込み require 'csv' CSV.open( inputfile, 'r' ) do |row| p row end # 書き込み CSV.open( outputfile, 'w', "\t") do |writer| writer << row end で,できるらしい.未テスト