意馬心猿 - いばしんえん

欲望のままにプログラミング

<Ruby/>2次元ランダムウォーク

前回の1次元ランダムウォークに引き続き、今回は2次元ランダムウォークRuby + Cairoでプログラムしてみたいと思います。

 

2次元ランダムウォークは粒子のランダムな移動をシュミレートしたものになります。

 

 

 

f:id:santamalia:20160219152504p:plain

 

時間によって描画結果が変わります。

 

f:id:santamalia:20160219152513p:plain

 

  • プログラム自体は前回とほぼ同じですが、2次元なので、変数がx,yの2種類になってます。
  • x,yの増加量はそれぞれsin,cosで算出しています。

 

初心プログラマーの方にはもってこいの問題だと思うので、ぜひ試してみてください。

 

<Ruby/>1次元ランダムウォーク・シミュレーション

”この前のシダ生やすプログラムおもろかったなー”

 

”他におもろいシミュレーション系ないかなー”

 

Google => ”酔っ払いの進路のシミュレーション”

 

”おっ、これおもろそう!”

 

ということで、今日は1次元ランダムウォークをプログラムしたいと思います。

 

これは乱数を使えば結構簡単に描画できたんですが、一つ問題が・・・。

 

f:id:santamalia:20160219140021p:plain

目もりの描画の仕方がわからない。

 

調べても出てこなかったので、仕方なく自作しました。

 

f:id:santamalia:20160219145159p:plain

  • どうやらJava等の他の言語では、axisという軸を描画する関数や、gridというマスを描画する関数が用意されてるらしいので、axisという名前で作りました。
  • axisは再利用可能なように定数Height,Widthを用いていて、X軸を濃く描画するようになっています。

もし、他に良い方法があれば、コメント欄にて教えていただけると幸いです。

 

参考:モンテカルロシミュレーション

 

アラン・チューリングという男

”この前借りた、イミテーションゲームでも見るか〜”

f:id:santamalia:20160216150349p:plain

実はこの映画、あのチューリングマシンを作ったアラン・チューリングの物語だったのです。

 

僕も借りるときは”天才数学者の秘密、か〜。おもろそうやな〜”っていう感じで借りたので、後からアランチューリングって聞いて、大学の授業で出てきたあの人かー、と驚きました。

 

f:id:santamalia:20160216150319p:plain

 

この映画はドイツ軍のエニグマ↑という暗号化装置からの暗号解読にチューリングたちが挑んでいくという話でした。

 

f:id:santamalia:20160216150332p:plain

 

苦悩の末、チューリングたちが辿り着いたのは、マシンにはマシンで対抗するということでした。

 

f:id:santamalia:20160216150351p:plain

 

”ある男二人が森の中でクマに出くわした。一人目はひざまづいて祈り始め、二人目はブーツの紐を締めた。”

 

”一人目が二人目に言った。”

『何をしているんだ?クマより速く走れるはずがないだろう?』

 

”二人目が答えた。”

『クマより速く走れなくても、君より速く走れば助かる。』

 

この映画の中で、こんな面白い話が出てきます。

 

いかにもイギリス人らしいジョークだな〜と思います。

 

とても見応えのある映画なので、続きは、皆さんも映画を見て確かめてみてください!

 

イミテーション・ゲーム/エニグマと天才数学者の秘密 コレクターズ・エディション 【初回限定生産】アウタースリーブ付 [ ベネディクト・カンバーバッチ ]

価格:3,332円
(2016/2/16 15:34時点)
感想(1件)

 

<Ruby/>しりとりでパナキにつなげるプログラム

f:id:santamalia:20160218111817j:plain

”チョコレート -> トリ -> リンゴ -> ゴリラ -> ラッパ -> パナキで〜す!”

 

”あれ?そーいえば芸人のサバンナ八木さんがやってるパナキって、木構造を利用してプログラムにできそうやな”

 

というわけで、今日は、入力された単語をただただ”パナキ”につなげるだけのプログラムを作りました。

</> Panaki.rb

 

 

 f:id:santamalia:20160215191439p:plain

名前だけみると、なんかカッコイイ!

 

ですが、やっていることは単純で、結局木構造ですらありません。

 

 

まず、何よりパナキにつなげるための単語のデータが重要です。

 

このネタ、もともと大学の課題がきっかけで思いついたのですが、”パナキ”でググってみると、なんと、パナキ 究極のパナキ攻略法という記事があったのです!

 

そこには、濁点以外の五十音すべての言葉から、パナキへの最短ルート(?)が書かれていました。

 

僕はそこに、オリジナルで濁点にも対応させて、それをテキストファイルに書き下していきました。

 

メソッドを定義しているのはあまり意味がないですが、このころはruby初心者で色々試していたので、お気になさらず。

 

他にも、よくよく考えたら、配列を作っていくとことか、stripメソッドじゃなく、splitメソッドで済みそうだなとか、色々思ったりするのですが、そこはスルーでお願いします。

 

そして、panaki.txt書き下す時に木構造のように(インデントでわかりやすくしてます)書き下しています。

なおかつ、Panaki.rbの本体は

until word == "パナキ" do
print "#{word} -> "
until word[word.length-1,word.length] == array[j][0,1] do
j += 1
end
word = array[j]
j = 0
end
puts "#{word}で〜す!"

 で、word(初期値:入力された文字列)の末尾の文字と、先頭の文字が一致する単語が見つかるまで上からpanaki.txtを上から読み込み、一致したら、一致した単語をwordに代入し、wordが”パナキ”に一致するまで、それをひたすら繰り返す、というものです。

 

いかがでしたでしょうか。

 

以上パナキプログラムでした。

 

Effective Ruby [ ピーター・J.ジョーンズ ]

価格:3,456円
(2016/2/15 19:17時点)
感想(0件)

たのしいRuby第4版 [ 高橋征義 ]

価格:2,808円
(2016/2/15 19:18時点)
感想(1件)

<Ruby/>Ruby + Cairoでシダを描画

"シダを生やす記事を前見た気がする”

 

というわけで、こちらの記事を参考にRubyとCairoを使って、シダを生やしたいと思います!

 

</> shida.rb

 

 

描画結果⇩

f:id:santamalia:20160216170626p:plain

 

  • 核となっているのは generate メソッドで、 今回generateメソッドは呼び出しの際、初期値が20で if文が0 < kなので20回再帰が行われます。
  • 20回再帰が行われた後、plotメソッドが呼び出され、plotメソッドによって、1x1の矩形が描画されます。f:id:santamalia:20160217114114p:plain
  • Random.rand < 0.3

    f.(k - 1, W2x.(x, y), W2y.(x, y))
    f.(k - 1, W3x.(x, y), W3y.(x, y))
    f.(k - 1, W4x.(x, y), W4y.(x, y)) より、各枝の先まで再帰処理が終わると3割の確率で、葉(矩形)が描画されていくことになります。

 

(観葉)ビバリウムプランツ おまかせシダ植物 3号ポット(1ポット)

価格:600円
(2016/2/17 11:48時点)
感想(0件)

これもプログラミングの腕を磨くのにもってこいだと思うので、皆さんも色んなやり方でシダを生やしてみてください。

<Ruby/>Rubyでルビーを描画してみた

"Cairoでキレイなフラットなルビーを描画してみよう!”

 

Cairoのインストール等はこちら

 

今回はRubyのプログラミングの練習も兼ねて、プログラムで絵を描いてみました。

 

イラレだったら5分で終わるところが、2時間もかかっちゃいました 笑

 

</>ruby-plot.rb

描画結果 ↓

f:id:santamalia:20160215182252p:plain

  •  Cairoに初めて触ったので基本move_toメソッド、line_toメソッドゴリ押しです。
  • context.set_source_rgb(0.149,0.196,0.220) は最初整数値を入れていて、”あれ?おっかしいな〜、全然思ってる色にならへん。”と思っていたら案の定、少数表記でした。
  • move_to(x1,y1); line_to(x2,y2); で(x1,y1)から(x2,y2)まで線を引くという意味になります。
  • 究極のゴリ押しは全座標を書き下すことですがさすがにそれは面倒すぎたので、直線が交わるところの座標を何個か取ってきて配列p[ ]に入れて、eachメソッドで処理しています。
  • eachの中がmove_toとline_toが逆なのは、もし同じだと、moveとlineが同じ座標を指すので線が引かれなくなってしまうからです。
  • p[ ]は右側半分だけが入っていて、x座標を 1-x として、つまり真ん中を中心として折り返して、minus_xyという配列に代入しています。
  • そして配列xyとminus_xyを結合した配列をorderとしています。

 

プログラム初心者の方がいれば、良い練習となるのでオススメです!

 

Cairoというグラフィックライブラリをインストール

”この前MeCabとかnattoとか入れたから、今度は描画ツールを入れてみよう!”

 

 f:id:santamalia:20160215133857p:plain

 

今回は、ruby で cairo を使えるようにしようと思います。

1. gccコンパイルするようにオプションをつけてbrewコマンドを実行

brew install cairo --use-gcc

ここで少し時間がかかりますが、YouTubeでも見て気長に待ちましょう。 

 

2. gemでインストール

sudo gem install cairo

 

3. hinomaru-plot.rb でテスト

</>hinomaru-plot.rb

f:id:santamalia:20160215133234p:plain

無事プロット成功しました。

 

 

こちらの記事を参考にさせていただきました。

macにgem のcairoを入れようと思ったら Homebrewでコケて実はgccでコンパイルすればOKだった件