ITP1_10_B: Triangle
三角形 | プログラミング入門 | Aizu Online Judge
数学に関する問題
三角形の面積 は、
$$ S = \frac{1}{2}ab\sin{C} $$
辺 の長さは、 より、
$$ c = \sqrt{a^{2} + b^{2} - 2ab \cos{C}} $$
高さ は、 より、
$$ h = \frac{2S}{a} $$
解答
# coding: utf-8 import math a, b, C = map(float, input().split()) S = 0.5 * a * b * math.sin(C * math.pi / 180) L = a + b + (a ** 2 + b ** 2 - 2 * a * b * math.cos(C * math.pi / 180)) ** 0.5 h = 2 * S / a print("%f\n%f\n%f" % (S, L, h))
ITP1_10_A: Distance
距離 | プログラミング入門 | Aizu Online Judge
2点間の距離を求める問題
2点間の距離は、
で求めることができます。
解答
# coding: utf-8 x1, y1, x2, y2 = map(float, input().split()) print(((x1 - x2) ** 2 + (y1 - y2) ** 2) ** 0.5)
ITP1_9_D: Transformation
文字列変換 | プログラミング入門 | Aizu Online Judge
文字列操作に関する問題
解答
入力値を分割する際の要素数や、文字列操作する際のインデックスに注意します。
# coding: utf-8 str = input() q = int(input()) for _ in range(q): line = input().split() c = line[0] a = int(line[1]) b = int(line[2]) + 1 if c == 'replace': str = str[:a] + line[3] + str[b:] elif c == 'reverse': str = str[:a] + str[a:b][::-1] + str[b:] else: print(str[a:b])
ITP1_9_C: Card Game
カードゲーム | プログラミング入門 | Aizu Online Judge
解答
# coding: utf-8 n = int(input()) t = 0 h = 0 for _ in range(n): tc, hc = input().split() if tc > hc: t += 3 elif tc < hc: h += 3 else: t += 1 h += 1 print(t, h)
AtCoder Beginner Contest 001
A - 積雪深差
# coding: utf-8 H1 = int(input()) H2 = int(input()) print(H1 - H2)
B - 視程の通報
問題文に従って条件分岐します。
m = int(input()) if 100 > m: print('00') elif 5000 >= m: print("{:02d}".format(m // 100)) elif 30000 >= m: print(m // 1000 + 50) elif 70000 >= m: print((m // 1000 - 30) // 5 + 80) else: print(89)
C - 風力観測
round()
は偶数寄りに丸めらます。そのため、round(1.5)
の結果は2ですが、round(2.5)
の結果も2になります。
# coding: utf-8 def deg_to_dir(deg): """Summary line. 風向から方位を返します。 Args: deg (int): 風向 Returns: string: 方位 """ degs_list = ['N', 'NNE', 'NE', 'ENE', 'E', 'ESE', 'SE', 'SSE', 'S', 'SSW', 'SW', 'WSW', 'W', 'WNW', 'NW', 'NNW'] deg_index = ((deg * 10 + 1125) // 2250) % 16 return degs_list[deg_index] def dis_to_w(dis): """Summary line. 風程から風力を返します。 Args: des (int): 風程 Returns: w (int): 風力 """ w = -1 ws_list = [0.0, 0.3, 1.6, 3.4, 5.5, 8.0, 10.8, 13.9, 17.2, 20.8, 24.5, 28.5, 32.7] r_dif = int(dis * 10 + 0.5) / 10 for n in ws_list: if r_dif >= n: w += 1 else: break return w def dir_w(deg, dis): """Summary line. 風向、風程から方位と風力を返します。 Args: deg (int): 風向 des (int): 風程 Returns: (strint, int): (方位, 風力)のタプル """ w = dis_to_w(dis) if w == 0: dir = 'C' else: dir = deg_to_dir(deg) return (dir, w) Deg, Dis = map(int, input().split()) result = dir_w(Deg, Dis) print(*result)
D - 感雨時刻の整理
降り始め・降り終わりをそれぞれ直前・直後の 5 分単位の時刻に丸めます。
降り始めは、5による剰余を引くことで簡単に求めることができます。
# 13:23 の場合、1323 mod 5 = 3 なので、13:23 - 3 = 13:20 start -= start % 5
降り終わりは、5から5による剰余を引いた結果を足すことで、求めることができます。
# 14:01 の場合、1401 mod 5 = 1 なので、14:01 + (5 - 1) = 14:05 end += 5 - end % 5
しかしこの計算では、0分、5分の場合に、余計に5分足してしまうことになります。
# 14:00 の場合、1400 mod 5 = 0 なので、14:00 + (5 - 0) = 14:05 end += 5 - end % 5
そのため、5による剰余が0の場合は0を足し、1から4の場合は5から5による剰余を引いた結果を足すようにします。
そこで、5による剰余に4を足し、5で割った商の整数部分を結果に掛けることにします。そうすることで、剰余が0の場合は0を掛けることになり、結果0を足し、1から4の場合は1を掛けることで結果を足すようになります。
# 14:00 の場合、1400 mod 5 = 0 なので、 # ((4 + 0) // 5) * (5 - 0) = 0 * 5 = 0 # つまり、14:00 + 0 = 14:00 # # 14:01 の場合、1401 mod 5 = 1 なので、 # ((4 + 1) // 5) * (5 - 1) = 1 * 4 = 4 # つまり、14:00 + 1 = 14:05 end += ((4 + end % 5) // 5) * (5 - end % 5)
最後に、56分以降は、時間(hour)も繰り上げなければなりません。
ここでは、100による剰余を求めることで分(minute)を抜き出し、56分を基準に、つまり、56で割った整数部の商に40を掛けることで時間を繰り上げます。
# 14:56 の場合、 1456 mod 100 = 56 、56 // 56 = 1 なので、 # 1 * 40 = 40 end % 100 // 56 * 40
これで、降り終わりが丸めることができます
# 14:56 の場合、 # 1456 mod 5 = 1 、1456 mod 100 = 56 なので、 # ((4 + 1) // 5) * (5 - 1) + (56 // 56 * 40) # (1 * 4) + (1 * 40) = 44 # つまり、1456 + 44 = 1500 => 15:00 end += ((4 + end % 5) // 5) * (5 - end % 5) + (end % 100 // 56 * 40)
解答
# coding: utf-8 N = int(input()) times_set = [] results = [] start_index = 0 end_index = 1 tmp_start = -1 tmp_end = -1 for i in range(N): start, end = map(int, input().split('-')) start -= start % 5 end += ((4 + end % 5) // 5) * (5 - end % 5) + end % 100 // 56 * 40 times_set.append([start, end]) times_set.sort() for time_set in times_set: if tmp_start == -1: tmp_start = time_set[start_index] tmp_end = time_set[end_index] elif time_set[start_index] <= tmp_end: if tmp_end <= time_set[end_index]: tmp_end = time_set[end_index] else: results.append("{:04d}-{:04d}".format(tmp_start, tmp_end)) tmp_start = time_set[start_index] tmp_end = time_set[end_index] results.append("{:04d}-{:04d}".format(tmp_start, tmp_end)) for result in results: print(result)
ITP1_9_B: Shuffle
シャッフル | プログラミング入門 | Aizu Online Judge
文字列の切り取り、結合に関する問題
解答
インデックスに気を付けて文字列を操作します。
# coding: utf-8 while True: cards = input() if cards == '-': break m = int(input()) for i in range(m): h = int(input()) cards = cards[h:] + cards[:h] print(cards)
ITP1_9_A: Finding a Word
単語の検索 | プログラミング入門 | Aizu Online Judge
指定された単語の数を出力する問題
解答
count()
を使用することで、リスト内の指定の値を持つ要素の数を取得することができます。
# coding: utf-8 count = 0 W = input().lower() while True: T = input() if T == 'END_OF_TEXT': break count += T.lower().split().count(W) print(count)