八卦黑客松 Run 起來!
#!/usr/bin/ruby
# 輸入
input = [1, 4, 6]
# 計算特徵
def calc_pattern(input)
sum = 0
input.each do |exp|
# 把 input 每一個都拿來當指數乘,算總合。
sum += 2 ** ((exp - 1) % 6)
end
sum
end
# 旋轉演算法
def circle_shift(input, max=6)
target = input
output = []
max.times do |time|
# 往左推一下。
target <<= 1
# 找頭 bit。
top_bit = (2 ** max & target) / (2 ** max)
# 頭 bit 加回去推過的數字。
target += top_bit
# 然後再砍頭。
target -= 2 ** max * top_bit
# 收集這些計算後的整數。
output << target
end
output
end
# 餘數分整數
def separate(input)
output = []
cursor = 1
target = input
until target < 1
output << cursor if target % 2 == 1
cursor += 1
target /= 2
end
output
end
# 執行程式並收集未排序的列表。
unsorted = []
circle_shift(calc_pattern(input)).each do |set|
unsorted << separate(set)
end
# 不要計較排序演算法了!直接從後面排回前面。
unsorted.sort_by {|array| array[2]}
.sort_by {|array| array[1]}
.sort_by {|array| array[0]}.each do |set|
p set
end
# 執行結果:
#=> [1, 2, 5]
#=> [1, 3, 4]
#=> [1, 4, 6]
#=> [2, 3, 6]
#=> [2, 4, 5]
#=> [3, 5, 6]