Постановка задачи:
Захар следит за веб-сервером сайта своей компании и отвечает за его работоспособность. Чтобы распознавать ошибки, он написал код, который каждую секунду фиксирует состояние сервера и записывает в текстовый документ статус. Статусы, которые фиксирует код: 1. P – успешно выполненный POST-запрос 2. G – успешно выполненный GET-запрос 3. W – ожидание сервера без возникновения ошибки (wait) 4. E – ошибка сервера (error) Статусы сервера за каждую секунду фиксируются в файле друг за другом без пробелов и других знаков-разделителей. Код Захара фиксировал состояние сервера весь день (ровно с 00:00 до 00:00 следующего дня). Результаты работы кода представлены в файле «server.txt». Определите самый длинный вечерний интервал времени (17:00-22:00), в который не было ошибок и ожиданий сервера. Ответ дайте в секундах.
Ответ:
Для решения этой задачи необходимо проанализировать статусы сервера за каждую секунду в интервале времени с 17:00 до 22:00 и определить самый длинный период, в течение которого не было ошибок и ожиданий сервера.
Примерный алгоритм решения задачи:
- Прочитать данные из файла «server.txt» и выделить только статусы сервера с 17:00 до 22:00.
- Проанализировать эти статусы и определить самый длинный период без ошибок и ожиданий сервера.
- Вычислить длительность этого периода в секундах.
Примерный код на Python для решения данной задачи (найти самый длинный вечерний интервал времени без ошибок и ожиданий сервер):
# Чтение данных из файла "server.txt"
with open("server.txt", "r") as file:
data = file.read()
# Выделение статусов сервера с 17:00 до 22:00
data = data[61200:79200] # 17:00 - 22:00 (в одном дне 86400 секунд)
# Разделение статусов сервера на секунды
statuses = [data[i:i+1] for i in range(0, len(data), 1)]
# Поиск самого длинного периода без ошибок и ожиданий сервера
max_interval = 0
current_interval = 0
for status in statuses:
if status == "W" or status == "E":
current_interval = 0
else:
current_interval += 1
max_interval = max(max_interval, current_interval)
# Вывод результата
print("Самый длинный вечерний интервал времени без ошибок и ожиданий сервера:", max_interval, "секунд")
157. Захар и загадочные совпадения
Анонимный поклонник прислал Захару json с некоторой информацией. Вот несколько строк из этого файла:
[
{"date": '2018-09-01', "name": "Sholay", "count": 116},
{"date": '2018-09-01', "name": "Dangal", "count": 94},
{"date": '2018-09-03', "name": "Dangal", "count": 56}
]
Захар бегло взглянул на файл и вздохнул.
Он понял, что в день, когда максимальное на данный день значение поля count было минимально, случился потоп у его соседей.
Когда случился потоп у соседей Захара?
Формат ввода
Тестирование производится на нескольких тестовых наборах. Решение должно читать входные данные из файла data.json. В файле содержится корректное представление массива данных с полями date, name, count.
Размер входного файла не превышает 600Кб.
Формат вывода
Найдите все даты, когда у соседей Захара мог случиться потоп. Выведите найденные даты по одной в строке в порядке возрастания.
Ограничения Ограничение времени 3 с
Ограничение памяти 64 МБ
Пример 1
Ввод
[ {"date": "2018-09-01", "name": "Sholay", "count": 116},
{"date": "2018-09-01", "name": "Dangal", "count": 94},
{"date": "2018-09-03", "name": "Dangal", "count": 56} ]
Вывод 2018-09-03
Пример 2
Ввод
[ {"date":"2018-09-01", "name":"Sholay","count":1},
{"date":"2018-09-02","name":"Dangal","count":1},
{"date":"2018-09-03","name":"Dangal","count":1}]
Вывод
2018-09-01
2018-09-02
2018-09-03
Пример 3
Ввод
[]
Вывод
Для решения задачи нужно найти дни, в которые минимальное значение count среди всех записей этого дня является максимальным относительно других дней. То есть мы ищем такие дни, где значение count, которое меньше всего для данного дня, больше, чем наименьшие значения count для остальных дней.
Вот пошаговый план действий:
Прочитать JSON-файл и преобразовать его в список словарей Python.
Пройти по каждому дню и вычислить минимальное значение поля count.
Найти максимальный минимум среди всех дней.
Вернуть те дни, для которых минимальный count равен этому максимуму.
Теперь перейдем к реализации:
import json
# Чтение данных из файла
with open(‘data.json’) as f:
data = json.load(f)
if not data:
# Если файл пуст, просто выводим пустой результат
print()
else:
# Группируем записи по датам
dates_to_counts = {}
for entry in data:
date = entry[‘date’]
count = entry[‘count’]
if date not in dates_to_counts:
dates_to_counts[date] = []
dates_to_counts[date].append(count)
# Находим минимальный count для каждого дня
min_count_by_date = {date: min(counts) for date, counts in dates_to_counts.items()}
# Ищем максимальный минимум среди всех дней
max_minimum = max(min_count_by_date.values())
# Выбираем только те дни, где минимальный count равен этому максимуму
flood_dates = [date for date, value in min_count_by_date.items() if value == max_minimum]
# Сортируем даты и выводим их построчно
for date in sorted(flood_dates):
print(date)
Объяснение кода:
Чтение данных: Мы загружаем содержимое JSON-файла с помощью функции json.load() и сохраняем его в переменную data. Если файл пустой, программа выводит пустую строку.
Группировка по датам: Создаем словарь dates_to_counts, который хранит списки значений count для каждой даты.
Минимальные значения для каждого дня: Для каждой даты находим минимальное значение count и сохраняем это в новый словарь min_count_by_date.
Поиск максимального минимума: Определяем максимальную величину среди всех минимальных значений (то есть максимальный минимум).
Выбор подходящих дат: Из списка дат выбираются те, для которых минимальное значение count равно найденному максимуму.
Сортировка и вывод: Даты сортируются по возрастанию и выводятся по одной в строке.
Этот алгоритм решает задачу за линейное время от количества записей в файле, что укладывается в ограничения по времени и памяти.
import sys
from collections import defaultdict
def main():
# Считываем данные из стандартного ввода
lines = sys.stdin.read().strip()
if not lines:
# Если ввод пустой, ничего не делаем
return
# Парсим JSON из строки
try:
data = eval(lines)
except Exception:
# Обрабатываем случай, если строка не может быть распарсена как JSON
print(«Ошибка при парсинге данных»)
return
# Группируем записи по датам
dates_to_counts = defaultdict(list)
for entry in data:
date = entry[«date»]
count = entry[«count»]
dates_to_counts[date].append(count)
# Находим минимальный count для каждого дня
min_count_by_date = {date: min(counts) for date, counts in dates_to_counts.items()}
# Ищем максимальный минимум среди всех дней
max_minimum = max(min_count_by_date.values())
# Выбираем только те дни, где минимальный count равен этому максимуму
flood_dates = [date for date, value in min_count_by_date.items() if value == max_minimum]
# Сортируем даты и выводим их построчно
for date in sorted(flood_dates):
print(date)
if __name__ == «__main__»:
main()
Объяснение кода:
Чтение данных: Используем sys.stdin.read().strip() для получения всей информации из стандартного ввода. Это позволяет считать весь текст целиком.
Парсинг JSON: Преобразовываем введенные данные в формат JSON с использованием функции eval(). Этот метод подходит для простых случаев, но следует помнить о возможных рисках безопасности при использовании eval() с непроверенными данными.
Обработка ошибок: Добавлена обработка исключений на случай, если строка не может быть правильно интерпретирована как JSON.
Основная логика: Остальная часть программы остается такой же, как в предыдущем решении – группировка по датам, поиск минимального значения count для каждого дня, определение максимального минимума и выбор соответствующих дат.
Вывод результата: Даты сортируются и выводятся одна под другой.
Таким образом, этот скрипт должен корректно работать с данными, поступающими через стандартный ввод.