diff --git a/ls.rb b/ls.rb new file mode 100644 index 0000000..459d4a5 --- /dev/null +++ b/ls.rb @@ -0,0 +1,56 @@ +# 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)