パスワードを忘れた? アカウント作成
668107 journal

tsykの日記: trump.rb 2

日記 by tsyk
# kurokuma氏の日記 (C++) ← これが起源 (mera氏,kamogawa氏が参戦)
# http://srad.jp/journal.pl?op=display&uid=14628&id=144878
# ↓こちらに伝播
# Katuragi氏の日記 (Objective-C)
# http://srad.jp/journal.pl?op=display&uid=13740&id=144984
# ↓伝播するする
# sentakuita氏の日記 (bash)
# http://srad.jp/journal.pl?op=display&uid=10153&id=145032
# ↓さらに伝播
# cooper氏の日記 (C++)
# http://srad.jp/journal.pl?op=display&uid=4658&id=145208
# …そして、
# ↓cooper氏のC++版を忠実に再現したRuby版をコソーリと書いてみるテスト

module SlashdotJapan

  class Trump

    Units = 13
    Figures = 4
    Jokers = 2
    Pack = Units * Figures + Jokers

    Spades, Hearts, Clubs, Diamonds, Joker = 0, 1, 2, 3, 4

    def initialize
      srand
    end

    def shuffle(result)
      appeared = Array.new(Pack, false)
      result.clear
      while result.size < Pack do
        val = rand(Pack)
        if !appeared[val]
          result.push(val)
          appeared[val] = true
        end
      end
    end

    def dump(cards)
      number = [
        "*** JOKER ***",
        "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
        "Jack", "Queen", "King"
      ]
      figure = [
         "Spades", "Hearts", "Clubs", "Diamonds", "a Pack"
      ]
      cards.each {|card|
        puts number[getNumber(card)] + " of " +
             figure[getKind(card)]
      }
    end

    def getKind(val)
      if (0 < val && val + 1 < Pack)
        (val - 1) / Units
      else
        Joker
      end
    end

    def getNumber(val)
      if getKind(val) != Joker
        (val - 1) % Units + 1
      else
        0
      end
    end

  end

end

cards = SlashdotJapan::Trump.new
result = Array.new
cards.shuffle(result)
cards.dump(result)
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by cooper (4658) on 2003年08月02日 13時22分 (#370746) 日記
    ( ̄□ ̄;

    すみません。shuffle の部分は、koufuu さんのと比べて 1/10 の性能しか出ません。
    それに、カプセル化もできていない内臓さらけ出し系の横着インタフェースなので、ぼそぼそ...
    --

    -- cooper

    • by tsyk (10158) on 2003年08月02日 16時45分 (#370790) 日記
      ( ̄ー ̄)ふっふっふっ
      えーと、こちらこそ勝手にパクッちゃって、すみません。
      いくら夏とはいえ、内臓さらけ出しでは怖いので、
      お行儀の良さげな姿に直しておきます。

      C:\TEMP>diff -u trump.rb trump2.rb
      --- trump.rb    2003-08-02 16:22:19.000000000 +0900
      +++ trump2.rb    2003-08-02 16:19:52.000000000 +0900
      @@ -11,21 +11,17 @@

           def initialize
             srand
      +      @cards = (0...Pack).to_a
           end

      -    def shuffle(result)
      -      appeared = Array.new(Pack, false)
      -      result.clear
      -      while result.size < Pack do
      -        val = rand(Pack)
      -        if !appeared[val]
      -          result.push(val)
      -          appeared[val] = true
      -        end
      -      end
      +    def shuffle
      +      @cards.each_index {|i|
      +        r = rand(Pack)
      +        @cards[i], @cards[r] = @cards[r], @cards[i]
      +      }
           end

      -    def dump(cards)
      +    def dump
             number = [
               "*** JOKER ***",
               "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
      @@ -34,7 +30,7 @@
             figure = [
                "Spades", "Hearts", "Clubs", "Diamonds", "a Pack"
             ]
      -      cards.each {|card|
      +      @cards.each {|card|
               puts number[getNumber(card)] + " of " +
                    figure[getKind(card)]
             }
      @@ -61,6 +57,5 @@
      end

      cards = SlashdotJapan::Trump.new
      -result = Array.new
      -cards.shuffle(result)
      -cards.dump(result)
      +cards.shuffle
      +cards.dump
      親コメント
typodupeerror

にわかな奴ほど語りたがる -- あるハッカー

読み込み中...