Problem p02677 (python)

Fixed submission:
import sys
from io import StringIO
import unittest
import math

# 参考1：余弦定理(この頁を学習すると、|??|に入る式が分かり、直角三角形でない場合でも第3の辺aの長さを求めることができるようになります。)
# https://www.geisya.or.jp/~mwm48961/kou2/cos_rule.htm
# aの2乗 = bの2乗 + cの2乗 − 2bccosA
# 参考2：コサイン等の関数説明
# https://note.nkmk.me/python-math-sin-cos-tan/

def resolve():
    a, b, h, m = map(int, input().split())

    # 角度を求める
    hour_degrees = h*30 + m*0.5
    minutes_degrees = m*6

    # 角度が同じなら、単に辺の差を出力して終了
    if hour_degrees is minutes_degrees:
        print(abs(a - b))
        return

    # 角度が180度なら、単に辺の和を出力して終了
    if abs(hour_degrees - minutes_degrees) is 180.0:
        print(abs(a + b))
        return

    # # 角度と長さを取得
    # if hour_degrees > minutes_degrees:
    #     big = [hour_degrees, a]
    #     sho = [minutes_degrees, b]
    # else:
    #     big = [minutes_degrees, b]
    #     sho = [hour_degrees, a]
    #
    # # 長さを求める辺をAとして・・
    # # 2辺(BとC)が180度以上開いていない場合：角度の小さい辺がAの右辺 深い辺がAの左辺。
    # if big[0] - sho[0] < 180:
    #     a_right = sho
    #     a_left = big
    #     degrees = big[0] - sho[0]
    # # 2辺(BとC)が180度以上開いている場合　　：角度の小さい辺がAの右辺 深い辺がAの左辺。
    # else:
    #     a_right = big
    #     a_left = sho
    #     degrees = 360 - big[0] - sho[0]

    # # 余弦定理にて辺aの長さを求める
    # # aの2乗 = bの2乗 + cの2乗 − 2bccosA
    # a2 = pow(a_right[1], 2) + pow(a_left[1], 2) - 2 * a_right[1] * a_left[1] * math.cos(math.radians(degrees))


    # 2辺の角度を求める。
    degrees = abs(hour_degrees - minutes_degrees)
    # 180度を超えている場合、左辺等辺が反転する。
    if degrees > 180:
        degrees = 360 - degrees

    # 余弦定理にて辺aの長さを求める
    # aの2乗 = bの2乗 + cの2乗 − 2bccosA
    a2 = pow(a, 2) + pow(b, 2) - 2 * a * b * math.cos(math.radians(degrees))

    # 平方根を出力
    print(math.sqrt(a2))

class TestClass(unittest.TestCase):
    def assertIO(self, input, output):
        stdout, stdin = sys.stdout, sys.stdin
        sys.stdout, sys.stdin = StringIO(), StringIO(input)
        resolve()
        sys.stdout.seek(0)
        out = sys.stdout.read()[:-1]
        sys.stdout, sys.stdin = stdout, stdin
        self.assertEqual(out, output)
    # def test_入力例_1(self):
    #     input = """3 4 9 0"""
    #     output = """5.00000000000000000000"""
    #     self.assertIO(input, output)
    # def test_入力例_2(self):
    #     input = """3 4 10 40"""
    #     output = """4.56425719433005567605"""
    #     self.assertIO(input, output)

    # 以下、自作したテストパターン
    # ------その１------
    # 長針0で短針だけ1づつずらす・・
    # 1 2.0531415706603067
    # 2 3.6055512754639887
    # 3 5.0
    # 4 6.082762530298219
    # 5 6.766432567522307
    # 6 7.0(OK)
    # 7 2.0531415706603067
    # 8 3.6055512754639887
    # 9 5.0
    # 10 6.082762530298219
    # 11 6.766432567522307
    # ->できてそう。

    # def test_入力例_1(self):
    #     input = """3 4 1 0"""
    #     output = """5.00000000000000000000"""
    #     self.assertIO(input, output)
    # def test_入力例_2(self):
    #     input = """3 4 2 0"""
    #     output = """5.00000000000000000000"""
    #     self.assertIO(input, output)
    # def test_入力例_3(self):
    #     input = """3 4 3 0"""
    #     output = """5.00000000000000000000"""
    #     self.assertIO(input, output)
    # def test_入力例_4(self):
    #     input = """3 4 4 0"""
    #     output = """5.00000000000000000000"""
    #     self.assertIO(input, output)
    # def test_入力例_5(self):
    #     input = """3 4 5 0"""
    #     output = """5.00000000000000000000"""
    #     self.assertIO(input, output)
    # def test_入力例_6(self):
    #     input = """3 4 6 0"""
    #     output = """5.00000000000000000000"""
    #     self.assertIO(input, output)
    # def test_入力例_7(self):
    #     input = """3 4 7 0"""
    #     output = """5.00000000000000000000"""
    #     self.assertIO(input, output)
    # def test_入力例_8(self):
    #     input = """3 4 8 0"""
    #     output = """5.00000000000000000000"""
    #     self.assertIO(input, output)
    # def test_入力例_9(self):
    #     input = """3 4 9 0"""
    #     output = """5.00000000000000000000"""
    #     self.assertIO(input, output)
    # def test_入力例_10(self):
    #     input = """3 4 10 0"""
    #     output = """5.00000000000000000000"""
    #     self.assertIO(input, output)
    # def test_入力例_11(self):
    #     input = """3 4 11 0"""
    #     output = """5.00000000000000000000"""
    #     self.assertIO(input, output)
    # def test_入力例_0(self):
    #     input = """3 4 0 0"""
    #     output = """1.00000000000000000000"""
    #     self.assertIO(input, output)

    # ------その2------
    # 短針0で長針だけ10づつずらす・・
    # 10 3.3517406712893067
    # 20 5.762680230571192
    # 30 6.9413413567507
    # 40 2.5719512758107466　<=おかしい。
    # 50 5.204972413562228　<=おかしい。
    # ->おかしい。三角形がほぼ一致するはずの、
    # X時20分 X時40分 と 10分 50分の値が違いすぎる。(短針が少し動くので、もちろん完全には一致しないが、ある程度は一致するはず。)

    # 各パターンのdegreesの値は・・
    # 10 55
    # 20 110
    # 30 165
    # 40 40　<=おかしい。約110になるはず。
    # 50 95　<=おかしい。約55になるはず。

    def test_入力例_1(self):
        input = """3 4 0 10"""
        output = """5.00000000000000000000"""
        self.assertIO(input, output)
    def test_入力例_2(self):
        input = """3 4 0 20"""
        output = """5.00000000000000000000"""
        self.assertIO(input, output)
    def test_入力例_3(self):
        input = """3 4 0 30"""
        output = """5.00000000000000000000"""
        self.assertIO(input, output)
    def test_入力例_4(self):
        input = """3 4 0 40"""
        output = """5.00000000000000000000"""
        self.assertIO(input, output)
    def test_入力例_5(self):
        input = """3 4 0 50"""
        output = """5.00000000000000000000"""
        self.assertIO(input, output)



if __name__ == "__main__":
    # unittest.main()
    resolve()

Buggy submission (verdict: Runtime Error):
import sys
from io import StringIO
import unittest
import math

# 参考1：余弦定理(この頁を学習すると、|??|に入る式が分かり、直角三角形でない場合でも第3の辺aの長さを求めることができるようになります。)
# https://www.geisya.or.jp/~mwm48961/kou2/cos_rule.htm
# aの2乗 = bの2乗 + cの2乗 − 2bccosA
# 参考2：コサイン等の関数説明
# https://note.nkmk.me/python-math-sin-cos-tan/

def resolve():
    a, b, h, m = map(int, input().split())

    # 角度を求める
    hour_degrees = h*30 + m*0.5
    minutes_degrees = m*6

    # 角度が同じなら、単に辺の差を出力して終了
    if hour_degrees is minutes_degrees:
        print(abs(a - b))
        return

    # 角度が180度なら、単に辺の和を出力して終了
    if abs(hour_degrees - minutes_degrees) is 180.0:
        print(abs(a + b))
        return

    # # 角度と長さを取得
    # if hour_degrees > minutes_degrees:
    #     big = [hour_degrees, a]
    #     sho = [minutes_degrees, b]
    # else:
    #     big = [minutes_degrees, b]
    #     sho = [hour_degrees, a]
    #
    # # 長さを求める辺をAとして・・
    # # 2辺(BとC)が180度以上開いていない場合：角度の小さい辺がAの右辺 深い辺がAの左辺。
    # if big[0] - sho[0] < 180:
    #     a_right = sho
    #     a_left = big
    #     degrees = big[0] - sho[0]
    # # 2辺(BとC)が180度以上開いている場合　　：角度の小さい辺がAの右辺 深い辺がAの左辺。
    # else:
    #     a_right = big
    #     a_left = sho
    #     degrees = 360 - big[0] - sho[0]

    # # 余弦定理にて辺aの長さを求める
    # # aの2乗 = bの2乗 + cの2乗 − 2bccosA
    # a2 = pow(a_right[1], 2) + pow(a_left[1], 2) - 2 * a_right[1] * a_left[1] * math.cos(math.radians(degrees))


    # 2辺の角度を求める。
    degrees = abs(hour_degrees - minutes_degrees)
    # 180度を超えている場合、左辺等辺が反転する。
    if degrees > 180:
        degrees = 360 - degrees

    # 余弦定理にて辺aの長さを求める
    # aの2乗 = bの2乗 + cの2乗 − 2bccosA
    a2 = pow(a, 2) + pow(b, 2) - 2 * a * b * math.cos(math.radians(degrees))

    # 平方根を出力
    print(math.sqrt(a2))

class TestClass(unittest.TestCase):
    def assertIO(self, input, output):
        stdout, stdin = sys.stdout, sys.stdin
        sys.stdout, sys.stdin = StringIO(), StringIO(input)
        resolve()
        sys.stdout.seek(0)
        out = sys.stdout.read()[:-1]
        sys.stdout, sys.stdin = stdout, stdin
        self.assertEqual(out, output)
    # def test_入力例_1(self):
    #     input = """3 4 9 0"""
    #     output = """5.00000000000000000000"""
    #     self.assertIO(input, output)
    # def test_入力例_2(self):
    #     input = """3 4 10 40"""
    #     output = """4.56425719433005567605"""
    #     self.assertIO(input, output)

    # 以下、自作したテストパターン
    # ------その１------
    # 長針0で短針だけ1づつずらす・・
    # 1 2.0531415706603067
    # 2 3.6055512754639887
    # 3 5.0
    # 4 6.082762530298219
    # 5 6.766432567522307
    # 6 7.0(OK)
    # 7 2.0531415706603067
    # 8 3.6055512754639887
    # 9 5.0
    # 10 6.082762530298219
    # 11 6.766432567522307
    # ->できてそう。

    # def test_入力例_1(self):
    #     input = """3 4 1 0"""
    #     output = """5.00000000000000000000"""
    #     self.assertIO(input, output)
    # def test_入力例_2(self):
    #     input = """3 4 2 0"""
    #     output = """5.00000000000000000000"""
    #     self.assertIO(input, output)
    # def test_入力例_3(self):
    #     input = """3 4 3 0"""
    #     output = """5.00000000000000000000"""
    #     self.assertIO(input, output)
    # def test_入力例_4(self):
    #     input = """3 4 4 0"""
    #     output = """5.00000000000000000000"""
    #     self.assertIO(input, output)
    # def test_入力例_5(self):
    #     input = """3 4 5 0"""
    #     output = """5.00000000000000000000"""
    #     self.assertIO(input, output)
    # def test_入力例_6(self):
    #     input = """3 4 6 0"""
    #     output = """5.00000000000000000000"""
    #     self.assertIO(input, output)
    # def test_入力例_7(self):
    #     input = """3 4 7 0"""
    #     output = """5.00000000000000000000"""
    #     self.assertIO(input, output)
    # def test_入力例_8(self):
    #     input = """3 4 8 0"""
    #     output = """5.00000000000000000000"""
    #     self.assertIO(input, output)
    # def test_入力例_9(self):
    #     input = """3 4 9 0"""
    #     output = """5.00000000000000000000"""
    #     self.assertIO(input, output)
    # def test_入力例_10(self):
    #     input = """3 4 10 0"""
    #     output = """5.00000000000000000000"""
    #     self.assertIO(input, output)
    # def test_入力例_11(self):
    #     input = """3 4 11 0"""
    #     output = """5.00000000000000000000"""
    #     self.assertIO(input, output)
    # def test_入力例_0(self):
    #     input = """3 4 0 0"""
    #     output = """1.00000000000000000000"""
    #     self.assertIO(input, output)

    # ------その2------
    # 短針0で長針だけ10づつずらす・・
    # 10 3.3517406712893067
    # 20 5.762680230571192
    # 30 6.9413413567507
    # 40 2.5719512758107466　<=おかしい。
    # 50 5.204972413562228　<=おかしい。
    # ->おかしい。三角形がほぼ一致するはずの、
    # X時20分 X時40分 と 10分 50分の値が違いすぎる。(短針が少し動くので、もちろん完全には一致しないが、ある程度は一致するはず。)

    # 各パターンのdegreesの値は・・
    # 10 55
    # 20 110
    # 30 165
    # 40 40　<=おかしい。約110になるはず。
    # 50 95　<=おかしい。約55になるはず。

    def test_入力例_1(self):
        input = """3 4 0 10"""
        output = """5.00000000000000000000"""
        self.assertIO(input, output)
    def test_入力例_2(self):
        input = """3 4 0 20"""
        output = """5.00000000000000000000"""
        self.assertIO(input, output)
    def test_入力例_3(self):
        input = """3 4 0 30"""
        output = """5.00000000000000000000"""
        self.assertIO(input, output)
    def test_入力例_4(self):
        input = """3 4 0 40"""
        output = """5.00000000000000000000"""
        self.assertIO(input, output)
    def test_入力例_5(self):
        input = """3 4 0 50"""
        output = """5.00000000000000000000"""
        self.assertIO(input, output)



if __name__ == "__main__":
    unittest.main()
    # resolve()