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

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

ただいまの
回答率

90.50%

  • Python 3.x

    6405questions

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

Python3  時差表示 ゼロ埋め 計算 繰り返し処理

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 264

目標)

世界中で使えるTwitter のようなアプリをつくりたい。

投稿内容に投稿時刻を表示させたい。

ただ、世界中にいるユーザーがいるため、ユーザーの住んでいる場所によって表示される投稿時刻を修正したい。

例えば、東京(日本)に住んでいるユーザが現地時刻 19:38 に投稿した日記の時刻は、シンガポールに住んでいるユーザの画面では 21:38 と表示されなければなりません。
これは、日本の時刻がシンガポールの時刻よりもちょうど 2 時間進んでいるためです。なお、時間は 00:00 から 23:59 までの 24 時間制で表すものとします。

N 個の都市の時差を表す情報と、その中のある都市に住むユーザの日記の投稿時刻 (現地時間) が入力されるので
それぞれの都市に住むユーザの画面に表示される投稿時刻を出力するプログラムを作成して下さい。

入力される値
入力は以下のフォーマットで与えられます。

N
p_1 s_1
p_2 s_2

p_N s_N
q t

コード


'''
入力例2
27
howland -12
samoa -11
hawaii -10
alaska -9
california -8
arizona -7
texas -6
massachusetts -5
santiago -4
brasilia -3
greenland -2
verde -1
morocco 0
london 1
paris 2
athens 3
moscow 4
islamabad 5
astana 6
bangkok 7
hongkong 8
seoul 9
guam 10
kuril 11
southpole 12
nukualofa 13
tokelau 14
southpole 00:00

出力例2
00:00
01:00
02:00
03:00
04:00
05:00
06:00
07:00
08:00
09:00
10:00
11:00
12:00
13:00
14:00
15:00
16:00
17:00
18:00
19:00
20:00
21:00
22:00
23:00
00:00
01:00
02:00
'''

M = int(input())

data = [list(map(str, input().split())) for x in range(M)]
#print(data)
#型変換
data = [[x[0]] + [int(e) for e in x[1:]] for x in data]
#print(data)

c = list(map(str,input().split()))
#print(c)
place = c[0]

hour, minute = list(map(int, c[1].split(':'))) 
#print(hour)
#print(minute)


#居住地の世界標準時差を調査
for x in range(M):
    if place == data[x][0]:
            place_diff = data[x][1]
#print(place_diff)
#投稿された国の時刻とユーザーの居住国の時差を計算
for x in range(M):
    diff = data[x][1] - (place_diff)
#    print(diff)
    if diff >= 0:
        ans_hour = hour + diff
    else:
        ans_hour = hour - abs(diff)

    ans_hour = '{0:02d}'.format(ans_hour)
    #print(ans_hour)

#ゼロ埋めの時間表示
    ans_hour = str(ans_hour)
    print(ans_hour + ':' + str(minute))

質問

期待値を出力できましたが、皆様の率直な意見を頂戴したいです。
読みづらいや、わかりづらいなど、どんな意見でもいいので更なる成長のためにアドバイスいただきたいです。

追記 

皆さま貴重なご意見ありがとうございます。
その中で、hayataka様からオリジナルコードが誤っているとご指摘を受けました。
そのため、皆さまのアドバイスを参照にコードを再編集致しました。

ただ、ジャッジ結果によると、9/10 とういパーフエクトなロジックにはなりませんでした。
現状、理由を解明することができず、解決方法に正しいコードを載せるまで至っておりません。

前回の内容で、誤った内容を展開してしまし申し訳ございません。
今後、内容を精査し解決方法を更新できるよう努力致します。
取り急ぎ失礼致します。

コード

from collections import OrderedDict

n = int(input())

timezone_table = OrderedDict()
for _ in range(n):
    city, diff = input().split()
    timezone_table[city] = int(diff)

base_city, base_time = input().split()
base_hour, base_minute = map(int, base_time.split(':'))

standard_hour = (base_hour - timezone_table[base_city]) % 24
for diff in timezone_table.values():  
    ans_hour = (standard_hour + diff) % 24
    print("{0:02d}:{1}".format(ans_hour, base_minute))
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+3

読みやすさの点で言えば、変数名が意味をなさない点がすごくコードを読み辛くしていると思います。名付けは、個人的には永遠のテーマですが、そこさえ適切に出来ていればすごく読みやすくなる重要な要素です。

その次に如何に処理するか、特に入力データの読み込みの部分を改善すれば良いと思います。試しに自分でもそこの処理を描いてみましたが、LouiS0616さんとほとんど同じ書き方になりました。

from collections import OrderedDict


tzdict = OrderedDict()
for _ in range(int(input())):
    city, timediff = input().split()
    tzdict[city] = int(timediff)
city, local_HHMM = input().split()

ちなみにですが、同じになったという点は誰が書いても一緒というPythonのいい点だと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/28 22:48

    ご指導ありがとうございます。
    辞書の使い方勉強になりました!
    ありがとうございます。

    私のミスでオリジナルコードのロジックに誤りがありました。
    例題2でも正しく出力できるよう、コードを書きなおします。

    キャンセル

checkベストアンサー

+1

期待値を出力できたとのことなので、ロジックは正しいと信じてリファクタリングしました。

data = [list(map(str, input().split())) for x in range(M)]

str.split()の返り値はstrのリストなので、型変換不要です。[input().split() for x in range(M)]だけで構いません。

data = [[x[0]] + [int(e) for e in x[1:]] for x in data]

率直に言ってよくわかりません。xのlen()は2なので、data = [[x[0], int(x[1])] for x in data]で良いのでは。

上の二行はこうも書けます。

[(lambda x:[x[0], int(x[1])])(input().split()) for x in range(M)]

次。

c = list(map(str,input().split()))

これも型変換不要。

hour, minute = list(map(int, c[1].split(':'))) 

このunpacking使うなら実はlistは省略できます(複数の左辺値に代入する場合)。map(int, c[1].split(':'))と書けたりする。

for x in range(M):
    if place == data[x][0]:
            place_diff = data[x][1]

インデントが(泣) なにかと思ったら線形探索ですか。とりあえず、見つけたらbreakして良いのでは?

for x in range(M):
    if place == data[x][0]:
        place_diff = data[x][1]
        break

最初からOrderedDictに入れておくというのも考えましたが、さすがに面倒くさいので手を付けないでおきます。

次。

for x in range(M):
    diff = data[x][1] - (place_diff) # かっこ不要
    if diff >= 0: # 正ならそのまま足す
        ans_hour = hour + diff
    else: # 負なら絶対値を引く
        ans_hour = hour - abs(diff)
    # よってこれはただのans_our = hour + diffだ
    ans_hour = '{0:02d}'.format(ans_hour)
    ans_hour = str(ans_hour) # 不要
    print(ans_hour + ':' + str(minute)) # むしろここにformat入れてまとめたら? って言いたい。

これはこう。

for x in range(M):
    diff = data[x][1] - place_diff
    ans_hour = hour + diff
    print("{0:02d}:{1}".format(ans_hour, minute)) 

全体はこう。

M = int(input())

data = [(lambda x:[x[0], int(x[1])])(input().split()) for x in range(M)]

c = input().split()
hour, minute = map(int, c[1].split(':'))

place = c[0]
for x in range(M):
    if place == data[x][0]:
        place_diff = data[x][1]
        break

for x in range(M):
    diff = data[x][1] - place_diff
    ans_hour = hour + diff
    print("{0:02d}:{1}".format(ans_hour, minute)) 

ここまでやって走らせてみたら、例2の方で期待値が出ませんねぇ。自分のリファクタリングがミスったかのかと思ってオリジナルコード走らせたら、やっぱり期待値が出なかったです。

ans_hourがマイナスになってたので、負なら24足してあげる処理すると良いのでしょうか。ロジックちゃんと見てないので保証はしません。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/28 22:46

    ご指導ありがとうございます。
    ひとつひとつ、丁寧に解説して頂き、とても勉強になりました。

    ご指摘とおり、オリジナルコードのロジックに誤りがありました。
    例題2でも正しく出力できるよう、コードを書きなおします。

    キャンセル

+1

ちょっとだけスマートにできた...かも。あんまり変わってないようにも見えます。

from collections import OrderedDict

n = int(input())

timezone_table = OrderedDict()
for _ in range(n):
    city, diff = input().split()
    timezone_table[city] = int(diff)

base_city, base_time = input().split()
base_hour, base_minute = map(int, base_time.split(':'))

standard_hour = (base_hour - timezone_table[base_city]) % 24
for diff in timezone_table.values():
    print(f'{(standard_hour + diff) % 24:02d}:{base_minute:02d}')

Wandbox


datetimeモジュールを使ってみた例。どっちもどっちですね。

from collections import OrderedDict
from datetime import datetime, timedelta

n = int(input())

timezone_table = OrderedDict()
for _ in range(n):
    city, diff = input().split()
    timezone_table[city] = timedelta(hours=int(diff))

base_city, base_time = input().split()
base_time = datetime.strptime(base_time, '%H:%M')

standard_time = (base_time - timezone_table[base_city])
for diff in timezone_table.values():
    print(datetime.strftime(standard_time + diff, '%H:%M'))

Wandbox

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/28 22:47

    ご指導ありがとうございます。
    辞書を使う方がスマートですね!

    私のミスでオリジナルコードのロジックに誤りがありました。
    例題2でも正しく出力できるよう、コードを書きなおします。

    キャンセル

  • 2018/04/28 23:05

    追記を見ましたが、上手くいかないのは分を出力する際に桁数を指定していないからでは?

    キャンセル

  • 2018/04/28 23:20

    ご指摘ありがとうございます。
    めちゃくちゃ率直なコードですが、
    print('{0:02d}'.format(ans_hour) + ':' + '{0:02d}'.format(base_minute))

    何とか自己解決できました。最初に不要な質問ばかりしてしまい、ご迷惑おかけして申し訳ありません。

    LouiS0616さんを含め、皆さまのサポートがなければできませんでした。ありがとうございます。

    キャンセル

0

コード
from collections import OrderedDict

n = int(input())

timezone_table = OrderedDict()
for _ in range(n):
    city, diff = input().split()
    timezone_table[city] = int(diff)

base_city, base_time = input().split()
base_hour, base_minute = map(int, base_time.split(':'))

standard_hour = (base_hour - timezone_table[base_city]) % 24
for diff in timezone_table.values():  
    ans_hour = (standard_hour + diff) % 24

    print('{0:02d}'.format(ans_hour) + ':' + '{0:02d}'.format(base_minute))

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python 3.x

    6405questions

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