« Project Euler - Problem 53 : 0.1s (Ruby 1.9) | トップページ | Project Euler - Problem 55, 56 »

2009年8月14日 (金)

Project Euler - Problem 54

問題はこちらをご覧ください。


久しぶりにオブジェクト指向っぽいコードを書いてみました。

アルゴリズム自体はそんなに難しくなかったのですが、分岐が多くなって長いコードになってしまいました。

役が同じ場合の勝敗を決めるのがちょっと大変だったかな?

class Player def initialize @card_n = nil # 手札の数字の配列 @card_s = nil # 手札のスートの配列 @hand = nil # [役の番号, 役の配列, 残りの配列] end attr_reader :hand # == カードの整列、役の確定 def set(arr) @card_n = arr.map do |a| case a[0] when "A" 14 when "K" 13 when "Q" 12 when "J" 11 when "T" 10 else a[0].to_i end end @card_n.sort!.reverse! @card_s = arr.map{|a| a[1]}.uniq @hand = judge() end # == 役の判定 # * 役のランクと役の名前 # 0 : 役無し # 1 : ワン・ペア # 2 : ツー・ペア # 3 : スリーカード # 4 : ストレート # 5 : フラッシュ # 6 : フルハウス # 7 : フォーカード # 8 : ストレートフラッシュ # 9 : ロイヤルフラッシュ def judge # ストレート系およびフラッシュ系の判定 n_arr = @card_n.map.with_index{|v, i| v + i}.uniq if n_arr.size == 1 s_flag = true else s_flag = false end f_flag = (@card_s.size == 1) case when (f_flag and @card_n == [14, 13, 12, 11, 10]) return [9, @card_n, []] when (f_flag and s_flag) return [8, @card_n, []] when f_flag return [5, @card_n, []] when s_flag return [4, @card_n, []] end # その他の役の判定 count = Hash.new(0) @card_n.each do |n| count[n] = count[n] + 1 end nums = count.to_a.sort_by{|a| a[1]}.reverse! case when nums[0][1] == 4 return [7, [nums[0][0]], [nums[1][0]]] when (nums[0][1] == 3 and nums[1][1] == 2) return [6, [nums[0][0], nums[1][0]], []] when nums[0][1] == 3 n = nums[0][0] @card_n.delete(n) return [3, [n], @card_n] when (nums[0][1] == 2 and nums[1][1] == 2) n1 = nums[0][0] n2 = nums[1][0] @card_n.delete(n1) @card_n.delete(n2) return [2, [n1, n2].sort.reverse!, @card_n] when nums[0][1] == 2 n = nums[0][0] @card_n.delete(n) return [1, [n], @card_n] else return [0, @card_n, []] end end # == 勝敗の判定 def win?(other) rank1, arr1, rest1 = @hand rank2, arr2, rest2 = other.hand case when rank1 > rank2 return "win" when rank1 < rank2 return "lose" end arr1.each_with_index do |n, i| case when n > arr2[i] return "win" when n < arr2[i] return "lose" end end rest1.each_with_index do |n, i| case when n > rest2[i] return "win" when n < rest2[i] return "lose" end end return "draw" end end p1 = Player.new p2 = Player.new count = 0 File.open("poker.txt") do |file| file.each do |line| arr = line.chomp!.split p1.set(arr[0, 5]) p2.set(arr[5, 5]) count = count + 1 if p1.win?(p2) == "win" end end puts count

« Project Euler - Problem 53 : 0.1s (Ruby 1.9) | トップページ | Project Euler - Problem 55, 56 »

Project Euler」カテゴリの記事

Ruby」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/112020/45925344

この記事へのトラックバック一覧です: Project Euler - Problem 54:

« Project Euler - Problem 53 : 0.1s (Ruby 1.9) | トップページ | Project Euler - Problem 55, 56 »

2016年7月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            
フォト

最近のトラックバック

無料ブログはココログ