Browse Source

Процесс

master
Дмитрий 3 years ago
commit
a14a1c2539
  1. BIN
      img/sample.png
  2. 80
      readme.org
  3. 28
      task_1.py
  4. 31
      task_2.py
  5. 127
      task_3.py

BIN
img/sample.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

80
readme.org

@ -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

28
task_1.py

@ -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("Не переданы аргументы!")

31
task_2.py

@ -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()

127
task_3.py

@ -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…
Cancel
Save