fjord/ls.rb
2024-04-11 21:51:53 +09:00

56 lines
1.4 KiB
Ruby

# frozen_string_literal: true
items = []
NUM_COLUMNS = 3 # 列幅の最大数
def main(items)
taken_items = take_items(items)
sliced_items = slice_items(taken_items)
sorted_items = sort_items(sliced_items)
display_items(sorted_items)
end
def take_items(items)
items.concat(Dir.glob('*'))
end
def slice_items(taken_items)
order_id = if (taken_items.size % NUM_COLUMNS).zero?
taken_items.size / NUM_COLUMNS.ceil # NUM_COLUMNSの倍数の時だけ、NUM_COLUMNSで割り込む
else
taken_items.size / NUM_COLUMNS.ceil + 1 # 最大NUM_COLUMNS列に収める
end
taken_items.each_slice(order_id).to_a
end
def sort_items(sliced_items)
if (0..NUM_COLUMNS).cover?(sliced_items.flatten.size)
sliced_items.flatten
else
max_size = sliced_items.map(&:size).max
sliced_items.each do |item| # サブ配列の要素数を揃える
item << nil while item.size < max_size
end
end
sliced_items.transpose
end
def display_items(sorted_items)
max_word_count = sorted_items.flatten.compact.map(&:size).max
if (0..NUM_COLUMNS).cover?(sorted_items.flatten.size)
sorted_items.flatten.map do |item|
print item.to_s.ljust(max_word_count + 5)
end
puts
else
sorted_items.each do |items|
items.compact.each do |item|
print item.ljust(max_word_count + 5)
end
puts
end
end
end
main(items)