13日の金曜日を数え上げる(LL Future Golf)
ふと、ブログ巡回してたら、ちょっち気になる記事を見つけた。
ほうほう、LL FutureでLL Golfなる企画をやってるのか。どれどれいっちょ試してみっかーと思って、ふとみた問題。
404 Not Found
なるほど、今日から20013年末までの13日の金曜日を数えればよいわけd・・・・・200・・・・
20013年!?
ふむ。
これは楽しそうな課題なのでやってみた(ぉ
ソースコード
<?php for($d = new DateTime(), $d->setDate($d->format("Y"), $d->format("m"), 13), $end = new DateTime("9999-12-31"), $end->modify("+10014 year"), $i = 0; $d->format("U") < $end->format("U"); $d->modify("+1 month")) { if ($d->format("w") == 5) { echo $d->format("Y/m/d (金)") ."\n"; $i++; } } echo "\n総数:$i\n";
実行結果
2009/02/13 (金) 2009/03/13 (金) 2009/11/13 (金) 2010/08/13 (金) 2011/05/13 (金) 2012/01/13 (金) 2012/04/13 (金) 2012/07/13 (金) 2013/09/13 (金) 2013/12/13 (金) (中略) 5268/07/13 (金) 5269/09/13 (金) 5269/12/13 (金) 5270/06/13 (金) 5271/02/13 (金) 5271/03/13 (金) 5271/11/13 (金) 5272/05/13 (金) 5273/01/13 (金) 5273/10/13 (金) 5274/04/13 (金) 5274/07/13 (金) 5275/09/13 (金) 5275/12/13 (金) 5276/03/13 (金) (中略) 10009/02/13 (金) 10009/03/13 (金) 10009/11/13 (金) 10010/08/13 (金) 10011/05/13 (金) 10012/01/13 (金) 10012/04/13 (金) 10012/07/13 (金) 10013/09/13 (金) 10013/12/13 (金) (中略) 20009/03/13 (金) 20009/11/13 (金) 20010/08/13 (金) 20011/05/13 (金) 20012/01/13 (金) 20012/04/13 (金) 20012/07/13 (金) 20013/09/13 (金) 20013/12/13 (金) 総数:30970
思うこと
ひとつ。
DateTimeオブジェクトのコンストラクタでは 10013-12-31 などと1万を超えるヤツは指定できない。どうやら、9999-12-31までしかだめなようだ。
でも、modifyでは1万以上の数字もバリバリOK。ということで、9999で初期化して+10014するというカンジにした。
ふたつ。
DateTimeオブジェクトで初期化して、その年・月を変えずに日を変えたいときなど、
$d->setDate($d->format("Y"), $d->format("m"), 13)
こんなウザったいことをしなきゃいけないのだろうか。なんかウザったいなほんと。それとも私が知らないだけ?
みっつ。
DateTimeオブジェクトは優秀。人類が滅びても、PHPは劣化しません。 (元ネタ:[PHP-users 33716] プログラムが劣化することはあるのでしょうか)
よっつ。
ていうか、今日がその月の13日以降だった場合だめなプログラム(ダメじゃん
いつつ。
ネタですよ。確信犯です。なのでどうかくに投稿せずにブログに投稿w
追記
そのいち。
総数かぞえてなかったよ>< ということで追記したよ>< → さらに間違ってたから修正したよ!!w
そのに。
しまったああ!ネタばっかり考えてたらGolfだってことわすれてたよ!!!!しらない!
そのさん。
しまったあああ!ネタなのに 20013のところ 10013 にしてしまうというボンミス!!!ネタの一番大事なところを間違えるだなんて・・・orz →修正。つか2万年でもぜんぜんイケましたPHP。