Найти в Дзене
Варечка Окаянная

Python МГУ МФК часть 7 осень 2023

Оглавление

python 2023 a 7 Библиотеки Matplotlib и NumPy

Введение.

Всем привет! Я тут подумала хорошо будет поделиться своими решениями по питону! Пожалуйста подпишитесь на мой канал про мою жизнь в МГУ "Варечка Окаянная")))

1. Underflow error

Физик Леонид придумал, как решить все проблемы современной физики. Он придумал новую формулу, но для того, чтобы воспользоваться ей, ему нужно сложить число порядка 1e-12 и число порядка 1e-55.

-2

Попробовав сделать это, удивленный Леонид обнаружил, что его программа выдает ему какой-то неправильный результат:

-3

(проверьте на Python).

Леонид спросил совета у своего друга-программиста, и тот рассказал ему, что все дело в том, что вещественные числа в представлении ЭВМ – очень большое, но все же дискретное множество, и что пытаясь сложить два очень маленьких числа, Леонид вызывает т. н. underflow problem. Расстроенный Леонид решил, что может пренебречь точностью вычислений, но ему нужно знать, какой минимальный порядок числа он может прибавить к числу 1e-12, чтобы программа смогла исполниться корректно, то есть нужно найти такое число n, что:

-4

Помогите Леониду найти такое число.

Формат вывода:

-5

Примечания
Вы можете задать число типа float при помощи вызова функции float(str), где str будет иметь вид '1e-n'. Информация по данной теме: см. 32 минуту лекции. Обратите внимание, что количество попыток по данной задаче меньше, чем обычно (чтобы избежать решения методом подбора). В задании требуется написать одно число в поле ответа.

Ответ: 27

1e-12 + 1e-27
1.000000000000001e-12
1e-12 + 1e-28
1e-12

2. Управление пекарней

Пекарь Иван работает в кондитерской. Иван с самого утра готовит много выпечки, чтобы в течение дня продать ее. Иногда бывает, что Иван готовит слишком много выпечки, и она пропадает, а иногда - слишком мало, и клиенты остаются недовольны. В обоих случаях Иван несет убытки. Он обратился к другу-математику Григорию, чтобы тот помог ему. Проанализировав данные о посещаемости пекарни Ивана за последний год, Григорий выяснил, что функция зависимости количества посетителей пекарни от дня месяца задается следующим выражением:

-6

Помогите Ивану посчитать число клиентов, которые будут у него 18 числа месяца, реализовав функцию при помощи инструментов python.

Формат вывода
Напишите число (вручную) nn, где nn — это число клиентов, которые будут у него 18 числа месяца.

Примечания
Ответ округлите до целого при помощи int(). Про работу с математическими функциями: см. конспект лекции.

Ответ: 27

import math

def calculate_clients(day):
return int(math.exp(math.sin(day / 100) * day / 10) * 20)

clients_18th_day = calculate_clients(18)
print(clients_18th_day)

3. Битва при Азенкуре 2.0

Обратите внимание, что перед отправкой решения данной задачи нужно в качестве языка выбрать Make. Это можно сделать в нижней части данной страницы, как показано на рисунке:

-7

В процессе археологических раскопок было найдено много документов. Откапывая все новые и новые рукописи, археологи датировали их и складывали в одну стопку. У одного из археологов родилась новая гипотеза о причинах поражения Французов в битве 1415 года при Азенкуре. Однако, для проверки гипотезы необходимо найти документ 1415 года. Вам дан список дат, которые приписаны к каждому документу. Даты упорядочены строго по возрастанию. При помощи бинарного поиска найдите индекс соответствующего документа. Гарантируется, что документ 1415 года есть в списке. Вам нужно реализовать функцию с именем bin_search(lst) со следующими требованиями:

Имя функции - строго фиксировано (bin_search). Функции подаётся на вход список lst, список строк, каждая из которых является строковым представлением соответствующей даты. Например: ['1000', '1280', '1415'].

Функция возвращает число искомый индекс 1415 года во входном списке. В качестве отступов в функции используется 4 пробела. Функция реализует алгоритм бинарного поиска.

Приведём пример функции, которую следует сдавать в тестовую систему (в данном случае реализован не бинарный поиск, а обычный, поэтому такое решение засчитано не будет):

def bin_search(lst):
for i in range(len(lst)):
if int(lst[i]) == 1415:
return i


Формат ввода
Входной параметр функции представляет список строк-дат.

Формат вывода
Вывести в качестве возвращаемого функцией bin_search(lst) значения (через return) индекс iii элемента со значением '1415'.

Примечания
Отсчёт индексов начинается с нуля. Обратите внимание, что входной параметр функции - список строк. Нужно реализовать бинарный поиск, который работает достаточно быстро. Остальные, менее эффективные алгоритмы (например, с find()) не пройдут по ограничению времени. В этом случае будет получена ошибка Runtime Error (RE). Не забывайте, что во входных данных числа представлены в виде строк. Обычное сравнение строк происходит в лексикографическом порядке. Т.е. '111' < '12'. Нам же нужно сравнивать именно числа. Поэтому внутри бинарного поиска перед сравнением нужно выполнять преобразование строк к int. Преобразование всех элементов исходного списка к int занимает много времени. В бинарном поиске нам не нужны все значения списка. Мы только смотрим на середины отдельных срезов исходного списка. Поэтому нужно выполнять преобразование строки к int только для тех элементов, которые мы сравниваем с числом 1415. Вообще говоря, бинарный поиск работает только с отсортированным списком. В нашем случае не нужно дополнительно сортировать исходный список, т.к. он уже отсортирован (см. условие). При проверке собственной реализации бинарного поиска рассмотрите ситуации: список из одного элемента, список из чётного количества элементов, список из нечётного количества элементов (больше одного).

Ответ:

def bin_search(lst):
low = 0
high = len(lst) - 1

while low <= high:
middle = (low + high) // 2

if int(lst[middle]) == 1415:
return middle
elif int(lst[middle]) > 1415:
high = middle - 1
else:
low = middle + 1

return -1

4. Менеджмент

Обратите внимание, что перед отправкой решения данной задачи нужно в качестве языка выбрать Python. Это можно сделать в нижней части данной страницы, как показано на рисунке:

-8

Менеджер крупной столичной фирмы Алексей готовит отчет о прибыльности проекта. Для отчета о прибыли фирмы Алексей проанализировал много данных и построил графики дневной прибыли. По плану, который был составлен до старта проекта, прибыль должна была увеличиваться линейно каждый день. Если за первый день работы проекта прибыль была 5 у.е., за последний — 15 у.е., между ними прошло 10 дней, то прибыль за второй день составит 6 у.е., за третий — 7 у.е. и так далее. На деле оказалось, что участники проекта очень не любят понедельники, и их продуктивность по понедельникам (то есть каждый 7-ой день) снижается в 3 раза по сравнению с ожидаемой, а в пятницу — наоборот: участники проекта чувствуют душевный подъем и работают в 2 раза активнее. Из-за этого прибыль по этим дням изменяется пропорционально продуктивности.

Пример: ожидаемая прибыль проекта (план)

  • пн: 6 у.е.
  • вт: 8 у.е.
  • ср: 10 у.е.
  • чт: 12 у.е.
  • пт: 14 у.е.
  • сб: 16 у.е.
  • вс: 18 у.е.
  • пн: 20 у.е.
  • вт: ... и т.д.

Фактическая прибыль проекта (с поправкой на продуктивность):

  • пн: 2 у.е.
  • вт: 8 у.е.
  • ср: 10 у.е.
  • чт: 12 у.е.
  • пт: 28 у.е.
  • сб: 16 у.е.
  • вс: 18 у.е.
  • пн: 6.666 у.е.
  • вт: ... и т.д.

Вам дана информация об ожидаемой по плану прибыли в первый день запуска проекта, об ожидаемой по плану прибыли в последний день и количестве дней работы проекта. Считаем, что понедельник — всегда первый день запуска проекта. При помощи np.linspace и присваиваний в срез, найдите фактическую прибыль проекта с поправкой на продуктивность участников за каждый день работы проекта.

Формат ввода
В файле input.txt Вам даны три числа: прибыль (по плану) проекта в первый день (в понедельник), прибыль (по плану) проекта в последний день и количество дней.

Формат вывода
Выведите в файл output.txt массив, содержащий данные по ежедневной фактической прибыли. Прибыль за каждый день представляет собой вещественное число c точностью 2 знака после запятой, каждое число записывается в отдельной строке.

Примечания
Обратите внимание, что в выходном файле нужно сохранять числа с точностью 2 знака после точки. Во входных данных может быть больше одного понедельника и пятницы. Не забывайте делать import numpy! Значения прибыли проекта во входных данных могут быть нецелыми числами (вещественными). Пятница - не всегда последний день. И она может быть не одна. Проверяйте, что в выходных данных нет лишних пробелов. Обратите внимание, что у функции numpy.linspace(start, end, len) первые 2 аргумента (start и end) - начало и конец списка - могут быть нецелыми. А вот третий аргумент - len длина списка, должен быть целым числом. Метод round() округляет так, что не оставляет нулей в конце. Например, round(5.101, 2) выдаст 5.1, хотя нужно выводить 5.10. Чтобы побороть эту проблему, можно отсекать лишние разряды в самом методе print() с помощью f-string: f'{x:.2f}'. Подробнее: см. рекомендации к вводу-выводу.

Ответ:

import numpy as np

with open('input.txt', 'r') as file:
plan_first_day, plan_last_day, days = map(float, file.readlines())

days_array = np.linspace(plan_first_day, plan_last_day, int(days))
actual_profit = []

for i in range(len(days_array)):
day_of_week = i % 7
if day_of_week == 0: # Monday
actual_profit.append(days_array[i] / 3)
elif day_of_week == 4: # Friday
actual_profit.append(days_array[i] * 2)
else:
actual_profit.append(days_array[i])

with open('output.txt', 'w') as file:
for profit in actual_profit:
file.write(f'{profit:.2f}\n')

Спасибо!

Телеграмм Свалка астронома Ai 🦄 MSU

Телеграмм Варечкин Блокнот 🌸 MSU

ВК Школа https://vk.com/mgu_gdz Физиув UwU

Дзен https://dzen.ru/varechka_uni_physics

-9

Наука
7 млн интересуются