Ruby

四則演算のパーサー(Ruby)

ある問題を解いていて、四則演算のパーサーってどんな風に書くのだろうと思って考えてみました。いわゆる「逆ポーランド記法」にパースできればあとは簡単なので、その方針で考えたのですが、自力ではちょっと荷が重かったですね。ということで検索してみた…

Ruby で二分探索木

勉強のために Ruby で二分探索木を書いてみました。 二分探索木の Ruby 実装 · GitHub なお、以下のコードは説明のためなので、Gist のコードを多少簡略化しています。 木(Tree)のクラスと要素(Node)のクラスを定義します。Node は Struct クラスを使っ…

Ruby の素敵なワンライナーコマンド「rb」

ふらふらと yhara.jp を見ていたら、sedやawkが覚えられないRubyistのための「rbコマンド」という記事があって大変におもしろかったです。Ruby には -n や -p といったワンライナー用のオプションがあるのですが、自分はこれが覚えられない。sed も awk も覚…

隣り合わないのがマナー?(Ruby)

アルゴリズム・パズルです。 電車の中に 6人がけのロングシートが向かい合いになって、計12の席があるとします。 すべて空いている状態からすべてが埋まるまで、両隣が空いている空席があるときはそちらから座るというルールで、全部で何通りの席の埋まり方…

Linux Mint 19(Ubuntu 18.10)に Bundler で Ruby/Tk を入れる

Ruby 2.7.0 では以下の方法でインストール可能です。ただし、gem 'tk' を使うと警告がたくさん出ます。(2020/3/12) Ruby 2.6.0 では以下の方法では tk はインストールできないようです。対策はいまのところわかりません。 なお、Bundler を使わず gem inst…

4つの数で 10 を作る(Ruby)

テンパズル - Wikipedia 1桁の4つの数と四則演算で、10 を作るコードを Ruby で書いてみました。括弧は使ってもよいことにします。実行例。 $ ruby make_ten.rb [2, 7, 3, 9] で 10 を作る (2 + 3) * (9 - 7) (7 + 9) - (2 * 3) 9 + (7 - (2 * 3)) 9 - ((2 *…

Ruby で ANSIエスケープシーケンスを扱う

Ruby を使っているとき、Linux でのターミナル表示の処理の仕方をすぐ忘れてしまうので、簡単なライブラリを作った。 以下はこんな画面を作るコード。 require_relative 'es' res = ES.reset print ES.clear puts ES.color(:style, :blink) + ES.color(:gree…

クロスワードパズルを作成せよ!(Ruby)

アルゴリズム・パズルです。 クロスワードを作る場合、空白と黒マスについて次のルールがあります。 黒マスは縦横に連続しない。 黒マスによって盤面が分断されてはいけない。 黒マスルール - Wikipedia これを「黒マスルール」といいます。 さて、縦 5、横 …

浮動小数点演算の謎

30年前の名著「数値計算の常識」を読んでたらBASICで0.01を10000回足したら100.003になるとか書いてあった。まあ昔のPCなんてそんなものかなと思いながら、Visual Studio 2017で試してみたら同じ結果だったw pic.twitter.com/HBwJhlhZjc— mはげ (@Tw_Mhage…

Ruby/SDL でランダム・ウォーク

Ruby/SDL(参照)を使ってランダム・ウォークしてみました。Linux Mint 19、Ruby 2.5.1 で確認しました。コード。 sdl_random_walk.rb require_relative 'sdl_draw' WindowWidth = 300 FieldWidth = 50.0 N = 30 class Agent def initialize(ob) @x = @y = 0…

平方根(ルート)を計算して遊ぶライブラリを作った(Ruby)

遊びで平方根(二乗根)を扱うクラス(Root)を Ruby で書いてみました。三乗根とかそれ以上は扱えません(笑)。コードは下(Gist)にあります。 平方根の計算 · GitHub オブジェクトの生成。Integer, Rational, Float のルートが扱えます。Root.new(n) ま…

「たけしのコマ大数学科」の問題を Ruby で解く

marginalia.hatenablog.com marginalia.hatenablog.com marginalia.hatenablog.comいまこちらの記事で挑戦中です。「たけしのコマ大数学科」については Wikipedia でどうぞ。 問題例です。 10人が円卓に座って1人ずつ握手をするとき、全員の手が交差しないよ…

連続数字をハイフンでつなぐ(Ruby)

既に更新はされていませんが、僕はブログ「hp12c」をよく読んでいます。Ruby 好きには楽しいですね。そこで、「Rubyで連続数字をハイフンでつなぐよ」というエントリがありました。元ネタはここということです。やることは要するに、「スペース区切りの数字…

自然数を n 個に分割する & 重複組み合わせ(Ruby)

def divide(x, n) result = [] return [] if n.zero? return [[0] * n] if x.zero? return [[x]] if n == 1 0.upto(x) do |i| result += divide(x - i, n - 1).map {|a| a + [i]} end result end p divide(5, 3) 結果。5 を 3つに分割している。 [[5, 0, 0],…

1時間以内に解けなければプログラマ失格?

blog.kazuhooku.comここで次のような問題を見つけました。 1,2,…,9の数をこの順序で、”+”、”-“、またはなにもせず結果が100となるあらゆる組合せを出力するプログラムを記述せよ。例えば、1 + 2 + 34 – 5 + 67 – 8 + 9 = 100となる。 1時間以内に解けなけれ…

GTK+ とソケットを使ってチャット通信(Ruby)

Ruby/GTK2 の使い方が少しづつわかってきたので、ソケットを使ってチャット通信ソフトを作ってみました。上の例では Linux Mint 18.3 と Ubuntu Budgie を使って実行しています。まずはサーバ側を立ち上げます。これはふつうに $ ruby oshaberi.rb と実行す…

Gem 'oekaki' のリファレンスを作る

http://obelisk704.web.fc2.com/ruby/oekaki_document.html いまさらながら Gem 'oekaki' のリファレンスを書いたので、よろしければ使って下さい。

Ruby/SDL でテトリス

いやこれ、僕が作ったのではないのですよ。Gem 'rubysdl' のサンプルとして付属していたものを、多少改変しただけですが、きれいなコードで勉強になったのでここにメモしておきます。コードは Gist に上げておきました。 Ruby/SDL でテトリス · GitHub あと…

ランダムかつ重複しないように文字列を生成する(Ruby)

あることのために必要だったので、複数の文字列をランダムかつ重複しないように生成するメソッドを書いてみました。こんな感じです。 $ irb irb(main):001:0> require_relative "generate_random_strings" => true irb(main):002:0> Utils.generate_random_s…

Ruby/Rouge でコードをシンタックスハイライトした HTML と CSS を出力させる

Ruby コードを HTML化して、ついでにシンタックスハイライトもできるようにできないか、やってみました。 画像だとこんな感じです。全体はこういう風です。RubyGem 'rouge' というものを使いました。インストールはふつうに $ gem install rouge とかBundler…

Ruby で関数型プログラミングっぽく(コピペ) + Haskell 版

parrot.hatenadiary.jpここのブログ記事を読んで感銘を受けました。だからこれを読んでもらえればよいのですが、せっかくなのでコピペしておきます。元記事に感謝です。まずは問題。 ある数字にそれを逆に並べた数字を足すという計算を、 回文数(上から読ん…

Ruby/SDL を使ってみる

これまで Ruby で画面に線を引いたり円を描いたりするのに、自作の Gem 'oekaki' を使ってきましたが、その中では Gem 'gtk2' を使っていて、たかがお絵かきに GTK+ を使うのは大袈裟すぎるようにも思われたので、Ruby/SDL を使ってみることにしました。Linu…

交差せずに一筆書き(Ruby)

問題: 長方形状に横 5 個、縦 4 個の格子点が全部で 20個、等間隔に並んでいます。このすべての格子点を一筆書き(交差してはならない)で辿るとすると、その辿り方は全部で何とおりあるでしょうか。 ただし進む方向は上下左右のみで、また始点と終点が反対…

Ruby でファイル転送(改良版)

obelisk.hatenablog.comローカルエリア内に PC が散らばっているので以前ファイル転送のコマンドを作ったのですが、1つのファイルしか転送できないとか、バイナリファイルは転送できないなど使いにくいところがあったので、それらに対応してみました。本当は…

Ruby で簡単なレイトレーシング(メモ)

Rubyでレイトレーシングした - yhara.jp 上の画像はここの ray5.rb を実行したもの。なおこれは ppm 画像ファイルのデータを出力するコードであり、 $ ruby ray5.rb > rayimg.ppmみたいに実行するとよい。ppm 形式については http://ruby.kyoto-wu.ac.jp/~ko…

μSchemeR の Ruby による実装を読む(その4 - 再帰、純粋関数型言語の完成)

まずは if文を実装しましょう。書き方はこんな感じ。 [:if, [:>, 3, 2], 1, 0] まずは従来のメソッドを書き直します。(あとで :letrec も実装するので、それも書き加えています。) def special_form?(exp) lambda?(exp) or let?(exp) or letrec?(exp) or i…

Ruby/GTK+ でちょっと考えた

以前に Ruby の GUI で、ここの Ruby/Tk でやろうとしていることを Green Shoesでやろうとしてみた。 obelisk.hatenablog.com でもそれは元記事の意図とはちがっていて、「ボタンを押した時に、多重入れ子構造で内側に配置したウィジェットから外側に定義し…

μSchemeR の Ruby による実装を読む(その3 - クロージャ)

:lambda にクロージャを実装する前に、let文を実装します。 [:let, [[:x, 3], [:y, 2]], [:+, :x, :y]] は [[:lambda, [:x, :y], [:+, :x, :y]], 3, 2] と同等です。実装。単純です。:lambda に変換しているだけです。 def eval_let(exp, env) parameters, a…

μSchemeR の Ruby による実装を読む(その2 - 無名関数)

簡単な演算ができるようになったので、次に無名関数を実装してみます。具体的には、 [[:lambda, [:x, :y], [:+, :x, :y]], 3, 2] というような関数を評価することを考えます。これは Ruby でなら lambda do |x, y| x + y end.call(3, 2) みたいなものですね…

μSchemeR の Ruby による実装を読む(その1 - 簡単な演算)

つくって学ぶプログラミング言語 RubyによるScheme処理系の実装【電子書籍】渡辺昌寛達人出版会発行日: 2013-04-15対応フォーマット: PDF, EPUB詳細を見る言語処理系のお勉強をしようと思って調べてみたところ、上の文書を見つけました。Ruby で Scheme の一…