2017-01-01から1年間の記事一覧

斜方投射の数値計算と描画(Ruby)

4次のルンゲ−クッタ法の練習としてやってみました。斜方投射(斜め上にものを投げるということです)じゃ全然威力を発揮しないのですが、とりあえず動くかどうかだけ確かめました。描画は gnuplot でやっています。 runge_kutta_sample1.rb require 'numo/gn…

「なぜ関数プログラミングは重要か」解読(Ruby)

なぜ関数プログラミングは重要か Rubyを使って「なぜ関数プログラミングは重要か」を読み解く(改定)─ 前編 ─ 但し後編の予定なし メモです。 melborne 氏のブログを参考に lambda のみで実装。 関数合成に関してはここを参考にしたが、これではうまくない…

Linux Mint には Ruby がデフォルトで入っている

Linux Mint 18.2 で確認。 $ ruby -v ruby 2.3.1p112 (2016-04-26) [x86_64-linux-gnu] Ubuntu 17.04 にはまだデフォルトでは入っていないようだ。

Ruby の型注釈のオレオレ記法

Ruby が型を明示的に書かないのはすごくラクだし気に入っているのだけれど、複雑な処理をするメソッドなどでは型注釈があった方がわかりやすい場合もあります。なので、コメントで型注釈をする仕方を自分で決めてみました。 ●引数(self も含む) -> メソッ…

Ruby で循環小数を扱う

以前にも同様の試みをしたのですが(参照)、コードを始めから書き直しました。以前のは何か自分でもよくわからない、面倒なことをしているので。作ったのは Rational#to_rec_decimal と String#to_r で、前者は Rational(分数)を(String で表される)循…

Ruby で Python の for else みたいなの

繰り返しを実行して break(あるいは return)されなかったら何かを実行するって時々欲しいのですけれど、Ruby では Python の for else みたいな構文がないのですよね。なので throw ~ catch を使って大域脱出したりするのだけれど、どうにかできないかと思…

GTK+ で落書き 12(Ruby)

三角形の内心・外心・重心・垂心・傍心 自分で求めた公式を使って、三角形の内接円と外接円を Ruby で描いてみました。 描画には自作の Gem 'oekaki' を使っています。 oekaki | RubyGems.org | your community gem host GTK+でお絵かきしてみた(Ruby) - C…

OpenGL で正多面体を回転させてみる その2(Ruby)

前回のエントリの隠面消去バージョンです。 5つのウィンドウが同時に立ち上がるのは同じです。Windows ではたぶんこのままでは動きません。コードは下のリンク先にあります。 OpenGL で正多面体を回転させる · GitHub

OpenGL で正多面体を回転させてみる(Ruby)

Ruby 用に OpenGL を手軽に使うライブラリ「miniopengl.rb」を書いたので、その例として 5つの正多面体すべてを回転させてみました。 正多面体のデータはここより頂戴しました。ありがとうございます。polyhedrons_obj.zip をダウンロードして解凍し、フォル…

Ruby のサンプルコードについて

結城先生が仰っていることは大事なことだと思います。いちばん大変なのは初心者のときです。とにかく簡単なコードを動かす(つまりは 'Hello World!')のがわからない。僕はプログラミングに関してまわりに誰も聞く人がいなかったし今もいないので、(いまで…

RubyGem 'Oekaki' ver.0.1.0 Release

RubyGem 'oekaki'のヴァージョン 0.1.0 をリリースしました。 oekaki | RubyGems.org | your community gem host GTK+でお絵かきしてみた(Ruby) - Camera Obscura 新しいメソッド Tool#clear, Tool#get_window_size, Event#window_changed を追加しました…

GTK+ で落書き 11(Ruby)

スクリーンセーバーみたいなものを Ruby で描いてみました。円が大きくなったり小さくなったりしながら落下していきます。自画自賛ですけれど、これ結構好きです。描画には自作の Gem 'oekaki' を使っています。 oekaki | RubyGems.org | your community gem…

GTK+ でスクロールするテキスト・ウィンドウを作る(Ruby)

Ruby で GTK+ を使ってテキストを表示させるウィンドウを作ってみました。Gem 'gtk2' を使っています。 window = ScrolledTextWindow.open 5.times do |i| window.write "send #{i}" window.write " ok!\n" sleep(rand(2) + 1) end window.close これでこん…

ファイルの単純なコピー(C言語)

C言語の stdio(標準入出力ライブラリ)のお勉強をしたので、ファイルのコピーをする関数 my_copy() を書いてみました。Linux Mint 18.2 + gcc で確認しました。mycopy.c #include <stdio.h> #include <stdlib.h> #include <sys/stat.h> int main(){ my_copy("mycopy.c", "another_mycopy.c"</sys/stat.h></stdlib.h></stdio.h>…

フロイド−ワーシャル・アルゴリズム(Ruby)

フロイド−ワーシャル・アルゴリズムは、グラフの全点から全点へのすべての最短経路を求めます。重みは負値を許しますが、負閉路は許しません。上のようなグラフは次のようなハッシュで表現されます。頂点を表わすオブジェクトは何でもかまいません。 g = {a:…

melborne さんの Object#sequence メソッド(Ruby)

RubyにおけるシーケンスはObject#repeatに任せなさい!いまはもう更新されていませんが、melborne さんの「hp12c」というブログがあります。この方はおもしろい Rubyist で、僕はときどきヒマに任せてこれを読むのが好きなのですね。文章がうまいし、特殊な…

RubyGem 'Salamander' でコッホ曲線を描く

以前、自作の Gem 'oekaki' でコッホ曲線を描いてみましたが(参照)、タートルグラフックスを実装している Gem 'salamander'(参照)を使って同じことをしてみました。4次のコッホ曲線です。 salamander_koch_curve.rb require 'salamander' require 'salam…

みんな大好き FizzBuzz(Ruby, Python)

外部イテレータ FizzBuzz。 a = ["Fizz", "Buzz", "FizzBuzz"] h = {0=>a[2], 3=>a[0], 6=>a[0], 9=>a[0], 12=>a[0], 5=>a[1], 10=>a[1]} g = Enumerator.new do |y| loop.with_index(1) do |_, i| y << (h[i % 15] || i.to_s) end end p g.take(20) #=>["1"…

Ruby のブロックはオブジェクト

これ、タイトルは釣りだと思うのだけれど、一応。Ruby のブロックはもちろんオブジェクトです。Proc オブジェクトとして持ち運ぶことができます。例えば def hoge(&bk) p bk bk.call end hoge do puts "fuga" end というコードがあります(むっちゃテキトー…

RubyGem 'Salamander' でヒルベルト曲線を描く

RubyGem 'Salamander' は Ruby/SDL を使ってタートルグラフックスを実装しています。これを使ってヒルベルト曲線を描いてみました。Linux Mint 18.2 と Ruby 2.3.3 で確認しています。インストールは Bundler で入りますが($ gem install salamander でもた…

Ruby のイテレーションされる配列の破壊的変更について

この Ruby コードの出力がわかりますか。 ar = [["a"],["b"]] ar.each do |x| p x ar[1] = 1 end p ar 結果はこうです。 ["a"] 1 [["a"], 1] イテレーションされる配列をブロック内で変更すると、イテレーションがおかしくなります。わかりにくいので、これ…

『Cプログラミング診断室』について

Cプログラミング診断室 おもしろいサイトを見つけました。C言語のヒドいコード(いわゆるクソコード^^;)を眺めて、リファクタリングしようというものです。僕などのように、独学で誰もまわりにプログラミングを知っている人のいない孤独なアマチュア・プロ…

ベルマン−フォード・アルゴリズム(Ruby)

ベルマン−フォード・アルゴリズムは、ダイクストラ法にさらに辺の重みが負の場合も含めて最短経路を求めることができます。入出力などはダイクストラ法の場合を参照して下さい。コーディングは Ruby で行いました。返り値は配列 [shortest, pred] で、pred …

組み込みクラスのすべてを移譲する(Ruby)

require 'delegate' class MyArray < DelegateClass(Array) def initialize(*args, &bk) super(Array.new(*args, &bk)) end def to_s join('_') end end a = MyArray.new(5) {rand(5)} p a #=>[4, 2, 3, 2, 4] p a.to_s #=>"4_2_3_2_4" MyArray クラスは(リ…

結城先生の薬品格納クイズ(Ruby)

「既約分数クイズ」に続いて、結城先生の「薬品格納クイズ」というというのをやってみます。 薬品格納クイズ 問題: 6×2=12個の区画に分かれている薬品箱があります。 ここにA, Bという二種類の薬品を格納します。 ところが、薬品Bは縦や横に隣り合った区画…

ダイクストラ法(Ruby)

前エントリでは閉路なし有向グラフ(DAG)の場合に最短経路を求めてみましたが、ダイクストラ法は閉路があり、かつ辺の重みが非負の場合に最短経路を求めることができます。入出力は、閉路があって辺の重みが非負である以外、DAG の場合と同じなので、そちら…

閉路なし有向グラフ(DAG)の最短経路(Ruby)

上の閉路なし有向グラフ(DAG)のように、辺に「重み」が付いている場合において、最短経路を求めてみます。手続きは 入力: G: n 個の頂点の集合 V と m 本の有向辺の集合 E を含む閉路なし有向グラフ。 s: V の始点。 出力: V に含まれる始点以外の頂点 v…

トポロジカルソート(Ruby)

閉路なし有向グラフ(DAG: directed acyclic graph)のトポロジカルソートです。トポロジカルソートとは、上のようなグラフがあったとき、 入力:1〜n の頂点をもつ閉路なし有向グラフ。 出力:グラフ内の辺を (u, v) とするとき、u が v の前になるように並…

「既約分数クイズ」を解く(Ruby, C言語)

ここのところで結城先生の「既約分数クイズ」のことを知りました。結城先生らしい「お話」仕立てですので、是非参照して頂きたいですが、簡単にいうと 問題:正の整数Nが与えられているとき、 以下の条件を満たす既約分数p/qを「すべて」求めるアルゴリズム…

フォードの円、GTK+ で落書き10(Ruby)

いわゆる「フォードの円」というものを描いてみました。これについてはここで知ったものです。ありがとうございます。Ruby で描きました。描画には自作の Gem 'oekaki' を使っています。 oekaki_sample10.rb require 'oekaki' Width, Height = 500, 500 Oeka…