rubyでチンチロ

#Rubyでチンチロのプログラムを考えたときのメモ

### 構造化
```ruby:chinchiro1.rb
dices = []
3.times{
 dices << (1..6).to_a.sample
}
dic = Hash.new(0)
dices.each{|x|
 dic[x] += 1
}
dic=dic.sort{|x,y| x[1]<=>y[1]}
output = ""
output << dic[0][0] if dic.size<3
output << " ゾロ" if dic.size==1 
output << " の目" if dic.size==2
output << "目無し" if dic.size==3
```

### 暫定
```ruby:chinchiro2.rb
dic=3.times.reduce(Array.new){|arr,x| arr<<(1..6).to_a.sample}.reduce(Hash.new(0)){|hash,a| hash[a] +=1; hash}.sort{|x,y| x[1]<=>y[1]}
puts (dic.size<3?String(dic[0][0]):"")+" "+["ゾロ","の目","目無し"][dic.size-1]
```
1行にならないものか

###
皆様の指摘を参考に。
後回しにしていたものを含めて改めてルールを
* さいころを3個振る
* 出目が3つともXの場合は "Xゾロ" と表示する
* 出目が2つ同じ場合、残りの1つの目Xを使用して "Xの目" と表示する
* 出目がバラバラの場合は"目無し"とする
* ただし目無しであっても、出目の組み合わせが4,5,6の場合"シゴロ"と表示する
* ただし目無しであっても、出目の組み合わせが1,2,3の場合"ヒフミ"と表示する

```ruby:chinchiro4.rb
 3.times.map{rand(6)+1}.reduce(Hash[(1..6).to_a.zip([0]*6)]){|h,a| print "[#{a}]"; h[a]+=1;h}.sort_by{|x| x[1]}.tap{|x| puts [0," #{x[0][1]} ゾロ"," #{x[0][0]} の目",(([x[0][0],x[1][0],x[2][0]].sort==[4,5,6])?" シゴロ":(([x[0][0],x[1][0],x[2][0]].sort==[1,2,3])?" ヒフミ":" 目無し"))][x.count{|k,v| v!=0}]}
```
todo: 重複している部分が多いので、短くするのと、1行じゃなくてもっときれいにしたバージョンを書く

```ruby:chinchiro5.rb
class Chinchiro
        def initialize
                @deme = [0,0,0]
        end

        def playDice
                @deme=3.times.reduce(Array.new){|a,x| a<<rand(6)+1}
        end

        def deme
                @deme
        end

        def setDeme(dices)
                @deme = dices
        end

        def judge
                if @deme==[0,0,0]
                        return Hands::NONE
                end
                @deme.sort!
                if @deme==[1,2,3]
                        return Hands::HIFUMI
                end
                if @deme==[4,5,6]
                        return Hands::SHIGORO
                end
                meCounts = @deme.reduce(Hash.new(0)){|hash,me|
                        hash[me]+=1
                        hash
                }.sort_by{|x| x[1]}
                if meCounts.size==1
                        return 10 + meCounts[0][0]
                end
                if meCounts.size==2
                        return meCounts[0][0]
                end
                Hands::NONE
        end

        def print_judge(j)
                case j
                when 0
                        result = "目無し"
                when 1..6
                        result = "#{j}の目"
                when 11..16
                        result = "#{j-10}ゾロ"
                when -1
                        result = "ヒフミ"
                when 20
                        result = "シゴロ"
                else
                        result=""
                end
                result
        end

        def play
                j=0
                3.times{
                        self.playDice
                        j=self.judge
                        p self.deme
                        p self.print_judge j
                        if j!=0
                                break
                        end
                }
                return self.deme,j
        end
end

module Hands
        NONE = 0
        HIFUMI = -1
        ONE = 1
        TWO = 2
        THREE = 3
        FOUR = 4
        FIVE = 5
        SIX = 6
        ZORO1 = 11
        ZORO2 = 12
        ZORO3 = 13
        ZORO4 = 14
        ZORO5 = 15
        ZORO6 = 16
        SHIGORO = 20
end

ccr = Chinchiro.new
p ccr.play
```