【日付セット】> 曜日(large) (paizaランク B 相当) [難易度: 1850 ±26]
※リンク先へ移動するためには[paiza]へのログインが必要です。
西暦y年m月d日が何曜日か表示してください。
ただし、各月の日数は以下のように決まることに注意してください。
・4, 6, 9, 11月は30日
・2月は閏年ならば29日、そうでなければ28日
・それ以外の月は31日
ただし、閏年は次のような年のことをいいます。
・西暦が4で割り切れる年は閏年
・ただし、100で割り切れる年は平年
・ただし、400で割り切れる年は閏年
ただし、1800年1月1日は水曜日です。
入力値(例)
2019 4 9
出力値(例)
火曜日
解答例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php list($y, $m, $d) = explode(" ", trim(fgets(STDIN))); $Zeller = function($y, $m, $d, $flg = false) { if($m <= 2) { $m += 12; $y -= 1; } $wd = array("日", "月", "火", "水", "木", "金", "土"); $g = ($y+(int)($y/4)-(int)($y/100)+(int)($y/400)+(int)(((13 * $m) +8)/5)+$d)%7; return $flg ? sprintf("%s曜日\n", $wd[$g]) : $g; }; printf($Zeller($y, $m, $d, true)); ?> |
別解
YouTubeの問題解説動画(https://www.youtube.com/watch?v=492L9rE95uo)からPHPに書き起こしました。PHPだとlong型が使えないので、タイムオーバー回避を使っています。
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
<?php list($year, $month, $day) = explode(" ", trim(fgets(STDIN))); $year = $year % 400 + 2000; //タイムオーバー回避用:400年おきだと曜日は変わらない function isLeap($year) { return $year % 400 == 0 || $year % 100 != 0 && $year % 4 == 0; } function lastDay($year, $month) { switch($month) { case 2: if (isLeap($year)) { return 29; } else { return 28; } case 4: case 6: case 9: case 11: return 30; default: return 31; } } function nextDate($year, $month, $day) { $day++; if ($day > lastDay($year, $month)) { $day = 1; $month++; } if ($month > 12) { $month = 1; $year++; } return $a = array($year, $month, $day); } function countDay($year, $month, $day) { $y = 1800; $m = 1; $d = 1; $count = 0; while (!($y == $year && $m == $month && $d == $day)) { //1日ずつ先に進める $date = nextDate($y, $m, $d); $y = $date[0]; $m = $date[1]; $d = $date[2]; $count++; } return $count; } // 1800年1月1日(水)から数えて、y年m月d日が何日先か $count = countDay($year, $month, $day); // 0:水 1:木 2:金 3:土 4:日 5:月 6:火 7:水(0と同じ) $days_of_week = array("水", "木", "金", "土", "日", "月", "火"); printf("%s曜日", $days_of_week[$count % 7]); ?> |