Ruby

RubyWarriorに挑戦

同僚に教えてもらった「Ruby Warrior - Popular Free Ruby Programming Tutorial Game」に挑戦してみたのでコードを晒してみる。https://github.com/nrmnr/ruby_warrior当初、ターン制が分かってなくて、1ターンに2アクション起こして怒られたりした。 そこ…

Ruby 1.9.2と1.9.3のinitialize

Rubyを1.9.2と1.9.3の挙動の違い(バグ修正?)を見つけたのでメモ。 class C def m puts 'hoge' end end c = C.new 'fuga' # 引数に意味はない c.m としたとき, # 1.9.2 #=> hoge # 1.9.3 #=> (ArgumentError) になる。 むしろ1.9.2のバグ?

小ネタ2

i = Man.new you = Woman.new i.love you 素敵なことです。 ManとWomanの実装↓ class Man def initialize @honesty = true end def love woman if @honesty puts 'I love you.' woman.love self end end end class Woman def initialize @honesty = true end…

小ネタ

i = Man.new you = Woman.new i.love you 素敵なことです。 ManとWomanの実装↓ class Man def initialize @money = 1000 end def love woman @money -= woman.cost woman.love self end def available? @money > 0 end def miss woman # nothing to do end e…

画期的?なソートアルゴリズム - sleep sort

http://dis.4chan.org/read/prog/1295544154で紹介されていたソートアルゴリズムが面白かったので,Rubyで実装してみた。 # sleep_sort.rb def sleep_sort nums result = [] threads = nums.map do |num| num = num.to_i Thread.new do sleep num result << …

麻雀の待ちを出力する の3

〜の2の続き。 wikipedia:七対子って同じ牌が4枚だとアガれないらしい。ので,七対子判定を修正。 # jong3.rb # check_mentu # 面子の組み合わせを生成 # hai : 残り牌の数(index==牌の種類) # comb: 現段階での面子 # mati : 現段階での待ち def check_ment…

麻雀の待ちを出力する の2

昨日の続き。 手牌のデータを,牌の種類配列で持つ先の形式から,牌ごとの数で表す形式に修正。"1112345678999"→[3,1,1,1,1,1,1,1,3]。これに,配列のインデックス=牌の種類となるようにインデックス0を,また番兵として末尾に二要素を追加して使用。あと,…

麻雀の待ちを出力する

「あなたのスキルで飯は食えるか? 史上最大のコーディングスキル判定」の問題に挑戦。 # jong.rb # Array拡張 class Array def count_if(val) self.select{|elm| elm == val }.size end end # check_mati(mati, comb) # 待ち牌の残り枚数チェック def check…

小町算

小町算を解くプログラム。とりあえず簡単に演算子は+−のみ。 # komachi1.rb # ops:演算子の配列 # ops[n]...数値nの前に付く演算子 ops[0]は未使用 # -1 : [-] # 0 : [なし](次の数字と続ける) # 1 : [+] ops = Array.new(10){-1} loop do str = '' r = t…

迷路を解く

「人材獲得作戦・4 試験問題ほか: 人生を書き換える者すらいた。」で出題されている問題を解いてみた。 maze = [] dist = [] sx, sy, gx, gy = nil,nil,nil,nil readlines.each_with_index do |l, y| next if l.chomp.empty? maze.push([]) dist.push([]) l…

exifrを使ってデジカメの画像をリネーム

JPEGファイルのEXIF情報を取得するライブラリ「exifr」を使って,デジカメ画像のファイル名をリネームするスクリプトを書いてみました。 まずはexifrのインストール > gem install exifrスクリプト #!ruby -Ks $KCODE='s' require 'exifr' # Timeから新しい…

バイトオーダーについてメモ

KconvはBOMなしUTF16を既定でビッグエンディアン(BE)とみなします。 Windows(Intel)はリトルエンディアン(LE)なので,BOMなしUTF16(LE)のデータを読み込み,SJIS変換する場合は, str = "\xff\xfe" + str のようにLEのBOMを付加するか,Uconvを使って requir…

Rubyで『集合知プログラミング』(7)

第3章「グループを見つけ出す」 3.8 データを2次元で見る "clusters.rb"の続きです。 書籍のサンプルでは座標を配列で表現していましたが,今回は座標を表現するPointクラスを作成しました。 class Point def initialize(x = 0.0, y = 0.0); @x, @y = x, y; …

Rubyで『集合知プログラミング』(6)

第3章「グループを見つけ出す」 3.7 嗜好のクラスタ "clusters.rb"の続きです。 Zeboからのデータ取得は省略。データはこちらを使いました。 def tanimoto(clust1, clust2) c1 = c2 = shr = 0 clust1.vec.zip(clust2.vec) do |v1, v2| c1 += 1 if v1 != 0 c2…

Rubyで『集合知プログラミング』(5)

第3章「グループを見つけ出す」 3.6 K平均法によるクラスタリング "clusters.rb"の続きです。K平均法によりクラスタを求めるメソッドです。 def kcluster(rows, k=4, calc_distance=method(:pearson)) # それぞれのポイントの最小値と最大値を求める # == デ…

Rubyで『集合知プログラミング』(4)

第3章「グループを見つけ出す」 3.4 デンドログラムを描く "clusters.rb"の続きです。描画ライブラリにはcairoを使用します。cairoのインストールはgem i cairoで行いました。クラスタの高さを計算します。ここで言う「高さ」は,文字通り画像のy軸方向の高…

Rubyで『集合知プログラミング』(3)

第3章「グループを見つけ出す」 3.3 階層的クラスタリング "clusters.rb"を実装してみます。まずはread_file。 def read_file(filename) lines = nil open(filename) do |f| lines = f.readlines.map{|l| l.chomp.split(/\t/)} end # 最初の行は列タイトル c…

Rubyで『集合知プログラミング』(2)

第3章「グループを見つけ出す」 3.2 単語ベクトル "generatefeedvector.rb"を実装してみます。 RSSの解析にはRSS Parserを使います。RSSフィードのタイトルと,単語のカウントを返すメソッドから。 require 'rss' def get_word_counts(url) # RSSをParse rss…

Rubyで『集合知プログラミング』(1)

『集合知プログラミング』を読了しました。大変勉強になりました。 Pythonによる書籍内サンプルコードをRubyで書いてみたいと思います。 書籍掲載のサンプルコードはこちらの"Examples"からダウンロードできます。 第2章「推薦を行う」 "recommendations.rb"…