ITP1_1_D Watch
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を置いたのかがよくわからないけど、
誰かエロい人いたら教えろください