というわけで(id:heydays:20080508:1210235785)、模範解答を参考に閏年(Leap Year)判別コードを見直してみる。こうして見直してみると、プログラム初心者丸出しで恥ずかしいことこの上ないけど、そこら辺は気にしない気にしない。
Leap Years. Write a program which will ask for a starting year and an ending year, and then puts all of the leap years between them (and including them, if they are also leap years). Leap years are years divisible by four (like 1984 and 2004). However, years divisible by 100 are not leap years (such as 1800 and 1900) unless they are divisible by 400 (like 1600 and 2000, which were in fact leap years). (Yes, it’s all pretty confusing, but not as confusing has having July in the middle of the winter, which is what would eventually happen.)
この練習問題の僕の解答は以下だった。
puts 'Enter a start year.' sYear = gets.chomp puts '' puts 'Enter an end year.' eYear = gets.chomp puts '' if sYear > eYear puts 'An end year must be equal to or greater than a start year.' else puts 'The leap years between ' + sYear.to_s + ' and ' + eYear.to_s + ' are listed below.' puts '' while sYear.to_i != (eYear.to_i + 1) aYear = sYear.to_i % 4 bYear = sYear.to_i % 100 cYear = sYear.to_i % 400 if aYear == 0 if bYear != 0 puts sYear.to_s else if cYear == 0 puts sYear.to_s end end end sYear = sYear.to_i + 1 end end
そして、id:Kiskeさんの模範解答(id:Kiske:20070705:1183627478)は以下。
puts '開始年を入力.' from = gets.chomp.to_i puts '終了年を入力.' to = gets.chomp.to_i puts "#{from}年~#{to}年のうるう年一覧" while from <= to if (from % 4 == 0 and from % 100 != 0 or from % 400 == 0) puts from.to_s + '年' end from = from + 1 end
なるほどー。
こうして見ると、もう全然だめですな、僕のコードは。この練習問題のキーである閏年をいかに判別するか、っていうところが僕の書いたコードだと何かしつこい。
閏年は以下のルールから判別する。
- 4で割り切れる
- かつ、100で割り切れない
- 100で割り切れる場合、400で割り切れれば、閏年
これを、if文一行で書けるってことに気付かなかった。勉強になりました。
あと、『gets.chomp』を『gets.chomp.to_i』とすることで、変数に入力した文字列を数(Integer)として扱うことができる、っていうのも気付かなかったなあ。なるほど。
というわけで、僕の書いたコードを上記模範解答を参考にして、書き換えてみる。
puts 'Enter a start year.' sYear = gets.chomp.to_i puts '' puts 'Enter an end year.' eYear = gets.chomp.to_i puts '' if sYear > eYear puts 'An end year must be equal to or greater than a start year.' else puts 'The leap years between ' + sYear.to_s + ' and ' + eYear.to_s + ' are listed below.' puts '' while sYear <= eYear if (sYear % 4 == 0 and sYear % 100 != 0 or sYear % 400 == 0) puts sYear.to_s end sYear = sYear + 1 end end
んー、シンプル。
Many thanks to id:Kiske