Skip to content

Instantly share code, notes, and snippets.

@takeshy
Created April 6, 2010 05:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save takeshy/357258 to your computer and use it in GitHub Desktop.
Save takeshy/357258 to your computer and use it in GitHub Desktop.
#!/usr/bin/ruby
SHUNTSU_PATTERN = [
[1,2,3],[2,3,4],[3,4,5],[4,5,6],[5,6,7],[6,7,8],[7,8,9],
[1,2,3],[2,3,4],[3,4,5],[4,5,6],[5,6,7],[6,7,8],[7,8,9],
[1,2,3],[2,3,4],[3,4,5],[4,5,6],[5,6,7],[6,7,8],[7,8,9],
[1,2,3],[2,3,4],[3,4,5],[4,5,6],[5,6,7],[6,7,8],[7,8,9]
]
KOUTSU_PATTERN = [[1,1,1],[2,2,2],[3,3,3],[4,4,4],[5,5,5],[6,6,6],[7,7,7],[8,8,8],[9,9,9]]
ATAMA_PATTERN = [[1,1],[2,2],[3,3],[4,4],[5,5],[6,6],[7,7],[8,8],[9,9]]
MAX_HAIPAI = 14
MAX_HAI = 4
MAX_NUMBER = 9
$kumiawase = {};
def haipai_add(haipai,hai)
if haipai.size + hai.size > MAX_HAIPAI
throw "count > #{MAX_HAIPAI}"
end
hai_num_array = []
(haipai+hai).each do |i|
if !hai_num_array[i]
hai_num_array[i] = 1
elsif hai_num_array[i] >= MAX_HAI
throw "hai:#{i} > #{MAX_HAI}"
else
hai_num_array[i]+=1
end
end
haipai_with_hai = []
(1 .. MAX_NUMBER).each do |i|
next unless hai_num_array[i]
hai_num_array[i].times do |n|
haipai_with_hai.push i
end
end
return haipai_with_hai
end
def kumiawase(array,num)
answer = []
return nil if array.size == 0 or num == 0
(0 .. (array.size - num)).each do |i|
ret = kumiawase(array[(i+1) .. -1],num - 1)
if ret
ret.each do |r|
r.unshift(array[i])
end
else
ret = [[array[i]]]
end
answer += ret
end
return answer
end
agari_set = []
ATAMA_PATTERN.each do |atama|
haipai_set = kumiawase(KOUTSU_PATTERN + SHUNTSU_PATTERN,4)
haipai_set.each do |haipai|
begin
agari = haipai_add(haipai.flatten,atama)
agari_str = agari.join("")
unless $kumiawase[agari_str]
$kumiawase[agari_str] = true
agari_set.push agari
end
rescue =>err
next
end
end
end
p agari_set.size
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment