# frozen_string_literal: true require 'optparse' COLUMNS = 3 def run listed_filenames = list_filenames filenames_matrix = slice_filenames(listed_filenames) filled_filenames = fill_filenames(filenames_matrix) arrange_filenames(filled_filenames) end def list_filenames params = ARGV.getopts('a', 'r', 'l') flags = params['a'] ? File::FNM_DOTMATCH : 0 params['l'] ? option_l : 0 filenames = Dir.glob('*', flags) if params['r'] filenames.reverse else filenames end end def permission list_filenames.each do |index| file_stat = File::Stat.new case file_stat.mode.to_s(8)[index] when '0' then print '---' when '1' then print '--x' when '2' then print '-w-' when '3' then print '-wx' when '4' then print 'r--' when '5' then print 'r-x' when '6' then print 'rw-' when '7' then print 'rwx' end end end def slice_filenames(listed_filenames) columns_size = listed_filenames.size.ceildiv(COLUMNS) listed_filenames.each_slice(columns_size).to_a end def fill_filenames(filenames_matrix) array_size = filenames_matrix.map(&:size).max filenames_matrix.each do |slice| slice << '' while slice.size < array_size end filenames_matrix.transpose end def arrange_filenames(filled_filenames) filenames_count = filled_filenames.flatten.map(&:size).max filled_filenames.each do |arrange| arrange.each do |arranged| print arranged.ljust(filenames_count + 5) end puts end end run