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

行列の積

class Array def mul(x) m = self.size - 1 n = x.size - 1 c = Array.new(m + 1) c.each_index {|i| c[i] = Array.new(m + 1, 0)} for i in 0..m for j in 0..m for k in 0..n c[i][j] += self[i][k] * x[k][j] end end end c end end a = [[-1, -1, 2], [-…

Linux Mint で Ruby/Tk

Linux の Ruby で Tk を使いたい場合、bundler ではインストールできません。Ruby インストール時に一緒に入れるようです。自分は既に最新の Ruby 2.2.3 を Tk なしでインストールしていたので、rbenv を使って Ruby 2.2.2 + Tk を入れてみました。 $ sudo a…

最大部分配列

分割統治の例です。配列の中から、部分和が最大となる部分配列を探し出し、その最初と最後のインデックス、および最大の部分和を返します。 重要なのはメソッド fmcs(find-max-crossing-subarray)です。 class Array def fmcs(low, mid, high) left_sum = …

安全なモンキーパッチについて(Ruby)

Module#refine を使って、クラス内だけでモンキーパッチすることができます。これでかなり安全だと思います。この例だと、クラス A の中で String のモンキーパッチをやっていますが、これはモジュールの外の名前空間を汚染しません。自分だけで使うプログラ…

バブルソート

class Array def bubble_sort a = dup for i in 0..(a.size - 2) (a.size - 1).downto(i + 1) do |j| a[j], a[j - 1] = a[j - 1], a[j] if a[j] < a[j - 1] end end a end end p [6, 0, 5, 2, 3].bubble_sort #=>[0, 2, 3, 5, 6] アルゴリズムイントロダクシ…

2分探索(バイナリサーチ)

練習問題 2.3-5 数字の入った配列の中から、引数に一致する要素のインデックスを返します。そのような要素がなければ nil を返します。配列はソートされている必要があります。マージソートのように、配列を再帰的に半分づつにしていって探します。最悪実行…

マージソート

プログラムの性質上、破壊的なメソッドになります。merge_sort.rb class Array def merge(p, q ,r) left = self[p..q] + [Float::INFINITY] right = self[(q + 1)..r] + [Float::INFINITY] i = j = 0 for k in p..r if left[i] <= right[j] self[k] = left[i…

挿入ソート

insertion_sort.rb class Array def i_sort a = dup for j in 1...(a.size) key = a[j] i = j - 1 while i >= 0 and a[i] > key a[i + 1] = a[i] i -= 1 end a[i + 1] = key end a end end p [6, 0, 5, 2, 1].i_sort #=>[0, 1, 2, 5, 6] アルゴリズムイント…

再帰的なファイルのバックアップ(Ruby)

次の動作をします。コピー先のディレクトリに ファイルがない(か変更されている)場合、ファイルを(上書き)コピーします。 ディレクトリがない場合、再帰的にコピーします。 ディレクトリがある場合、それが変更されていればそのディレクトリに入って、も…

Linux Mint で Common Lisp(SBCL)

インストールは「ソフトウェアの管理」から sbcl を選択するだけ。ただし、ヴァージョンは多少古くなるよう(今のところ SBCL 1.1.14)。 helloworld.lisp (write-line "Hello, World!") スクリプトとして実行できる。 $sbcl --script helloworld.lisp Hello…

google の入社試験

rscの日記さんのところで知りました。 Googleの入社試験です。次の覆面算を解きなさい : IT速報 WWWDOT - GOOGLE = DOTCOM ただし、EとMは交換可能。Ruby で解いてみました。 def to_int(a, b, c, d ,e, f) a * 10 ** 5 + b * 10 ** 4 + c * 10 ** 3 + d * 1…

たらい回し関数

小飼弾さんのブログの過去記事(参照)を読んでいて、「たらい回し」関数ってのの存在を知りました。コードを読んでいて何の意味があるのだろうと思っていたら、関数呼び出しのベンチマークに使う有名な関数なのですね。Wikipedia に書いてありました。 竹内…

Python の内包表記とRuby のブロック

Pythonista が Ruby に優越感を抱くのに、内包表記の存在がある。内包表記は select + map でいけるし、日本人としてはあまり読みやすいとは思えない(内包表記は英語だと語順が自然)ので、Ruby 風に書くと確かに冗長だけれども、Ruby には採用しないみたい…