人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

一部の方々にご好評(?)頂いたので第二回です。

Rubyのプログラムで今月「日曜日」が何回あるのか教えてください。(「今月」はプログラム実行時のシステム時間でかまいません)

前回(http://www.hatena.ne.jp/1128425886)同様、以下の要領でお願いします。
◎この質問は、プログラムの書き方がわからないのではなく「こんな書き方もできる」の募集です。
◎面白いプログラム、とても短いプログラム、トリッキーなもや勉強になるものは喜ばしいです。
◎このプログラムが役立つ場面は想像できません :-P
◎Rubyがダメな人はRuby以外でも可

●質問者: taka4
●カテゴリ:コンピュータ
✍キーワード:Ruby システム ダメ トリッキー プログラム
○ 状態 :終了
└ 回答数 : 13/13件

▽最新の回答へ

1 ● papa1214
●15ポイント

http://www.hatena.ne.jp/1128425886

人力検索はてな - 最近ちょっとした作業にRubyを使っています。 仕事で英数字から成るランダムな文字列を生成する必要があって、とりあえず英数字一覧の文字列を用意しようと思ったところ、..

4回です。

◎質問者からの返答

・・・質問の仕方が悪かったでしょうか?

答えが必要なのではなくて、プログラムを募集しています。

それに、今月の日曜は5回だと思いますが・・・


2 ● くまっぷす
●15ポイント

http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=Time

Rubyリファレンスマニュアル - Time

あいかわらず全然面白くない例ですみません。


t = Time.now.localtime

yd = Time.local(t.year, 12, 31).yday

if yd == 365 and t.mon == 2 then # Uruu ja nai toshi 2-gatsu

answer = 4

else

t2 = Time.local(t.year, t.mon, 1)

if yd == 366 and t.mon == 2 then # Uruu doshi 2-gatsu

if t2.wday == 0 then answer = 5

else answer = 4

end

else if [4,6,9,11].include?(t.mon) then # Shou no tsuki

if t2.wday == 0 or t2.wday == 6 then answer = 5

else answer = 4

end

else # Dai no tsuki

if [0,6,5].include?(t2.wday) then answer = 5

else answer = 4

end

end

end

end

p t,answer


まず閏年でないときの2月は必ずどの曜日も4回なので先に除外。

閏年の2月は1日が日曜日のときだけ日曜日が5回。

残りの小の月(4,6,9,11)の場合は1日が土曜か日曜の場合のみ5回日曜がある。

大の月の場合は1日が金・土・日の場合だけ5回日曜がある。

なんかwdayの処理あたりがださいか。

◎質問者からの返答

けっこう長くなりましたね。

・・・ちょっと私も自分で書いてみよう・・

書いてみました>http://d.hatena.ne.jp/nisyu/20051012/1129126889

アプローチがだいぶ違いますネ。面白いです。


3 ● t-wata
●15ポイント

http://www.python.jp/

面白そうなのでpythonで書いてみました。


from datetime import date

import calendar

today = date.today()

answer = 0

for i in calendar.monthcalendar(today.year, today.month):

if i[6]: answer += 1


print answer


pythonのcalendar.monthcalendarは、1週間ごとの日付の配列を1ヶ月分返します。例えば、今月なら、

[[0, 0, 0, 0, 0, 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], [31, 0, 0, 0, 0, 0, 0]]

こんな感じ。forで1週間ごと取り出して、6番めの値が0以外なら、日曜が存在するので1加算する、といった方法で求めています。

◎質問者からの返答

コレはシンプルですね。すごいです!


4 ● いわどん
●15ポイント

http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=Date

Rubyリファレンスマニュアル - Date

require ”date”

d = Date.today

d -= d.day - 1;

p((d...(d>>1)).find_all {|i| i.wday.zero?}.size)

# => 5


http://d.hatena.ne.jp/nisyu/20051012/1129126889

と同じことですが、Dateオブジェクトを多用してみました。もっとうまく書けそうな気がします。

◎質問者からの返答

ほんとですね!「d -= d.day - 1;」とか「.find_allのsizeで調べる」とか全く思いつきませんでした。スゴイ。ありがとうございます。


5 ● くまっぷす
●15ポイント

http://www.ruby-lang.org/ja/man/?cmd=view;name=Date

Rubyリファレンスマニュアル - Date

そか、Dateライブラリとか使えばよかったか。あと、数えたほうが簡単ですね。

ということでこんな感じ。


require ’date’


d = Date.new(Date.today.year, Date.today.mon, 1)

ans = 0

d.upto((d >> 1) - 1){|dd| if dd.wday == 0 then ans = ans+1 end }

p ans


その月の1日と最後の日までをなめて日曜ならansをカウントアップ

◎質問者からの返答

直感的になにをやっているかがわかりやすいプログラムになってますね。気持ちいいです。

ありがとうございます。


1-5件表示/13件
4.前の5件|次5件6.
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ