__author__ = 'Насонов Алексей Сергеевич'

# Задание-1: уравнение прямой вида y = kx + b задано в виде строки.
# Определить координату y точки с заданной координатой x.

#equation = 'y = -12x + 11111140.2121'
#x = 2.5
# вычислите и выведите y

print("Задача-1:")
x = 2.5
y = -12*x + 11111140.2121
print("Координата точки: x = {0}, y = {1}".format(x,y))



# Задание-2: Дата задана в виде строки формата 'dd.mm.yyyy'.
# Проверить, корректно ли введена дата.
# Условия корректности:
# 1. День должен приводиться к целому числу в диапазоне от 1 до 30(31)
#  (в зависимости от месяца, февраль не учитываем)
# 2. Месяц должен приводиться к целому числу в диапазоне от 1 до 12
# 3. Год должен приводиться к целому положительному числу в диапазоне от 1 до 9999
# 4. Длина исходной строки для частей должна быть в соответствии с форматом 
#  (т.е. 2 символа для дня, 2 - для месяца, 4 - для года)

# Пример корректной даты
#date = '01.11.1985'

# Примеры некорректных дат
#date = '01.22.1001'
#date = '1.12.1001'
#date = '-2.10.3001'

print("Задача-2:")
DaysInToMonth = [30, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
date = '21.11.1985'
List = date.split(".")
# Проверка по формату
if len(List[0]) != 2 or len(List[1]) != 2 or len(List[2]) != 4:
    print("Формат не соответсвует dd.mm.yyyy")
    quit()

D = int(List[0])
M = int(List[1])
Y = int(List[2])

# Проверяем месяц
if M not in list(range(1, 13)):
    print("Некоректно определен месяц")
    quit()
# Проверяем день
elif D not in list(range(1, DaysInToMonth[M-1]+1)):
    print("Некоректно определен день")
    quit()
# Проверяем год
elif Y not in list(range(1, 10000)):
    print("Некоректно определен год")
    quit()

print("Дата {} введена корректно".format(date))



# Задание-3: "Перевёрнутая башня" (Задача олимпиадного уровня)
#
# Вавилонцы решили построить удивительную башню —
# расширяющуюся к верху и содержащую бесконечное число этажей и комнат.
# Она устроена следующим образом — на первом этаже одна комната,
# затем идет два этажа, на каждом из которых по две комнаты, 
# затем идёт три этажа, на каждом из которых по три комнаты и так далее:
#         ...
#     12  13  14
#     9   10  11
#     6   7   8
#       4   5
#       2   3
#         1
#
# Эту башню решили оборудовать лифтом --- и вот задача:
# нужно научиться по номеру комнаты определять,
# на каком этаже она находится и какая она по счету слева на этом этаже.
#
# Входные данные: В первой строчке задан номер комнаты N, 1 ≤ N ≤ 2 000 000 000.
#
# Выходные данные:  Два целых числа — номер этажа и порядковый номер слева на этаже.
#
# Пример:
# Вход: 13
# Выход: 6 2
#
# Вход: 11
# Выход: 5 3


print("Задача-3:")
# Задаем номер квартиры
Num = 11

# Определяем в каком квадрате находится квартира (сумму квадратов n натуральных чисел)
# Правильнее бы было найти обратную функцию, но как-то не получилось. Поэтому ищем решение по исходной функции
for n in range(1, 2000):
    MaxKvart = n * (n + 1) * (2 * n + 1) / 6
    if MaxKvart >= Num:
        break

print("Номер исходной квартиры:", Num)
print("Номер квадрата:", n)
print("Номер последней квартиры(в правом верхнем углу):", int(MaxKvart))
# Определяем верхний этаж этого квадрата (сумму n натуральных чисел)
MaxEtag = n * (n + 1) / 2

print("Этаж самой последней квартиры в этом квадрате", int(MaxEtag))
# Определяем искомый этаж и смещение слева на право на этаже у искомой квартиры
DeltaEtag = (MaxKvart - Num) // n
RightOffset = (MaxKvart - Num) % n
print("Дельта этаж", int(DeltaEtag))
print("Смещение квартиры справа", int(RightOffset))

print("\nРЕШЕНИЕ:")
print("Искомый этаж:", int(MaxEtag-DeltaEtag))
print("Номер квартиры на этаже слева:", int(n-RightOffset))

