"""Урок 3"""
import numpy as np
from math import factorial


def combinations(total_n, quantity):
    return int(factorial(total_n) / (factorial(quantity) * factorial(total_n - quantity)))


# 1. Даны значения зарплат из выборки выпускников: 100, 80, 75, 77, 89, 33, 45,
# 25, 65, 17, 30, 24, 57, 55, 70, 75, 65, 84, 90, 150. Посчитать (желательно
# без использования статистических методов наподобие std, var, mean)
# среднее арифметическое, среднее квадратичное отклонение, смещенную и
# несмещенную оценки дисперсий для данной выборки.
# Решение:
pays = np.array([100, 80, 75, 77, 89, 33, 45, 25, 65, 17, 30, 24, 57, 55, 70,
                 75, 65, 84, 90, 150])
p_mean = sum(pays) / len(pays)
sum_dq = sum([(x - p_mean) ** 2 for x in pays])
print('# Ответы 1:')
print(f'# среднее арифметическое={p_mean}, метод numpy={pays.mean().round(2)}')
print(f'# среднее квадратичное отклонение={(sum_dq / len(pays)) ** 0.5:.2f}, '
      f'метод numpy={pays.std().round(2)}')
print(f'# смещенная дисперсия={sum_dq / len(pays):.2f}, '
      f'метод numpy={pays.var().round(2)}')
print(f'# НЕ смещенная дисперсия={sum_dq / (len(pays) - 1):.2f}, '
      f'метод numpy={pays.var(ddof=1).round(2)}')
# Ответы 1:
# среднее арифметическое=65.3, метод numpy=65.3
# среднее квадратичное отклонение=30.82, метод numpy=30.82
# смещенная дисперсия=950.11, метод numpy=950.11
# НЕ смещенная дисперсия=1000.12, метод numpy=1000.12

# 2. В первом ящике находится 8 мячей, из которых 5 - белые и 3 - черные.
# Во втором ящике - 12 мячей, из которых 5 - белые и 7 - черные.
# Из первого ящика вытаскивают случайным образом два мяча, из второго - 4.
# Какова вероятность того, что 3 мяча белые?
# Решение:
# благоприятные исходы:
# 1(2Б0Ч) + 2(1Б3Ч) или 1(1Б1Ч) + 2(2Б2Ч) или 1(0Б2Ч) + 2(3Б1Ч)
# расчет сочетаниями:
p_balls1 = combinations(5, 2) / combinations(8, 2) * \
           combinations(5, 1) * combinations(7, 3) / combinations(12, 4)
p_balls2 = combinations(5, 1) * combinations(3, 1) / combinations(8, 2) * \
           combinations(5, 2) * combinations(7, 2) / combinations(12, 4)
p_balls3 = combinations(3, 2) / combinations(8, 2) * \
           combinations(5, 3) * combinations(7, 1) / combinations(12, 4)
p_balls = p_balls1 + p_balls2 + p_balls3
print(f'# Ответ 2: {p_balls} или {p_balls:.2%}')
# Ответ 2: 0.3686868686868686 или 36.87%

# 3. На соревновании по биатлону один из трех спортсменов стреляет и попадает
# в мишень. Вероятность попадания для первого спортсмена равна 0.9,
# для второго — 0.8, для третьего — 0.6. Найти вероятность того, что выстрел
# сделан: a) первым спортсменом б) вторым спортсменом в) третьим спортсменом.
# Решение: используем формулу Байеса
p_hunters = (0.9, 0.8, 0.6)
p_one = 1 / len(p_hunters)  # вероятность выстрела одним из спортсменов
p_shot = p_one * sum(p_hunters)  # вероятность попадания одним из спортсменов
print('# Ответы 3:')
for i, p in enumerate(p_hunters, 1):
    ph = p_one * p / p_shot
    print(f'# Выстрел сделан: {i}-м с вероятностью {ph} или {ph:.2%}')
# Ответы 3:
# Выстрел сделан: 1-м с вероятностью 0.3913043478260869 или 39.13%
# Выстрел сделан: 2-м с вероятностью 0.34782608695652173 или 34.78%
# Выстрел сделан: 3-м с вероятностью 0.26086956521739124 или 26.09%

# 4. В университет на факультеты A и B поступило равное количество студентов,
# а на факультет C студентов поступило столько же, сколько на A и B вместе.
# Вероятность того, что студент факультета A сдаст первую сессию, равна 0.8.
# Для студента факультета B эта вероятность равна 0.7, а для студента
# факультета C - 0.9. Студент сдал первую сессию.
# Какова вероятность, что он учится: a). на факультете A б). на факультете B
# в). на факультете C?
# Решение: используем формулу Байеса
p_students = (0.8, 0.7, 0.9)
# вероятность принадлежности студента к факультету
p_one = [1 / 4, 1 / 4, 1 / 2]
# вероятность сдачи сессии одним из студентов по формуле полной вероятности
p_session = sum([s * p for s, p in zip(p_students, p_one)])
print('# Ответы 4:')
for i, f in enumerate('ABC'):
    ps = p_one[i] * p_students[i] / p_session
    print(f'# Студент с факультета: "{f}" с вероятностью {ps} или {ps:.2%}')
# Ответы 4:
# Студент с факультета: "A" с вероятностью 0.24242424242424246 или 24.24%
# Студент с факультета: "B" с вероятностью 0.21212121212121213 или 21.21%
# Студент с факультета: "C" с вероятностью 0.5454545454545455 или 54.55%

# 5. Устройство состоит из трех деталей. Для первой детали вероятность выйти
# из строя в первый месяц равна 0.1, для второй - 0.2, для третьей - 0.25.
# Какова вероятность того, что в первый месяц выйдут из строя:
# а). все детали
# б). только две детали
# в). хотя бы одна деталь
# г). от одной до двух деталей?
# Решение:
print('# Ответы 5 - с вероятностью выйдут из строя:')
p1, p2, p3 = 0.1, 0.2, 0.25
# выйдут из строя все детали
p_all = p1 * p2 * p3
# выйдут из строя только две детали
p_two = p1 * p2 * (1 - p3) + p1 * (1 - p2) * p3 + (1 - p1) * p2 * p3
# все детали будут работать
p_work = (1 - p1) * (1 - p2) * (1 - p3)
# выйдут из строя 1, 2 или 3 детали
p_123 = 1 - p_work
# выйдут из строя одной до двух деталей
p_1_2 = 1 - p_all - p_work
print(f'# а) все детали {p_all:.3f} или {p_all:.2%}')
print(f'# б) только две детали {p_two:.3f} или {p_two:.2%}')
print(f'# в) хотя бы одна деталь {p_123:.3f} или {p_123:.2%}')
print(f'# г) от одной до двух деталей {p_1_2:.3f} или {p_1_2:.2%}')
print('# или по другому:')
# выйдет из строя одна деталь:
p_one = p1 * (1-p2) * (1 - p3) + (1 - p1) * p2 * (1 - p3) + (1 - p1) * (1 - p2) * p3
print(f'# в) хотя бы одна деталь {p_one+p_two+p_all:.3f} или {p_one+p_two+p_all:.2%}')
print(f'# г) от одной до двух деталей {p_one+p_two:.3f} или {p_one+p_two:.2%}')
print(f'# полная вероятность={p_one+p_two+p_all+p_work}')
# Ответы 5 - с вероятностью выйдут из строя:
# а) все детали 0.005 или 0.50%
# б) только две детали 0.080 или 8.00%
# в) хотя бы одна деталь 0.460 или 46.00%
# г) от одной до двух деталей 0.455 или 45.50%
# или по другому:
# в) хотя бы одна деталь 0.460 или 46.00%
# г) от одной до двух деталей 0.455 или 45.50%
# полная вероятность=1.0
