るびらな!

RubyをLearnする人の勉強記録。(超)弩(級の)素人なので、誰かダメさがわかる人に罵ってもらったりして、少しずつ知見を広げたいと思っています。

ITP1_1_D Watch

ここも押していただけると嬉しいです #=> にほんブログ村 IT技術ブログへ にほんブログ村 IT技術ブログ Rubyへ にほんブログ村 IT技術ブログ Ruby on Railsへ

AOJ第3日目! 今日も楽しくいってみましょう!

問題

今回の問題はこちら ->
時計 | プログラミング入門 | Aizu Online Judge

時計

秒単位の時間 S が与えられるので、h:m:s の形式へ変換して出力してください。ここで、h は時間、m は 60 未満の分、s は 60 未満の秒とします。

Input

S が1行に与えられます。

Output

h、m、s を :(コロン)区切りで1行に出力してください。数値が1桁の場合、0 を付けて2桁表示をする必要はありません。

Constraints

0≤S<86400


タイトルの通り、時計の計算をしようということですね。

3600で割り、余りを60で割り、という感じでいけるはず!

自分のコード

s = gets.to_i
h = (s/3600).floor
s = s%3600
m = (s/60).floor
s = s%60
print h,":",m,":",s,"\n"

最初に与えられたデータをsに入れておいて、

hにsを3600で割ったものの小数点以下を切り捨てたものを入れ、

sそのものを3600で割った余りに書き換え。

またmにsを60で割ったものの小数点以下を切り捨てたものを入れ、

sそのものを60で割った余りに書き換え。

最後に残ったsはそのまま秒になっている、という寸法です。


他の人のコード

さて、今回も、コードの長さが41 Bから911 Bまで様々なものがありますね…

長いのも短いのも見てみましょう!

長いコード

class Time
 
  # 1分の秒表記
  MINUTE_SECOND = 60
 
  #1時間の秒表記
  HOUR_SECOND = 3600
 
  def initialize(second)
    self.convertTimeFromSecond(second)
  end
 
  # 秒数を時・分・秒に変換してフィールドに格納します。
  def convertTimeFromSecond(second)
 
    # 渡された秒から時の計算をして余りを取得
    @hour = second / HOUR_SECOND
    surplus = second % HOUR_SECOND
 
    # 時計算の余りから分の計算をして余りを取得
    @minute = surplus / MINUTE_SECOND
    surplus = surplus % MINUTE_SECOND
 
    # 分計算の余りを秒に設定
    @second = surplus
  end
 
  def getHour()
    return @hour
  end
 
  def getMinute()
    return @minute
  end
 
  def getSecond()
    return @second
  end
 
end
 
timeInstance = Time.new(gets.chomp.to_i)
puts timeInstance.getHour.to_s + ":" + timeInstance.getMinute.to_s + ":" + timeInstance.getSecond.to_s

なるほど、クラスにまとめるパターンは大体長いコードになるけど、可読性は高くなる、と…

繰り返し使う処理ならクラスにまとめる気になるんですけど、

2度と使わない処理をクラスにまとめると、コードが長くなってしまうので

正直書くのが面倒…

いやいや、そんなことは言ってはいけないですね。

可読性の高いコードを書くことは、メンテナンス性の意味でも大事だと思います。

短いコード

さて、今度は逆に最も短い人のコード。

n=gets.to_i
puts [n/60/t=60,n/t%t,n%t]*":"

あ、これもうなんか完全に競技用のコードだ。

いかに少ない文字数で問題を解くか、って感じ。

ちょっと、時のところで

n/60/t=60

って、なんで2回目でtを置いたのかがよくわからないけど、

誰かエロい人いたら教えろください