Ruby

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] イテレーションされる配列をブロック内で変更すると、イテレーションがおかしくなります。わかりにくいので、これ…

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

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

組み込みクラスのすべてを移譲する(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)

前エントリでは閉路なし有向グラフ(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…

基数ソート(Ruby)

基数ソートは固定長の文字列のソートなどに使うアルゴリズムで、下の位(文字列の右の方)から順にソートしていって、すべての位をソートし終えたとき、全体のソートが終っているという方法です。個々のソートには高速な「計数ソート」を使うとよい(「安定…

バケットソート(と計数ソート)(Ruby)

バケットソートはバケツソート、ビンソート、計数ソート(後記:計数ソートとバケットソートはちがう)などとも言います。非常に高速ですが、ソートされる対象は 0以上の整数値(またはそれに変換できるもの)であり、その最大値が大きくなるとメモリをバカ…

マージソートとクイックソートの比較(Ruby)

自分の実装で、マージソートとクイックソートのベンチマークをしてみました。 マージソートの実装はこれ、クイックソートのはこれ(いちばん下の実装)です。 マージソート。 クイックソート。 基本的にクイックソートの方が速いようである。 ベンチマーク。…

エイト・クイーン(8 queen)問題を Ruby で解いてみる

エイト・クイーン - Wikipedia チェスの盤上に、8個のクイーンを配置する。このとき、どの駒も他の駒に取られるような位置においてはいけない。 チェスの盤面は 8×8 であり、クイーンのコマは前後左右斜めにどれだけでも進むことができます。盤面上に 8つの…

与えられた迷路の最短経路を求める(Ruby)

人材獲得作戦・4 試験問題ほか: 人生を書き換える者すらいた。 さて試験問題です。 内容は、壁とスペースで構成された迷路が与えられたとき、スタート地点からゴール地点に至る最短経路を求めよ、というものです。 おもしろそうなので Ruby で解いてみまし…

マージソート(Ruby)

アルゴリズムの基本作者: トーマス・H・コルメン,長尾高弘出版社/メーカー: 日経BP社発売日: 2016/03/11メディア: 単行本この商品を含むブログ (5件) を見るマージソートのアルゴリズムだけ勉強して、自力で Ruby で実装してみました。merge_sort.rb class A…

Ruby でたらいまわし関数を遅延評価する

Haskell が遅延評価で「たらいまわし関数」を高速に実行できるなら、Ruby でも Proc で遅延評価できるので、Ruby でも「たらいまわし関数」を高速化できるのではないかと思った。でぐぐってみたら、そのものズバリの記事を発見。 おお、きちんとまとまったわ…

GTK+ で落書き 9(Ruby)

自作の Gem 'oekaki' で落書きしてみました。蚊取り線香? 何だか目が回ります。 コードは以下。何も考えずにテキトーにいきあたりばったりでコーディングしました。 require 'oekaki' R = 7 Width, Height = 500, 500 Oekaki.app width: Width, height: Hei…

ドラゴン曲線を描く(Ruby)

自己相似図形であるドラゴン曲線を Ruby で描いてみました。 3次。 5次。 10次。これだと確かにドラゴンみたいですね。 描画には自作の Gem 'oekaki' を使っています。 require 'oekaki' Width, Height = 600, 400 class Point < Struct.new(:x, :y) end Oek…

マンデルブロ集合を描いてみる(Ruby)

このサイトのそのままパクリです(ありがとうございます!)。やったのは Java から Ruby へ移植しただけ。 def mandelbrot_count(c) z = Complex(0) 100.times do |i| z = z ** 2 + c return i if z.abs > 10 end 100 end Diff = 0.001 io = open("mandelbr…

コッホ曲線を描く(Python, Ruby)

自己相似図形であるコッホ曲線を Python と Ruby で描いてみました。 Python では手軽にタートル・グラフィックスが使えるので、これを利用するのが簡単です。 3次のコッホ曲線を描きます。 from turtle import * def draw(length, depth): if depth == 0: f…

Ruby でローレンツアトラクタを描画する

Ruby + gnuplot でローレンツアトラクタを描いてみました。 全体的にここなどを参考にしました。微分方程式はオイラー法(参考)で数値計算しています。gnuplot での描画は numo/gnuplot という Gem を使っています。 require 'numo/gnuplot' fx = lambda {|…

1Ωの抵抗10個で黄金比の値に近づける(Ruby)

問題: 1Ω の抵抗 10個を使い、合成抵抗が黄金比 1.6180339887..Ωにもっとも近づく場合の値を、少数第10位まで求めよ。 aΩ と bΩ の抵抗をつなげる場合、直列つなぎにすれば合成抵抗はたんに a + b Ω になりますが、並列つなぎの場合はそれらの逆数の和の逆…

ナップサック問題(Ruby)

次のような問題があるとします。 学校でクラブ活動をするのに、選んだクラブの人数の合計が 150人以下になるようにするとします。クラブの想定人数とそれが使う敷地面積は次のように与えられています。 クラブを幾つか適当に選ぶとき、必要な敷地面積の総和…

右折禁止(アルゴリズム・パズル)

アルゴリズム・パズルを Ruby で解いてみました。 class TurnLeft class Position def initialize(x, y) @x, @y = x, y end attr_accessor :x, :y def +(dir) Position.new(@x + dir[0], @y + dir[1]) end end class Field def initialize @yoko = Array.new…

GTK+ で落書き 8(Ruby)

Gem 'oekaki' で落書きです。 oekaki | RubyGems.org | your community gem host GTK+でお絵かきしてみた(Ruby) - Camera Obscura 再帰的な tree を描いてみました。画像では動きはないですが、じつはアニメーションです。 require 'oekaki' Width, Height…

いわゆる「スライドパズル(15パズル)」もどきを Ruby で解いてみる

スライドパズルっていうおもちゃがありますよね。4×4 のマス目に空白がひとつあって(残りはコマ)、コマは空白にスライドさせて動かすしかなく、それを特定のパターンに揃えるというものです。ここではルールを少し改変して、特定のマスを別の特定のマスに…

迷路の中を歩く(Ruby)

ひとつ前の記事で迷路を生成したので、その中を歩いてみるプログラムを書きました。OpenGL を使っています。 赤い床のマスがゴールです。"v" で左回転、"b" で右回転、スペースで前進します。迷路は実行のたびに新たに生成されます。 ぐぐってみても意外とこ…

Ruby で迷路作成

http://apollon.issp.u-tokyo.ac.jp/~watanabe/tips/maze.html ここのリンク先のアルゴリズムを使って、迷路のジェネレーターを Ruby で書いてみました。リンク先でも Ruby での実装がありますが、自分でやってみました。 20×20の迷路です。 コードは以下で…

「等値」と「等価」は 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 self.play player1 = Cp.new player2 = Man.new judge = Judge.new(player1, player2) 5.times {|i| judge.game(i + 1)} judge.winner end class Player def initialize @wincoun…

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 ho…