Tociyuki::Diary RSSフィード

tociyuki による Perl・Ruby・C++・C で書き散らしたコードを中心に、日常雑記も混在 : B  F  twitter  GitHub  CPAN  本館  公開鍵
 | 

2008年04月17日

[] 世界のナベアツRuby で挑戦する

squeak には構文上かないませんが、なるべく似た感じになるように ruby で書いてみました:-p

id:sumim:20080417:p1 「世界のナベアツに Squeak Smalltalk で挑戦する(改訂)」

このスクリプトはメソッド名に日本語を使っているので、UTF-8 でセーブしておいてから実行します。

オリジナルとの違いは、squeak 版のようにコンテキストからローカル変数の値を参照できないものかと試行錯誤してやりかたがわからなかったので、クラス変数アクセスでごまかしています。また、〜になっての処理を関数合成しておいて、メソッド「なります」で値を適用する方式に変更しました。

(2008-04-18修正) FalseClass#のときだけ() メソッドが nil を返すように変更しました。

#!/usr/bin/ruby -Ku
#Content-type: application/x-ruby; charset=UTF-8

module NabeAtsu
  def self.run
    1.から(40).まで数えて{
      各々は{3.の倍数.と{3.がつく数字}.のときだけ{アホに}}.なって{
      5.の倍数.のときだけ{犬に}}.なって{
      8.の倍数.のときだけ{気持ちよく}}.なります
    }
  end
  
  class Context
    def アホに
      proc{|x|
        x.の読み.sub(/\A./){ $& + '' }
      }
    end
  
    def 犬に
      proc{|x|
        x.の読み + 'バフッ'
      }
    end
  
    def 気持ちよく
      proc{|x|
        y = x.の読み.dup
        y.sub!(/な\z/){ $& + 'ぁ〜〜ッ' } \
        || y.sub!(/[ちに]\z/){ $& + 'ぃ〜〜ッ' } \
        || y.sub!(/[くうッ]\z/){ $& + 'ぅ〜〜ッ' } \
        || y.sub!(/ご\z/){ $& + 'ぉ〜〜ッ' } \
        || y << '〜〜ッ'
      }
    end
  
    def self.it() @@it end
  
    def initialize(a)
      @@it = a
      @f = nil
    end
  
    def 各々は(&p)
      @f = すること(&p)
      self
    end
  
    def なって(&p)
      @f = すること(&p) * @f
      self
    end
  
    def すること
      yield || proc{|x| x }
    end

    def なります
      puts @f[@@it]
    end
  end
end

class Proc
  def *(g)
    f = self
    proc{|x| f[g[x]] }
  end
end

class Range
  def まで数えて(&p)
    each do |x|
      NabeAtsu::Context.new(x).instance_eval(&p)
    end
  end
end

class Integer
  def から(x)
    Range.new(self, x)
  end
  
  def の倍数
    NabeAtsu::Context.it % self == 0 ? true : false
  end
  
  def がつく数字
    NabeAtsu::Context.it.to_s.index(self.to_s) ? true : false
  end
  
  KazuYomi = [''] + %w[いち に さん よん ご ろく なな はち きゅう]
  KetaYomi = [''] + %w[じゅう ひゃく せん]
  
  def の読み
    a = to_s.split(//).collect{|x| x.to_i }
    a.reverse.zip(KetaYomi[0, a.size]).collect{|x|
      [x[0] == 1 && x[1] != '' ? '' : KazuYomi[x[0]], x[1]]
    }.reverse.flatten.join('')
  end
end

class String
  def の読み
    self
  end
end

class TrueClass
  def 
    self
  end
  
  def のときだけ
    yield
  end
end

class FalseClass
  def 
    yield
  end

  def のときだけ
    nil
  end
end

NabeAtsu.run

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

 |