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)
# 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)
ええー!? (スコア:1)
すみません。shuffle の部分は、koufuu さんのと比べて 1/10 の性能しか出ません。
それに、カプセル化もできていない内臓さらけ出し系の横着インタフェースなので、ぼそぼそ...
-- cooper
Re:ええー!? (スコア:1)
えーと、こちらこそ勝手にパクッちゃって、すみません。
いくら夏とはいえ、内臓さらけ出しでは怖いので、
お行儀の良さげな姿に直しておきます。
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