Skip to content

Instantly share code, notes, and snippets.

@takehiko
Created April 30, 2016 10:31
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 takehiko/adaf6a6d3b7cd3f5b3dcd96969322a43 to your computer and use it in GitHub Desktop.
Save takehiko/adaf6a6d3b7cd3f5b3dcd96969322a43 to your computer and use it in GitHub Desktop.
Member generator for trigonal human pyramids
#!/usr/bin/env ruby
# gfsupport.rb : Member generator for trigonal human pyramids
# by takehikom
class GFSupport
def initialize(lev)
@level = lev.to_i
raise if @level < 2
end
def start
generate_member
print_result
end
def generate_member
@member = []
@queue = ["1.1.1"]
puts "トップの人は…#{@queue.first}"
until @queue.empty?
s = @queue.shift
@member << s
i, j, k = s.split(".").map {|item| item.to_i}
case i
when 1
q_add = ["2.1.1", "2.1.2"]
when @level
q_add = []
puts "#{s}は土台です。" if $DEBUG
when @level - 1
q_add = [
[i + 1, j, k],
[i + 1, j, k + 1]
].map {|a| a.join(".")}
else
q_add = [
[i + 1, j, k],
[i + 1, j, k + 1],
[i + 2, j + 1, k],
[i + 2, j + 1, k + 1]
].map {|a| a.join(".")}
end
if !q_add.empty?
print_dep(s, q_add)
add_to_queue(q_add)
end
end
end
def print_result
puts "level: #{@level}"
puts "persons: #{@member.size}"
puts "unsorted: #{@member.inspect}"
puts "sorted: #{member_sorted.inspect}"
end
def print_dep(s1, s2_a)
puts "#{s1}を支えるのは…#{s2_a.join(', ')}"
end
def add_to_queue(a)
a.each do |s|
if @member.index(s)
puts "#{s}は処理済みです。" if $DEBUG
elsif @queue.index(s)
puts "#{s}はすでにキューに入っています。" if $DEBUG
else
@queue << s
puts "#{s}をキューに追加します。" if $DEBUG
end
end
end
def member_sorted
@member.sort_by {|s| "%4s%4s%4s" % s.split(".").map {|item| item.to_i}}
end
end
if __FILE__ == $0
GFSupport.new(ARGV.shift || 7).start
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment