読者です 読者をやめる 読者になる 読者になる

「等値」と「等価」は Ruby では?

これを見てどうも Java や C++ の話のように思ったのだが、最初の「『等値』と『等価』の違いを説明してください」というのがよくわからなかった。僕は Ruby しか知らない素人初心者プログラマなのだが、Ruby だとどういうことなのだろう。ただ、Ruby でも「…

Ruby で関数型プログラミングもどき

上のリンク先で JavaScript を使って、オブジェクト指向プログラミングと関数型プログラミングの対比をやってあったので、Ruby に移植してみました。 課題: 唐揚げ弁当がいくつかあるとします。それぞれ唐揚げが複数入っています。 この中からx個の唐揚げ…

「10分でコーディング」やってみた(Ruby)

10分でコーディング|プログラミングに自信があるやつこい!!はてなブックマーク- 10分でコーディング|プログラミングに自信があるやつこい!! たぶん10分以内にできたと思う。問題は、num_player 人のプレーヤーに deck で与えられたカードを切ると…

Python の for else って地味に便利と Rubyist が思う

ので、遊びで Ruby で実装してみました。each_with_proc(pc, *args) で、ふつうの each のループが終ったあとに proc オブジェクト pc が pc.call(*args) されます。ブロックから break で抜けた場合は proc は呼ばれません。 module Enumerable def each_wi…

「孤独の7」を Ruby で

rscの日記さんのところで、「孤独の7」という虫喰い算を知りました。問題は右の画像のとおりです。ここで回答を募集していたようです。 Ruby で解きました。かかった時間はほぼ 0.1秒です(答えの uniqueness のチェックなし。チェックすると 0.7秒程度)。R…

Ruby の OpenStruct クラスでアトリビュートっぽく

Python や JavaScript では >>> class Country: ... pass ... >>> japan = Country() >>> japan.capital = "Tokyo" >>> japan.capital 'Tokyo' みたいな書き方ができるのだけれど(いわゆる「アトリビュート」)、Ruby ではこういう書き方はないのかなと思っ…

Ruby でクラスメソッドを include する

Ruby でモジュールを include してクラスメソッドを作りたいとします。そのとき、 module Utility def self.output(str) puts "output: #{str}" end end class A include Utility end A.output("Hello!") #=>undefined method `output' for A:Class (NoMetho…

Ruby のメソッド間で変数を共有する

Ruby のメソッド間では、ふつうは変数は共有されません。 def counter_set x = 0 end def inc x += 1 end def counter_value x end counter_set inc inc counter_value は最初の inc 呼び出しのところで undefined method `+' for nil:NilClass (NoMethodErr…

GTK+ で落書き 7(Ruby)

Gem 'oekaki' で落書きです。 oekaki | RubyGems.org | your community gem host GTK+でお絵かきしてみた(Ruby) - Camera Obscura 引き続き Tool#star を使っています。 require 'oekaki' Oekaki.app do draw do color(0, 0, 0) rectangle(true, 0, 0, 300…

オブジェクト指向じゃんけんゲームの Ruby 移植版

前回エントリの C# バージョンの、Ruby 移植版です。 module JankenAsobi def play player1 = Cp.new player2 = Man.new judge = Judge.new(player1, player2) 5.times {|i| judge.game(i + 1)} judge.winner end module_function :play class Player def in…

GTK+ で落書き 6(Ruby)

Gem 'oekaki' で落書きです。 oekaki | RubyGems.org | your community gem host GTK+でお絵かきしてみた(Ruby) - Camera Obscura スターを描いてみました。 require 'oekaki' Oekaki.app do draw do color(0, 0, 0) rectangle(true, 0, 0, 300, 300) colo…

ファイルが画像でなければ削除する(Ruby)

削除すれば true、しなければ false を返します。なお、判断は拡張子で行っているわけではありません。 irb(main):007:0> require './delete_non_img' => true irb(main):008:0> Utils.delete_non_img("img.png") #削除しない => false irb(main):009:0> Uti…

GTK+ でプログレスバーを簡単に使う(Ruby)

長い処理だと、プログレスバーがあると便利ですよね。GTK+ で簡単に表示できるライブラリを作ってみました。 使い方はこんな感じです。 Utils.progress_bar do |bar| for i in 0..20 bar.fraction = i / 20.0 bar.text = "#{i * 5}%" sleep(0.5) end end Uti…

GTK+ で落書き 5(Ruby)

Gem 'oekaki' で落書きです。 oekaki | RubyGems.org | your community gem host GTK+でお絵かきしてみた(Ruby) - Camera Obscura キャンバス空間と色空間をリニアに連続的変化させて、ドットを描いています。 Ruby コード。 require 'oekaki' require 'ma…

ディレクトリのバックアップ-削除あり(Ruby)

Ruby でバックアップ・プログラムを書きました。バックアップ先のフォルダがバックアップ元のフォルダの中身と再帰的に同じ内容になるようにします。なので、バックアップ先にあってバックアップ元の中身にないファイルやフォルダは(バックアップ先で)削除…

任意の階層だけ繰り返しをネストするメソッド(Ruby) -- 改訂版

Array#nest_loop で、Integer#times の多重ネスト版です。配列にループ回数を入れて呼び出します。わかり切った多重ループを書くのが面倒なときに役立ちます。野良 Gem 'utils' に入っています(参照)。 [4, 2, 3].nest_loop do |i, j, k| print "#{[i, j, …

GTK+で落書き 4(Ruby)

引き続き Gem 'oekaki' で落書きです。 oekaki | RubyGems.org | your community gem host GTK+でお絵かきしてみた(Ruby) - Camera Obscura Ruby コード。 require 'oekaki' include Math L = 300; O = L / 2 R = 140 step = 20 i = 0 Oekaki.app width: L…

GTK+ でぽちぽち遊び(Ruby)

キャンバス上でマウスクリックして下さい。ぽちぽち円が描かれます。 右クリックで終了ボタンが出ます。 Ruby コード。 require 'oekaki' L = 500; R = 25 Oekaki.app width: L, height: L do draw do color(0, 0, 0) rectangle(true, 0, 0, L, L) end quit_…

複素フィボナッチ数列と GTK+ お絵かき

GTK+でお絵かきしてみた(Ruby) - Camera Obscura これまで mygtk.rb と言っておった GTK+ お絵かきモジュールを、Gem 'oekaki' として RubyGems.org に登録いたしました。よろしかったら使ってやって下さい。 oekaki | RubyGems.org | your community gem …

Ruby Gem できた

野良 Gem の作り方(Ruby) - Camera Obscura 以前「野良 Gem」(「野良」なのは、僕が RubyGems.org に登録していないからです)を作ったのですが、いいかげんなやり方だったので、書き直してみます。gem 'mygtk' を作ってみます。git が必要なので、なけれ…

Ruby 実行のエラー時に n 回リトライするメソッド

n.times_retry でブロック内をエラーがあれば最大 n 回再実行し、それを超えれば停止します。エラーがないかリトライに成功すれば、そのまま次へ処理が渡されます。引数の massage は true ならば情報を出力します(デフォルト true)。wait: n は retry の…

GTK+で落書き 3(Ruby)

周転円みたいな。 ライブラリ「MyGtk」についてはこちら。 require_relative 'mygtk' include Math L = 400 R1 = 150; R2 = (L - R1 * 2) / 2 - 5 STP1 = (PI / 180) * 0.5; STP2 = (PI / 180) * 10 MyGtk.app width: L, height: L do draw do color(5000, 0…

GTK+で落書き 2(Ruby)

MF / 今日の落書き Ruby/Tk で フィボナッチ配列(螺旋) ここのパクリです。 ライブラリ「MyGtk」についてはここを参照。 require_relative 'mygtk' include Math ANGLE = 2 * PI * (1 + sqrt(5)) / 2 MyGtk.app width:300, height: 300, title: :Fibonacci d…

コンウェイのライフゲームを Ruby で実装してみた

有名な「コンウェイのライフゲーム」を素朴に実装してみました。一種の生態系シミュレーションですね。ルールは簡単です。「セル」が集まって長方形領域を形成しているとき、それぞれの「セル」はまわりの 8つの「セル」の状態によって「生きる」か「死ぬ」…

GTK+で落書き(Ruby)

GTK+ でアニメーションしてみました。エンターキーの入力で終了します。簡易ライブラリ mygtk.rb についてはここを参照してください。 circle_fall.rb require_relative 'mygtk' L = 400 MyGtk.app width: L, height: L, title: "Circle Fall" do timer(10) …

RubyGem 'Gosu'

Ruby の Gem で色いろ遊んでみたいと思うのだけれど、「gem おすすめ」などで検索しても Rails の Gem しか出てきません。誰かおもしろい Gem を教えてくれないですかね。だからというわけではないですが、ちょっと探してみたところ、ゲーム作成用の Gem で…

GTK+でヒルベルト曲線(Ruby)

前記事の Ruby/GTK+ 用のモジュールを使って、ヒルベルト曲線を描いてみました。Ruby/Tk 版(参照)と殆ど同じです。 require './mygtk' class Draw def initialize(n, slot) @lgth = Width / 2 ** n @y = (Width - @lgth * (2 ** n - 1)) / 2 #見栄えを整え…

GTK+でお絵かきしてみた(Ruby)

Ruby だけだと遊びで線を引く程度のことも簡単でないので、Ruby で GTK+ を使ってシンプルにお絵かきするだけのモジュールを書いてみました。できるのは、点を打つ、線を引く、長方形を描く、円(楕円、弧)を描く、多角形を描く、文字の表示、画像の取得と…

gnuplot で陰関数の表示(Ruby)

Python の matplotlib の plot_implicit による陰関数の描画がどうも信用ならないので、gnuplot でやってみることを考えた。しかし gnuplot 自体には陰関数を直接描画する機能はないので、工夫が必要となる。gnuplot で陰関数を描く 基本的には上サイトでや…

2抜きを許したストラックアウトの抜き方(Ruby)

1 2 3 4 5 6 7 8 9 ストラックアウトといって 3×3 のボードに玉をぶつけて数字を抜いていく遊びがありますね。その抜き方は何通りあるでしょうといえば、9!(9の階乗)通りとすぐ求められてつまらないので、2抜きを許します。つまり、ひとつの玉で同時に、隣…

スニーカーの靴紐の通し方についての問題(Ruby)

問題: スニーカーに靴紐を通すのに、左右に6個づつ、計12個の穴があるとします。色いろな通し方がありますが、左右の穴に交互に紐を通していった場合、紐が交差してできる点の数の最大値はいくらになるでしょうか。なお、一番上の穴から通し始めて、最後も…

野良 Gem 'Utils'

RubyGems.org には上げていませんが、Bundler を使って GitHub からインストールできる Gem(野良Gem)です。Gemfile に gem "utils", github: 'obelisk68/utils'を追加して、$ bundle install でインストールされます。詳細は下。 GitHub - obelisk68/utils…

Ruby のメタプログラミングでカウンターを作る

Ruby はインクリメントやデクリメントがないのですが、遊びでカウンターを作ってみました。メタプログラミングを使って、呼び出されるたびに step(デフォルトは 1)だけ増える数を与えるメソッドを生成します。「メソッド」というのが工夫したところです。…

YコンビネータとZコンビネータ(Ruby)

qiita.comこの記事がおもしろかったので色いろぐぐっていたら、すばらしくわかりやすいサイトがあった。d.hatena.ne.jpわかりやすいので、いっぱいブクマがついております。以下これを参考にして、メモしておきます。 まずラムダ式であるが、 f(x) = x * 2と…

いわゆる「ビュフォンの針」の同心円バージョンについて

いつも拝読している「完全無欠で荒唐無稽な夢」というブログがあるのですが、そのコメント欄にこんなことが書いてありました。 こんにちは ^^ またお願いなんですが…^^; ビュフォンの針:平行線の間隔の半分の長さの針が平行線と交わる確率が1/πというもので…

Ruby の「ふしぎに気まぐれな構文」と言われるものについて

Tiny Prolog in Ruby (Extra Lesson)空白に注意してコードを読んでみて下さい。 irb(main):001:0> def a; 1; end => :a irb(main):002:0> b = 2; c = 3 => 3 irb(main):003:0> a +b +c ArgumentError: wrong number of arguments (1 for 0) from (irb):1:in …

Shift_JIS のファイルを読み込んで UTF-8 で処理(Ruby)

Linux ではエンコーディングはふつう UTF-8 を使いますが、Windows は Shift_JIS なので、Windows 用に Shift_JIS で作成したファイルを、Linux の Ruby でふつうに UTF-8 で処理する。例。 text = File.open("hoge.txt", "r:Shift_JIS") {|io| io.read.enco…

cairo と Ruby で遊んでみる(2)

水平投射です。 require 'bundler/setup' require 'cairo' require './gifanime' include Math W = 600; H = 300 V0 = 10.0; A = 0.75; G = 5.0 v = lambda {|n| - A ** n * sqrt(2 * G * H)} t = lambda do |n| if n.zero? sqrt(2 * H / G) else ar = [1] n…

nil による NoMethodError を回避する(Ruby)

Ruby のメソッドで例外に nil を返すものは多く、NoMethodError が出て処理が止まることがあります。面倒なので回避するメソッド Object#nil_trans を書きました。self が nil 以外のときは self をそのまま返し、nil のときは引数(デフォルトは空文字列)…

Ruby で Generator の実装

Python に Generator というのがあります。Ruby では Enumerator でほぼ同じことができますが、引数の与え方がいまひとつよくわかりません。でというわけでもないのですが、勉強のために頑張って Fiber で実装してみました。Generator#args で引数を与えます…

Python の内包表記と Ruby の each_with_object

kiito.hatenablog.comこの記事は勉強になりました。Python の内包表記で def create_url_table(urls) return {url: get_title(url) for url in urls if 'google' not in url} と書くのを、Ruby の each_with_object を使うと def create_url_table(urls) url…

cairo と Ruby で遊んでみる

cairo は二次元画像を描くためのライブラリです。これと Ruby でちょっと GIFアニメを作って遊んでみました。 cairo は Linux ならたぶん最初から入っているようです。Linux Mint 17.2 には既に入っていたので、それを使いました。 Ruby で cairo を使うには…

Rubyは末尾呼び出し最適化をサポートしている

Ruby でこれはスタックオーバーフローします。 def add(n, a = 0) return a if n.zero? add(n - 1, n + a) end puts add(10000) #=>a.rb:2:in `add': stack level too deep (SystemStackError) 例えばこう対策します。 obelisk.hatenablog.com 上のとおり以…

構造体を継承する(Ruby)

アンダースタンディング コンピュテーション ―単純な機械から不可能なプログラムまで作者: Tom Stuart,笹田耕一,笹井崇司出版社/メーカー: オライリージャパン発売日: 2014/09/18メディア: 大型本この商品を含むブログ (9件) を見る上の本を読んでいたところ…

外部イテレータで素数生成(Ruby)

標準添付ライブラリに Prime がありますが、自分でやってみました。めっちゃ素朴な実装です(数が大きくなると急速に遅くなります)。 gen_primes = Enumerator.new do |y, i = 2| loop do catch do |jp| 2.upto(i - 1) {|j| throw(jp) if (i % j).zero?} y <…

シンプソンの公式による数値積分(Ruby)

Rubyによる情報科学入門作者: 久野靖出版社/メーカー: 近代科学社発売日: 2008/12メディア: 単行本 クリック: 5回この商品を含むブログ (13件) を見る f(x) = x^2 を [1, 10] の区間で数値積分してみます。ここでは区間を100分割します。ちなみに、正しい答…

1変数方程式を数値計算で解く(Ruby)

Rubyによる情報科学入門作者: 久野靖出版社/メーカー: 近代科学社発売日: 2008/12メディア: 単行本 クリック: 5回この商品を含むブログ (13件) を見る方程式 f(x) = 0 を ある区間 [a, b] において、f(x) が単調増加、連続、f(a) 0 であるとして、数値計算で…

どれくらいの再帰呼び出しでスタックオーバーフローになるか

d.hatena.ne.jp上のサイトで実験しているのに、Ruby と Python を追加しました。 OSは Linux Kernel 3.19.0、メモリは 7.7GB。Python 3.4 ctr = 0 def testfunc(): global ctr ctr += 1 print ("%sth function call." % (ctr)) testfunc() testfunc() Ruby 2…

末尾再帰をスタックオーバーフローせずに実行する(Ruby)

あるプログラムを書いていて、再帰がいわゆる「スタックオーバーフロー」するのに悩まされました。結局そのプログラムはカスだったのですが、スタックオーバーフローをおもしろい方法で回避することを知ったので、メモしておきます。まず、1 から n までを単…

Ruby の第一級関数としての Proc

不完全にしてかなり言葉足らずな比較プログラミング言語学 - 西尾泰和のはてなダイアリーはてなブックマーク- 不完全にしてかなり言葉足らずな比較プログラミング言語学 - 西尾泰和のはてなダイアリー たまたま上のブログ記事を読んでいて、次のような記述が…