Hatena::Grouprubyist

てーげーRuby

2008-08-21

練習問題 TimeとDate

| 14:49

(1) 「"2006年12月23日午後8時17分50秒"」といったように、

「年・月・日・分・秒」を使った時刻の文字列をTimeオブジェクトに

変換して返すメソッドjparsedateを定義してください。

def jparsedate(s)
  s=~/(\d+)年(\d+)月(\d+)日(午前|午後)(\d+)時(\d+)分(\d+)秒/
  Time.mktime($1,$2,$3,($4 == "午後")?$5.to_i + 12 : $5,$6,$7)
end
irb(main):005:0> jparsedate "2006年12月23日午後8時17分50秒"
=> Sat Dec 23 20:17:50 +0900 2006



# (2) Unixの「ls -t」コマンドのように、ディレクトリを指定するとそのディレクトリの下にある

# ファイルを時刻の順に並べるメソッドls_tを定義してください。

# このメソッドは引数を1つだけ取ります。

# ls_t(調べるディレクトリ名)

def ls_t(dirname)
  Dir.new(dirname).entries.sort do |a, b|
     File.new("#{dirname}/#{a}").mtime <=> File.new("#{dirname}/#{b}").mtime
  end.reverse.each do |e| puts e end
  return nil
end

ドットファイルは抜いたほうがよさそうだ。




# (3) Dateクラスを使って今月の1日と月末の日付と曜日を求め、

# カレンダーを表示してください。

require 'date'
today = Date.today
month_first = Date.new(today.year, today.month, 1)
month_last = Date.new(today.year, today.month + 1, 1) -1
obj = month_first
i = 0
month_first.wday.times {printf("   ")}
printf("%3d", month_first.day)
while(true) do
  obj = obj.next
  printf("%3d", obj.day)
  printf("\n") if obj.wday == 6
  break if obj == month_last
end

# ruby cal.rb
                 1  2
  3  4  5  6  7  8  9
 10 11 12 13 14 15 16
 17 18 19 20 21 22 23
 24 25 26 27 28 29 30

2008年8月の可憐だー。

練習問題 ファイルとディレクトリ

| 14:43

# (1) $:には、Rubyが利用できるライブラリが置かれているディレクトリの

# 名前が、配列の形で格納されています。この変数を使って、Rubyが利用できる

# ライブラリのファイル名を、順に出力するメソッドprint_librariesメソッドを

# 定義してください。

print_libraries.rb

def traverse(dirname)
  Dir.entries(dirname).reject{|d| d =~ /^\.+$/}.each{|e|
    if File.directory?(dirname + '/' + e)
      traverse(dirname + '/' + e)
    else
      puts e
    end
  }
  return nil
end

def print_libraries
  $:.reject{|d| d =~ /^\.+$/}.each{|e| traverse(e)}
  return nil
end

if __FILE__ == $0
  print_libraries
end

# (2) Unixコマンドのduコマンドのように、ファイルとディレクトリに保存

# されているデータの大きさを再帰的に掘り下げて表示するメソッドduを定義

# してください。

# このメソッドは引数を1つだけ取ります。

# du(調べるディレクトリ名)

def du(dirname, sum=0)
  entries = Dir.entries(dirname).reject{|d| d =~ /^\.+$/}

  entries.each{|e|
    if File.directory?(dirname  + '/' + e)
      sum += du(dirname + '/' + e) 
    else
      #printf("%10d %s\n", (File.stat(dirname + '/' + e).size)/1024, dirname + '/' + e)
      sum += File.stat(dirname + '/' + e).size
    end
  }
  sum += File.stat(dirname).size
  printf("%10d %s\n", sum/1024, dirname)
  return sum
end

Unixコマンドのduコマンドとデータの大きさが合わない・・

rochefortrochefort2008/10/26 10:42linuxのduはブロック単位だからでしょうかねー