ruby

On Lispとか読んでRubyとLispの違いをちょっと考えた

全400ページのうち3/4がマクロの説明に当てられている、Paul Grahamの「On Lisp」を8割ほど読んだ。冒頭のCommon Lisp入門で紹介されている標準関数やユーティリティ関数のネーミングのひどさ(やたらと数字でサフィックス付けるとか、rplacaとかってどうよ…

自明なコード

青木峰郎さんの「正しいRubyコードの書き方講座」の本を、いまさらのように買って読んでいる。勉強になるのだけど、以下に引用した添削のbefore / afterにびっくりした。Wikiの*を個数に応じてh1、h2などのタグに開くコードだけど、最終的に4行にしてしまっ…

class_evalでDRYにしてみたかったけど

Railsアプリで書いたビューのためのヘルパークラスをしつこくリファクタリング。以下の2つのクラスがDRYじゃない。今後、LinkedInも足すかもしれないし。 class TwitterPhotoUrl < PhotoUrl def path case @options[:size] when :small add_suffix_to_path(@…

オイラープロジェクトをRSpecを使ったテスト駆動っぽく

オイラープロジェクト17問目。1〜1000までの数字について、「345 -> three hundred and forty-five」のように文字に開いたとき、使われているアルファベットの文字数の合計を求めよという問題。RSpecでやってみた。イテレーションが短いのが好きなので、最初…

stringオブジェクトがクラス名となるクラスを生成する

FacebookやTwitterで異なる写真のURLを一元的に取り扱うために、PhotoUrlクラスを定義して、それをFacebookPhotoUrlやTwitterPhotoUrlに継承するようにしたのはいいけど、結局、ケースごとにインスタンス化するクラスを分けるコードが残って、なんか違うだろ…

ハッシュを使ってString#gsubする

Rubyで書かれたTwitterクライアント「Earthquake」から。ext.rbを見ると、いろいろ標準クラスやライブラリを拡張してるのだけど、Stringのところで、へぇと思った。 class String def c(*codes) codes = codes.flatten.map { |code| case code when String, …

numeric.cを書き換えてFizzBuzzを1行で

Rubyってオープンクラスだから実行時にコアクラスを書き換えていいんですね!というネタとして、以下のように書いてみた。 require 'fileutils' File.open("./numeric.c", "r") do |klass| File.open("./numeric.tmp", "w") do |tmpfile| while line = klass…

旅の恥とirbは使い捨て

.screenrcに以下のように追記した。 escape ^Jj : : bind -c app t screen top bind -c app i screen irb : : bind ^j command -c app「escape ^Jj」という指定で、標準だとCtrl-aのscreenのキーバインドをCtrl-jにしている。主に指の健康のため。で、2打目…

Rubyのensureはどのぐらい強いか

catch(:goto) do begin puts "hey" raise rescue puts "rescued" throw :goto exit 1 ensure puts "ensure" end end puts "caught" % ruby rescue.rb hey rescued ensure caughtなるほどなぁ。exitよりもensure。ensureの利用目的を考えると、そうなのかも。…

RubyのFileとFileUtilsの違い

何となくモヤッとしたまま必要なときにメソッドを調べて使っていたけど、FileとFileUtilsの違いは、Fileが文字通りファイルを抽象化するクラスで、その属性やタイプを調べたり、読み書きしたりするためのもの。ファイルをオブジェクトとして扱うだけではなく…

RubyのTime#strftimeを覚える(これっきりにしたい)

RubyのTime#strftimeのディレクティブは対称性があるように見えて、そうでもない例外があって覚えづらい。 %a - The abbreviated weekday name (``Sun'') %A - The full weekday name (``Sunday'') %b - The abbreviated month name (``Jan'') %B - The full…

ハフマンツリーをRubyで書く

ハフマン符号化に使うハフマンツリーをRubyで作ってみた。2本のキューを用意して、2つのノードをくっつけたり出し入れするのが簡単というのでそういう方針で。本当は1本はプライオリティ・キューでないとエンキュー時にソートするために効率が悪い。 # Huffm…

Rubyでぷよぷよ19連鎖

http://okajima.air-nifty.com/b/2011/01/2011-ffac.html にある、連鎖するプログラムを書けというやつ。大きな方針として、最初から以下のようにすべきだった。オブジェクトは各種状態を1つだけ表現するようにして、次々と状態が隣接状態を作るという。やっ…

クラスが分からない

人気の高いライブラリのコードを読んだりすると、ナルホドそうやってクラスやモジュール、処理を切り分けるのかなんて思うけど、自分で書くとなると、なんだかむちゃくちゃ。読めるけど書けない、聞けるけど話せないというのは外国語の学習では普通のことな…

ぷよぷよ19連鎖にRubyで2時間かかった。

http://okajima.air-nifty.com/b/2011/01/2011-ffac.htmlまたしても2次元配列の初期化を間違えてハマったり、再帰による探索で初歩的なミスをしたり、なにより状態とクラスの扱いをどうするべきかで各関数の出し入れに統一感がなくぐちゃぐちゃになり、とい…

Rubyでinvalidなバイト列を含むUTF-8文字列を扱う

Ruby 1.9系ではStringオブジェクトにエンコーディング情報が付加されていて、マルチバイトや複数エンコーディングを扱う日本人としては嬉しい限りだけど、時々エンコーディング関連で例外が発生して落ちすぎるぐらい落ちるように感じるときがある。ちょっと…

Rubyのmapは面倒な気が

オイラープロジェクト32問目。a*b=cで、a、b、cをつなげた数字が123456789のすべてを1つずつ含む組み合わせを求める。 def pandigital? (n) n.split(//).sort.join.to_i == 123456789 end result = [] (1..10000).each do |i| (1..10000).each do |j| break …

bitlyをRubyで使う

あるURLについて、ネット上で人々が何を言っているか、話題になっているかを知るのに、最近は、はてなブックマークよりもTwitterのほうがいい感じ。特にbit.lyがいい。bit.lyのAPIをRubyで叩いてみた。どのぐらいRTされているかを表示する。 #!/usr/bin/env …

Railsは楽しい?

Railsを細々と勉強している。Githubにはすごい世界が広がってるなぁという感想と同時に、なんというか全然楽しくないなぁ、やりたいことがなかなかできないなぁというもどかしさも感じる。ライブラリの使い方というのは、細かな動作や作法を試しながら覚える…

パーフェクト・シャッフル

52枚のトランプの山を半分に分け、26枚ずつにする。この2つの山を1枚1枚互い違いに挟み込むようにシャッフルする。つまり、 1,2,3,4,5,6....26 27,28,29,30....52という2つの山を 27,1,28,2,29,3....というふうにシャッフルする。これをパーフェクト・シャッ…

ユークリッド互除法って速いのかしら

Project Euler 108問目。nが与えられたとき、 1/x + 1/y = 1/nを満たす、x、yのユニークな組み合わせ数を調べる。初めて組み合わせ数が1000を超えるnはいくつか?RubyのComparableみたいなものを使ってみたかったこともあって、分数クラスを作ってブルートフ…

関数型っぽくフィボナッチ

ブログの間が空きすぎたときの、オイラープロジェクト。25問目。フィボナッチ数列で初めて1000桁を超えるのはいくつ目か、という問題。普通にクラスを作ってメモ化。 class Fib def initialize @memo = {} end def calc(n) @memo[n] ||= begin (n <= 2) ? 1:…

RailsのMapperあたりを読んでみる

「Head First Rails」に続いて、「RailsによるアジャイルWebアプリケーション開発 第3版」をツラツラと読んでみた。ホビープログラマとしては、テストの話あたりが新鮮で面白かった。まずURLのラウティング(ディスパッチ?)処理をやってるActionController::R…

2人でババ抜きをしてディール直後にカードが手元に残らない確率

ムスメと2人でババ抜きをしていて、あまりにもディール直後でいきなりババだけ残して終了となることが多いことに気づいた。使っていたのはJ、Q、K、Aの4種のカードとババ1枚と少なめだけど、それにしてももう少し奇数枚で割れても良さそうに思えた。で、以下…

Project Euler 19

Project Euler 19。月初めのツイタチが日曜日の月は、20世紀中にいくつあるか。こんな課題をRubyでやるのに意味があるのかって話もあるけど、ライブラリの使い方を地道に試すのも言語習得の大事なステップ? こういうの、使ってないとすぐに忘れる。 require…

Project Euler 24

Project Euler 24は組み合わせの問題。Rubyを使うとワンライナーになって、反則といえるほどトリビアルになってしまう。 (0..9).to_a.permutation.to_a[1_000_000 - 1].join

Project Euler 44

Project Euler 44はpentagonal numbersの問題。思い切り力技、かつ抽象度が高い感じ。コードは短く、ほぼ問題文をそのまま書いただけと分かりやすいけど、とにかく遅い。7、8分かかってやっと答えが出た。直感的に最初に出てくるペアが最小だと思って、実際…

Project Euler 22

Project Euler 22はアルファベットの名前を足し算するような問題。mapとかinjectとか、実は読みづらいんじゃないかという気がしつつ。 while line = gets names = line.chomp.split(/,/).map{|name| name.gsub(/\"/,'')} end total = 0 def c2v(c) c.ord - "…

Project Euler 21

思い出したようにProject EulerのProblem 21。aとb、2つの数があるとき、これらの約数の合計が等しく、a!=bであるとき、aとbの組み合わせをamicable numbers(友愛数)と呼ぶ。10000以下のamicable numbersの合計を求めよ。例えば220と284はamicable numbers。…

JavaScriptを少しやってみたいかも

Google Apps Scriptが面白いことに気づいた。ちょこちょこっと書けばすぐに動く。スプレッドシートを標準入出力的に使ってウェブから何かを持ってきたり、セルを何かで埋めたりといったことが簡単にできる。ある意味では素のJavaScriptよりも簡単。サーバサ…