質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

1回答

350閲覧

pythonでの正しい曜日や日数差が出力されるプログラム作成

k.lolo

総合スコア4

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2022/05/23 15:55

「うるう年」と「1981年1月1日の曜日」を考慮して,正しい曜日や日数差が出力されるよう書き換えてください。という課題があるのですが難しくて分からないです。
助けていただけませんか?
以下のコードを下の条件やヒントをもとに書き換えるみたいです。

・条件
1981年1月1日から2080年12月31日までに限定すると,西暦年号が4で割り切れる年はうるう年である.

1981年1月1日は木曜日である.

【ヒント】

うるう年は年間日数が1日多いので,1981年からある年の前年までにうるう年がn回あったとすると,その年の1月1日までの日数はn日増え,曜日もnだけずれることになる. nの値は,1981年からの年数の差が4となる1985年に1,8となる1989年に2,...と4年ごとに1つずつ増えていくので,1981年からある年までの年数を4で割ればnを求めることができる.

ある年がうるう年であるかどうかは,その西暦年号が4で割り切れるかどうかで調べることができる.うるう年だと,3月以降は,その年の1月1日からの日数が1日増え,曜日も1つずれることになる.

「課題5-2」までは簡単のため「1981年1月1日は日曜日」としていたが,ここでは,実際の暦どおり「木曜日」としている.日曜日と木曜日では曜日としての差は「4」と考えることができる.そこで,まずは今まで通りに曜日を求め,その上で曜日を4つずらせば...

入力例

19810101
20220523
出力例

Target Thursday
Today Monday
Delta is 15117 day(s)
入力例

20200229
20200301
出力例

Target Saturday
Today Sunday
Delta is 1 day(s)

year_month_day = input() year_month_day = int(year_month_day) today_year_month_day = input() today_year_month_day = int(today_year_month_day) def calc_daycount_and_dayofweek(year_month_day, today_year_month_day): month = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30,31] day_week = ['Saturday', 'Friday', 'Tursday', 'Wednesday', 'Tuesday', 'Monday', 'Sunday'] quotient1 = year_month_day // 100 // 100 quotient2 = today_year_month_day // 100 // 100 remainder1 = year_month_day % 100 remainder2 = year_month_day // 100 % 100 remainder3 = today_year_month_day % 100 remainder4 = today_year_month_day // 100 % 100 if quotient1 > quotient2: daycount = (quotient1 - quotient2) * 365 + (sum((month[:remainder2])) + remainder1) -1 elif quotient2 > quotient1: daycount = (quotient2 - quotient1) * 365 + (sum((month[:remainder4])) + remainder3) -1 dayofweek = day_week[- daycount % 7] return (daycount, dayofweek) def output_result(days_weeks): print('Target', days_weeks[1]) print('Today', 'Monday') print(f'Delta is {days_weeks[0]} day(s)') days_weeks = calc_daycount_and_dayofweek(year_month_day, today_year_month_day) output_result(days_weeks) コード

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2022/05/24 01:42

同じ質問三つ目
guest

回答1

0

python

1import calendar 2 3def is_leap_year(y): return not (y % 4) 4 5def days_of_month(y): 6 return [31, 28+is_leap_year(y), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] 7 8DAY_OF_WEEK = [calendar.day_name[(i+3)%7] for i in range(7)] 9 10def calc_daycount_and_dayofweek(b, e): 11 if b > e: b, e = e, b 12 (b_y, b_r), (e_y, e_r) = divmod(b, 10000), divmod(e, 10000) 13 b_m, e_m = b_r // 100 - 1, e_r // 100 - 1 14 b_d, e_d = b_r % 100, e_r % 100 15 if b_y == e_y: 16 if b_m == e_m: 17 daycount = e_d - b_d 18 else: 19 daycount = sum(days_of_month(b_y)[b_m+1:e_m]) + \ 20 days_of_month(b_y)[b_m] - b_d + e_d 21 else: 22 daycount = sum(days_of_month(b_y)[b_m+1:]) + days_of_month(b_y)[b_m] - b_d 23 daycount += sum(365 + is_leap_year(y) for y in range(b_y+1, e_y)) 24 daycount += sum(days_of_month(e_y)[:e_m]) + e_d 25 26 return daycount 27 28def output_result(begin, end): 29 print('Target', DAY_OF_WEEK[calc_daycount_and_dayofweek(19810101, begin)%7]) 30 print('Today', DAY_OF_WEEK[calc_daycount_and_dayofweek(19810101, end)%7]) 31 print(f'Delta is {calc_daycount_and_dayofweek(begin, end)} day(s)') 32 33if __name__ == '__main__': 34 day_range = [ 35 [19810101, 20220523], 36 [20200229, 20200301], 37 ] 38 for r in day_range: 39 output_result(*r)

投稿2022/05/23 18:38

編集2022/05/23 19:52
melian

総合スコア19769

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k.lolo

2022/05/24 00:57

ご回答ありがとうございます。 calendarは使わないようにお願いできますでしょうか?また、2つともにどの年月日を入力してもその二つともの曜日、日数差が出るようにお願いいたします。
melian

2022/05/24 01:04

calendar は曜日の名前を作成するためだけに使っていますのでリテラルに置き換えてください(木曜日から始まるリストです)。 > 二つともの曜日、日数差が出るように 既にその様になっています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問