commit
a14a1c2539
5 changed files with 266 additions and 0 deletions
After Width: | Height: | Size: 100 KiB |
@ -0,0 +1,80 @@ |
|||||||
|
#+title: Тестовое задание |
||||||
|
#+date: [2022-07-12 вт 17:54] |
||||||
|
|
||||||
|
* Задача №1 |
||||||
|
|
||||||
|
Дан массив чисел, состоящий из некоторого количества подряд идущих единиц, за которыми следует какое-то количество подряд идущих нулей: 111111111111111111111111100000000. |
||||||
|
|
||||||
|
Найти индекс первого нуля (то есть найти такое место, где заканчиваются единицы, и начинаются нули) |
||||||
|
|
||||||
|
#+begin_src python |
||||||
|
def task(array): |
||||||
|
pass |
||||||
|
|
||||||
|
print(task("111111111110000000000000000")) |
||||||
|
# >> OUT: 11 |
||||||
|
#+end_src |
||||||
|
|
||||||
|
** Решение |
||||||
|
Запустить скрипт =task_1.py= командой: |
||||||
|
#+begin_src shell |
||||||
|
python task_1.py 111111111110000000000000000 |
||||||
|
# 11 |
||||||
|
|
||||||
|
python task_1.py 123 |
||||||
|
# -1 |
||||||
|
#+end_src |
||||||
|
|
||||||
|
Бонусом идет проверка валидности всей строки: если она не состоит только из 1 и 0, то программа вернет ошибку. |
||||||
|
|
||||||
|
|
||||||
|
* Задача №2 |
||||||
|
В нашей школе мы не можем разглашать персональные данные пользователей, но чтобы преподаватель и ученик смогли объяснить нашей поддержке, кого они имеют в виду (у преподавателей, например, часто учится несколько Саш), мы генерируем пользователям уникальные и легко произносимые имена. Имя у нас состоит из прилагательного, имени животного и двузначной цифры. В итоге получается, например, "Перламутровый лосось 77". Для генерации таких имен мы и решали следующую задачу: |
||||||
|
Получить с русской википедии список всех животных (https://inlnk.ru/jElywR) и вывести количество животных на каждую букву алфавита. Результат должен получиться в следующем виде: |
||||||
|
|
||||||
|
#+begin_quote |
||||||
|
А: 642 |
||||||
|
Б: 412 |
||||||
|
В:.... |
||||||
|
#+end_quote |
||||||
|
|
||||||
|
* Задача №3 |
||||||
|
Когда пользователь заходит на страницу урока, мы сохраняем время его захода. Когда пользователь выходит с урока (или закрывает вкладку, браузер – в общем как-то разрывает соединение с сервером), мы фиксируем время выхода с урока. Время присутствия каждого пользователя на уроке хранится у нас в виде интервалов. В функцию передается словарь, содержащий три списка с таймстемпами (время в секундах): |
||||||
|
|
||||||
|
lesson – начало и конец урока |
||||||
|
pupil – интервалы присутствия ученика |
||||||
|
tutor – интервалы присутствия учителя |
||||||
|
|
||||||
|
Интервалы устроены следующим образом – это всегда список из четного количества элементов. Под четными индексами (начиная с 0) время входа на урок, под нечетными - время выхода с урока. |
||||||
|
Нужно написать функцию, которая получает на вход словарь с интервалами и возвращает время общего присутствия ученика и учителя на уроке (в секундах). |
||||||
|
|
||||||
|
[[file:img/sample.png]] |
||||||
|
|
||||||
|
#+begin_src python |
||||||
|
def appearance(intervals): |
||||||
|
pass |
||||||
|
|
||||||
|
tests = [ |
||||||
|
{'data': {'lesson': [1594663200, 1594666800], |
||||||
|
'pupil': [1594663340, 1594663389, 1594663390, 1594663395, 1594663396, 1594666472], |
||||||
|
'tutor': [1594663290, 1594663430, 1594663443, 1594666473]}, |
||||||
|
'answer': 3117 |
||||||
|
}, |
||||||
|
{'data': {'lesson': [1594702800, 1594706400], |
||||||
|
'pupil': [1594702789, 1594704500, 1594702807, 1594704542, 1594704512, 1594704513, 1594704564, 1594705150, 1594704581, 1594704582, 1594704734, 1594705009, 1594705095, 1594705096, 1594705106, 1594706480, 1594705158, 1594705773, 1594705849, 1594706480, 1594706500, 1594706875, 1594706502, 1594706503, 1594706524, 1594706524, 1594706579, 1594706641], |
||||||
|
'tutor': [1594700035, 1594700364, 1594702749, 1594705148, 1594705149, 1594706463]}, |
||||||
|
'answer': 3577 |
||||||
|
}, |
||||||
|
{'data': {'lesson': [1594692000, 1594695600], |
||||||
|
'pupil': [1594692033, 1594696347], |
||||||
|
'tutor': [1594692017, 1594692066, 1594692068, 1594696341]}, |
||||||
|
'answer': 3565 |
||||||
|
}, |
||||||
|
] |
||||||
|
|
||||||
|
if __name__ == '__main__': |
||||||
|
for i, test in enumerate(tests): |
||||||
|
test_answer = appearance(test['data']) |
||||||
|
assert test_answer == test['answer'], f'Error on test case {i}, got {test_answer}, expected {test["answer"]}' |
||||||
|
|
||||||
|
#+end_src |
@ -0,0 +1,28 @@ |
|||||||
|
"""Найти индекс первого нуля в переданном массиве.""" |
||||||
|
import sys |
||||||
|
|
||||||
|
|
||||||
|
def task(array: str) -> int: |
||||||
|
"""Возвращает индекс певрого встреченного 0 в array.""" |
||||||
|
first_zero_element_idx: int = -1 |
||||||
|
valid_input: bool = True |
||||||
|
|
||||||
|
for elem in array: |
||||||
|
if elem != "0" and elem == "1": |
||||||
|
first_zero_element_idx += 1 |
||||||
|
# если вообще не было 0, то ввод неверный |
||||||
|
if elem not in "01": |
||||||
|
valid_input = False |
||||||
|
|
||||||
|
if valid_input: |
||||||
|
return first_zero_element_idx + 1 |
||||||
|
else: |
||||||
|
return -1 |
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__": |
||||||
|
try: |
||||||
|
u_input = str(sys.argv[1]) |
||||||
|
print(task(u_input)) |
||||||
|
except IndexError: |
||||||
|
print("Не переданы аргументы!") |
@ -0,0 +1,31 @@ |
|||||||
|
import wikipediaapi |
||||||
|
|
||||||
|
|
||||||
|
def get_all_titles_from_category(category: str) -> list: |
||||||
|
wiki = wikipediaapi.Wikipedia("ru") |
||||||
|
cat = wiki.page(category) |
||||||
|
names = [c.title() for c in cat.categorymembers] |
||||||
|
return names |
||||||
|
|
||||||
|
|
||||||
|
def get_count_list_by_first_letter(names: list) -> dict: |
||||||
|
names_dict: dict = {} |
||||||
|
for n in names: |
||||||
|
first_letter = n[0] |
||||||
|
count = names_dict.get(first_letter, 0) |
||||||
|
names_dict[first_letter] = count + 1 |
||||||
|
|
||||||
|
return names_dict |
||||||
|
|
||||||
|
|
||||||
|
def main(): |
||||||
|
wiki = wikipediaapi.Wikipedia("ru") |
||||||
|
animals = get_all_titles_from_category("Категория:Животные по алфавиту") |
||||||
|
# animals = get_all_titles_from_category("Категория:Знаменитые животные по алфавиту") |
||||||
|
result: dict = get_count_list_by_first_letter(animals) |
||||||
|
for names, count in result.items(): |
||||||
|
print(f"{names}: {count}") |
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__": |
||||||
|
main() |
@ -0,0 +1,127 @@ |
|||||||
|
tests = [ |
||||||
|
{ |
||||||
|
"data": { |
||||||
|
"lesson": [1594663200, 1594666800], |
||||||
|
"pupil": [ |
||||||
|
1594663340, |
||||||
|
1594663389, |
||||||
|
1594663390, |
||||||
|
1594663395, |
||||||
|
1594663396, |
||||||
|
1594666472, |
||||||
|
], |
||||||
|
"tutor": [1594663290, 1594663430, 1594663443, 1594666473], |
||||||
|
}, |
||||||
|
"answer": 3117, |
||||||
|
}, |
||||||
|
{ |
||||||
|
"data": { |
||||||
|
"lesson": [1594702800, 1594706400], |
||||||
|
"pupil": [ |
||||||
|
1594702789, |
||||||
|
1594704500, |
||||||
|
1594702807, |
||||||
|
1594704542, |
||||||
|
1594704512, |
||||||
|
1594704513, |
||||||
|
1594704564, |
||||||
|
1594705150, |
||||||
|
1594704581, |
||||||
|
1594704582, |
||||||
|
1594704734, |
||||||
|
1594705009, |
||||||
|
1594705095, |
||||||
|
1594705096, |
||||||
|
1594705106, |
||||||
|
1594706480, |
||||||
|
1594705158, |
||||||
|
1594705773, |
||||||
|
1594705849, |
||||||
|
1594706480, |
||||||
|
1594706500, |
||||||
|
1594706875, |
||||||
|
1594706502, |
||||||
|
1594706503, |
||||||
|
1594706524, |
||||||
|
1594706524, |
||||||
|
1594706579, |
||||||
|
1594706641, |
||||||
|
], |
||||||
|
"tutor": [ |
||||||
|
1594700035, |
||||||
|
1594700364, |
||||||
|
1594702749, |
||||||
|
1594705148, |
||||||
|
1594705149, |
||||||
|
1594706463, |
||||||
|
], |
||||||
|
}, |
||||||
|
"answer": 3577, |
||||||
|
}, |
||||||
|
{ |
||||||
|
"data": { |
||||||
|
"lesson": [1594692000, 1594695600], |
||||||
|
"pupil": [1594692033, 1594696347], |
||||||
|
"tutor": [1594692017, 1594692066, 1594692068, 1594696341], |
||||||
|
}, |
||||||
|
"answer": 3565, |
||||||
|
}, |
||||||
|
] |
||||||
|
|
||||||
|
|
||||||
|
def find_intersection(interval_A, interval_B) -> list: |
||||||
|
# если один из интервалов пустой, то пересечение будет пустым |
||||||
|
if not interval_A or not interval_B: |
||||||
|
return [] |
||||||
|
|
||||||
|
# если какой-то из инетрвалов имеет нулевую длину (начало=конец), |
||||||
|
# то пересечение пустое |
||||||
|
if interval_A[0] == interval_A[1] or interval_B[0] == interval_B[1]: |
||||||
|
return [] |
||||||
|
|
||||||
|
# нужно проверить, что интервалы вообще пересекаются |
||||||
|
# А и B не пересекаются, если |
||||||
|
# начало А > конец B, или если начало B > конец А |
||||||
|
if interval_A[0] > interval_B[1] or interval_B[0] > interval_A[1]: |
||||||
|
return [] |
||||||
|
|
||||||
|
# начало интервала = наименьший из начал интервалов А и B |
||||||
|
# конец интервала это наименьший из концов интервалов А и B |
||||||
|
interval_begin = max(interval_A[0], interval_B[0]) |
||||||
|
interval_end = min(interval_A[1], interval_B[1]) |
||||||
|
return [interval_begin, interval_end] |
||||||
|
|
||||||
|
|
||||||
|
def appearance(intervals): |
||||||
|
lesson = intervals["lesson"] |
||||||
|
pupil = intervals["pupil"] |
||||||
|
tutor = intervals["tutor"] |
||||||
|
|
||||||
|
# получаем все интервалы студента на уроке |
||||||
|
pupil_on_lesson = [ |
||||||
|
find_intersection(lesson, pupil[i : i + 2]) for i in range(0, len(pupil), 2) |
||||||
|
] |
||||||
|
print(f"{pupil_on_lesson=}") |
||||||
|
|
||||||
|
# по очереди сравниваем каждый из интервалов преподавателя с |
||||||
|
# каждым из интервалов пересечения студента на уроке |
||||||
|
tutor_on_pupil = [ |
||||||
|
find_intersection(pol, tutor[i : i + 2]) |
||||||
|
for i in range(0, len(tutor), 2) |
||||||
|
for pol in pupil_on_lesson |
||||||
|
] |
||||||
|
print(f"{tutor_on_pupil=}") |
||||||
|
|
||||||
|
# создаем список из продолжительности каждого интервала, если он |
||||||
|
# не пустой, а затем суммируем все элементы |
||||||
|
answer = sum([intr[1] - intr[0] for intr in tutor_on_pupil if intr]) |
||||||
|
print("----------------------------------------") |
||||||
|
return answer |
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__": |
||||||
|
for i, test in enumerate(tests): |
||||||
|
test_answer = appearance(test["data"]) |
||||||
|
assert ( |
||||||
|
test_answer == test["answer"] |
||||||
|
), f'Error on test case {i}, got {test_answer}, expected {test["answer"]}' |
Loading…
Reference in new issue