Конечные автоматы

18 задач
Число у задачи — рейтинг сложности, слово рядом — насколько она трудна по сравнению с другими задачами такого же типа. Шкалы задач с ответом и задач с кодом между собой не сравниваются. Рядом — счётчики попыток: успешные, неуспешные.
СЕКРЕТНО
Дело VOIDLINKER · Эпизод 2 из 13
Хронометраж
ИСТОЧНИК: darknet.onion / 31.10.2026 14:38
ИЗ ПЕРЕХВАЧЕННОЙ ПЕРЕПИСКИ:
«Я работал ровно пятнадцать минут: с 14:00:00 до 14:15:59. Всё, что вне этого окна — твои false positives, аналитик. Если найдёшь все мои моменты в логе — может, подскажу, куда ушли деньги. Может. — V.»
ФОРМАЛЬНАЯ ЗАДАЧА

В журнале событий найди все временные метки формата YYYY-MM-DD HH:MM:SS, где дата ровно 2026-10-31 и время в окне 14:00:0014:15:59 включительно. Выведи их по одному на строку, в порядке появления.

ВХОДНЫЕ ДАННЫЕ

Произвольный текст до 105 символов.

ВЫХОДНЫЕ ДАННЫЕ

Каждый timestamp на отдельной строке.

СЕКРЕТНО
Дело VOIDLINKER · Эпизод 1 из 13
Первый след
ИСТОЧНИК: darknet.onion / #incident-leak / 31.10.2026 14:09
ИЗ ПЕРЕХВАЧЕННОЙ ПЕРЕПИСКИ:
«Junior, ты только сел за свой access.log, да? Я уже пробежал по твоей сети с десятка адресов. Они там, прямо перед твоим носом. Спорим, ты не вытащишь их все? Я даже не маскировал IP — просто чтобы ты попотел над регулярками. — V.»
ФОРМАЛЬНАЯ ЗАДАЧА

На стандартный вход подан произвольный текст лога. Найди все IPv4-адреса и выведи их по одному на строку в порядке появления (включая повторы). IPv4-адрес — четыре числа от 0 до 255 без ведущих нулей, разделённые точками (192.168.0.1 — да, 192.168.001.1 — нет).

ВХОДНЫЕ ДАННЫЕ

Произвольный текст в UTF-8 (несколько строк, до 105 символов).

ВЫХОДНЫЕ ДАННЫЕ

Каждый IPv4-адрес на отдельной строке. Если адресов нет — пустой вывод.

Ты копишь на подержанный велосипед и мониторишь Авито. Скопировал тексты объявлений в один файл и хочешь посчитать статистику по ценам.

Цены написаны по-разному: 15 000 ₽, 15000 руб, 15.000 р., от 14000 до 16000 рублей.

Формат входных данных

Произвольный текст до 10 000 символов, возможно в несколько строк. Цена — число от 1000 до 1 000 000 с возможными разделителями тысяч (пробел или точка), сразу за которым стоит обозначение рубля: , р, р., руб, руб., рубль, рублей, рубля или рубли.

Числа вне диапазона \([1000, 1\,000\,000]\) при статистике игнорируются.

Формат выходных данных

Ровно четыре строки:

min: <минимум>
max: <максимум>
avg: <среднее>
count: <количество>

Среднее — округлить до целого. Если цен не найдено, в первых трёх строках вместо чисел поставить дефис -, а в последней — 0.

Ты готовишь скриншот переписки с репетитором для публикации в Instagram-сторис и хочешь замаскировать номера телефонов: оставить префикс (+7 или 8) и последние 2 цифры, а между ними поставить ровно 8 звёздочек.

Например: +7 (903) 123-45-67 превращается в +7********67.

Формат входных данных

Произвольный текст до 10 000 символов, возможно в несколько строк. Телефоны — российские мобильные в любом из форматов задачи 3.

Формат выходных данных

Тот же текст, но с заменёнными телефонами. Весь остальной текст (пунктуация, пробелы, переносы строк) сохраняется.

Классный руководитель попросил собрать все email-адреса из чата родителей в один список: без дубликатов, в едином регистре и в алфавитном порядке.

Формат входных данных

Произвольный текст до 10 000 символов, возможно в несколько строк.

Формат выходных данных

Каждый уникальный email-адрес на отдельной строке в нижнем регистре, отсортированный лексикографически.

Примечание

Упрощённый формат email: имя@домен.зона, где имя — буквы, цифры, точки, дефисы, подчёркивания; домен — буквы, цифры, дефисы (без точек); зона — 2–6 латинских букв.

🎓
Шаг 8: GPA для Германии?!
Сложно
Вася решил подстраховаться и подать документы ещё в TU München. Анкета на немецком, всё страшно, но главное — они просят оценки в шкале 0–100. У Васи: в аттестате 5/5, в Coursera-сертификатах 87%, в одной программе обмена GPA: 3.85. Помоги ему всё конвертировать.
Условие задачи
 

Приведи все оценки к шкале 0–100:

  • Проценты (87%) — число до знака % без изменений.
  • Российская 5-балльная (4/5) — \(\text{балл}/5 \times 100\) (целая часть).
  • GPA (GPA: 3.6) — \(\text{GPA}/4{,}0 \times 100\), округлить функцией round() Python.
Входные данные

Одна строка с оценками, разделёнными запятой и пробелом. Префикса перед оценками нет.

Выходные данные

Целые числа от 0 до 100, по одному на строке.

Подсказка: Раздели строку по ", " и для каждой части примени поочерёдно три регулярных выражения: (\d+)%, (\d)/5, GPA:\s*(\d\.\d+).
🏆
Шаг 2: Регистрация на олимпиаду
Просто
Вася регистрируется сразу на пять олимпиад: «Высшая проба», «Ломоносов», «Турнир городов»… У него три почты: рабочая, школьная и одна старая, которую он завёл в 5 классе ради игры. Плюс ещё мамина — на неё приходят уведомления, потому что мама так захотела. Вася записал все свои email в один файл, но потом перепутал, какие из них рабочие. Помоги вытащить все валидные.
Условие задачи
 

Email состоит из:

  • имени из латинских букв, цифр и точек,
  • символа @,
  • домена из латинских букв, цифр и точек,
  • точки и доменной зоны из 2–4 латинских букв.
Входные данные

Одна строка произвольного текста.

Выходные данные

Все найденные email-адреса, по одному на строке.

Подсказка: [a-zA-Z0-9.]+@[a-zA-Z0-9.]+\.[a-zA-Z]{2,4}. Точку перед зоной нужно экранировать: \..
🎓
Шаг 8: Три шкалы — одна голова
Сложно
Маша снова на связи! Теперь она прислала свои оценки. Из российской школы — 5/5, из онлайн-курса Coursera — 87%, а из американской летней программы — GPA: 3.85. Приёмная комиссия Гарварда смотрит на это как на «криптозагадку из эпохи майя». Помоги Маше: приведи всё к шкале 0–100, чтобы хоть кто-то понял её средний уровень.
Условие задачи
 

Приведи все оценки к единой шкале 0–100:

  • Проценты (87%) — число до знака % без изменений.
  • Российская 5-балльная (4/5) — \(\text{балл}/5 \times 100\) (целая часть).
  • GPA (GPA: 3.6) — \(\text{GPA}/4{,}0 \times 100\), округлить функцией round() Python.
Входные данные

Одна строка с оценками, разделёнными запятой и пробелом. Префикса перед оценками нет.

Выходные данные

Целые числа от 0 до 100, по одному на строке, в порядке появления.

Подсказка: Раздели строку по ", ", для каждой части примени поочерёдно три регулярных выражения: (\d+)%, (\d)/5, GPA:\s*(\d\.\d+).
🌐
Шаг 7: Карта мира университетов
Средне
Подруга Алисы — Маша — решила поступать и в Россию, и за границу одновременно. Она прислала тебе текстовый файл с десятками ссылок: МГУ, ВШЭ, MIT, Oxford, ETH Zurich… В таком объёме легко запутаться. Маша просит сделать чистый список доменов, «без всяких этих https и www, чтобы влезло на одну страницу». Маша знает, чего хочет.
Условие задачи
 

Извлеки только доменное имя без префикса www. и без пути.

Формат URL: http:// или https://, затем опционально www., затем доменное имя (буквы, цифры, точки), затем опционально / и путь.

Входные данные

Одна строка текста с URL-ами.

Выходные данные

Доменные имена без www., по одному на строке, в порядке появления.

Подсказка: Группа захвата: https?://(?:www\.)?([a-zA-Z0-9.]+?)(?=[/\s]|$). (?:...) — группа без захвата, (?=...) — lookahead.
📋
Шаг 1: Хаос в приёмной комиссии
Просто
Привет, абитуриент! Сейчас сентябрь, ты только что устроился стажёром в приёмную комиссию МГУ. В первый же день тебе вручают флешку с базой студентов и говорят: «Разберись». Открываешь файл — а там полный бардак: ID студентов, шутки в чате, чьи-то заметки и даже рецепт борща. Надо извлечь только настоящие ID.
Условие задачи
 

Каждый ID студента имеет строгий формат: ровно две заглавные латинские буквы и ровно четыре цифры подряд. Например, AB1234, MK0001, PR2024.

Дана одна строка текста (до 10 000 символов). Извлеки из неё все валидные ID и выведи их по одному на строке в порядке появления.

Входные данные

Одна строка произвольного текста.

Выходные данные

Все найденные ID, по одному на строке. Если ID не найдены — пустой вывод.


Беси играет в видеоигру. В этой игре 3 буквы 'A', 'B', 'C' - все управление. Эти буквы можно нажимать в любом порядке, однако возможны только N (1<=N<=20) различных комбинаций. Комбинация I представлена строкой Si с длиной от 1 до 15 символов, содержащей только символы 'A', 'B', 'C'.
Когда Беси нажимает комбинацию букв, соответствующую какой-то из введенных строк, она получает один балл. Комбинации могут перекрываться и даже заканчиваться одновременно. Например, если N=3 и три возможные комбинации есть "ABA", "CB" и "ABACB", а Беси набрала ABACB, она получит 3 балла. Беси может получать очко за каждую комбинацию более чем один раз.
Беси конечно хочет заработать как можно больше баллов. Если она нажмет ровно K (1<=K<=1000) клавиш, какое максимальное количество баллов она может заработать?
PROBLEM NAME: combos
Формат входных данных
* Строка 1:Два разделенных пробелом целых числа: N и K.
* Строки 2..N+1: Строка i+1 содержит только одну строку Si, представляющую комбинацию i.
Формат выходных данных
* Строка 1: Одно целое число, максимальное количество баллов, которое может набрать Беси


Примечание
Оптимальная последовательность клавиш есть ABACBCB, которая дает 4 балла 1 от ABA, 1 от ABACB, и 2 от CB.

re.fullmatch(pattern, string) - проверяет совпадение ВСЕЙ строки с шаблоном.

Возвращает: объект Match или None

Использование: match = re.fullmatch(r'\d+', text)
 


 Проверить, что строка является корректным ID товара:

  • Формат: [Категория][Номер][Версия]
  • Категория: 1 буква (A-Z)
  • Номер: 1-3 цифры
  • Версия: необязательная, начинается с '-v' и 1-2 цифры
Программа на вход получает строку и должна вывести True, если ID товара корректен и False в противном случае.

re.match(pattern, string) - проверяет совпадение ТОЛЬКО в начале строки.

  • Возвращает: объект Match или None
  • Использование: match = re.match(r'\d+', text)

 

Задача: Проверить, что строка начинается с корректного формата лог-записи:

  • Дата: ГГГГ-ММ-ДД
  • Время: ЧЧ:ММ:СС
  • Уровень логирования: INFO, WARN, ERROR, DEBUG
В этой задаче на вход подается одна строка. Вам нужно вывести True если начало строки совпадает с шаблоном и False в противном случае.
 

re.search(pattern, string) - находит ПЕРВОЕ совпадение с шаблоном в строке.

  • Возвращает: объект Match или None
  • Использование: match = re.search(r'\d+', text)

Найти первый товар из категории Electronics и вывести его название и цену в одной строке через пробел. 

Например (только для понимания формата вывода), 
DVD 34.5$
ДКА#55461
Напишите программу, моделирующую работу детерминированного конечного автомата (ДКА). Описание автомата и входная строка вводятся на стандартном потоке ввода. Результат работы автомата над данной строкой выводится на стандартный поток вывода.

Входные данные
Описание автомата задаётся в следующей форме. Сначала задаётся функция перехода автомата. Функция перехода задаётся в виде троек CUR CHAR NEW, где CUR — идентификатор исходного состояния — произвольная символьная строка, не содержащая пробельные символы. CHAR — символьная строка длиной ровно 1 символ. NEW — идентификатор целевого состояния — произвольная символьная строка, не содержащая пробельные символы. Элементы описания перехода могут отделятся друг от друга произвольным количеством пробельных символов. Описание функции перехода завершается строкой "END" в качестве идентификатора исходного состояния. Элементы CHAR и NEW отсутсвуют.

Далее перечисляются заключительные состояния автомата. Каждое состояние — это символьная строка. Список состояний завершается символьной строкой "END". Далее задаётся начальное состояние автомата — символьная строка. Затем задаётся проверяемое слово — символьная строка. Все элементы входного файла могут отделяться друг от друга произвольным количеством пробельных символов. Можете предполагать, что входные данные корректны, то есть удовлетворяют спецификации и действительно задают детерминированный конечный автомат.

Выходные данные
Результат работы автомата должен быть напечатан в следующем виде. Сначала напечатайте число 1, если данный автомат допускает данную цепочку, и 0 в противном случае. Затем напечатайте количество символов, прочитанных во входной цепочке к моменту принятия автоматом решения. Наконец, напечатайте идентификатор состояния, в котором в данный момент находился автомат.
Электронная таблица представляет собой прямоугольную таблицу, левая и верхняя граница которой зафиксированы, а правая и нижняя отсутствуют, таким образом, таблица бесконечна вправо и вниз. В каждой ячейке таблицы может быть записано какое-либо значение. Значение ячейки – это произвольная последовательность символов с кодами от 32 до 126.

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

Значения соседних ячеек при записи в файл разделяются между собой символом ","(запятая), строки таблицы отделяются друг от друга символом ";" (точка с запятой). После последней клетки идет символ "." (точка). За каждым из этих символов может немедленно следовать один перевод строки, который должен игнорироваться. Другие переводы строки во файле не встречаются.

Если в значении ячейки встречается один из символов ",", ";", ".'"или "\", то в файл записывается два символа – сначала "\", а затем данный символ. Соответственно, запятая, точка с запятой и точка, которые идут непосредственно после "\", не являются разделителями значений ячеек. В частности, после них не может следовать перевода строки.

Каждая ячейка относится к одному из трех типов: числовая, строковая, пустая. Пустая ячейка – это ячейка, значение которой является пустой строкой. Числовая ячейка содержит целое число из диапазона от -32768 до 32767 включительно. Число должно быть записано без ведущих нулей и лишних знаков "+" или "-" (знак "-'" должен быть только у отрицательных чисел, причем ровно один). Любая другая ячейка относится к строковому типу. Так, например, к строковому типу относятся ячейки, содержащие следующие значения: 01 (включает ведущий нуль), 55000 (не входит в указанный диапазон), а также ячейка, содержащая один символ "пробел".

Столбец таблицы называется пустым, если все ячейки, которые он содержит – пустые. Столбец таблицы называется числовым, если он содержит только числовые и пустые ячейки. В противном случае столбец называется строковым. Требуется для каждого столбца таблицы, начиная с первого, и до последнего непустого, определить, к какому типу он относится.

Входные данные
На вход программы поступает электронная таблица, размер входных данных не превышает 32767 байт.

Выходные данные
Для всех столбцов, начиная с первого, и до последнего непустого столбца, выведите их тип, разделив значения запятыми, и в конце поставьте точку. В качестве типа столбца выведите одно из следующих значений: "EMPTY'', если столбец является пустым, "NUMBER'', если столбец является числовым, "STRING'', если столбец является строковым.
Телевидение Флатландии готовится показать в вечернем эфире выступление одного известного политика. Поскольку политик известен своей несдержанностью, решено было написать специальную программу, которая вырезала бы из речи политика некоторые фразы, запуская в этот момент рекламу.

Поскольку ввести все неполиткорректные слова в программу представляется довольно сложным, решено было использовать эвристический алгоритм определения адекватности фразы.

Речь политика в реальном времени оцифровывается, распознается и подается на вход программе как последовательность фраз. Каждая фраза состоит из слов, записанных в одну строку. Слово представляет собой последовательность символов, ограниченную с обеих сторон границами фразы, пробелами или знаками препинания (символами «.», «!», «?», «:», «-», «,», «;», «(» или «)»).

Слово считается подозрительным, если в него входит не более трех различных букв (любой символ, кроме пробелов и знаков препинания считается буквой, большие и маленькие буквы считаются различными). Например, слова «дом», «мама» или «шалаш» являются подозрительными, а слова «привет», «Шалаш» или «hello» – нет.

Фраза считается подозрительной, если не менее половины слов в ней подозрительны (каждое вхождение слова во фразу считается отдельно).

Напишите программу, которая процензурирует речь политика, удалив из нее все подозрительные фразы.

Формат входных данных 

Вводится не более 1000 фраз, каждая из которых представляет собой строку не длиннее 250 символов. Фраза содержит только символы с ASCII кодами от 32 до 255.

Формат выходных данных

Выведите все фразы из входных данных, которые не являются подозрительными. Фразы следует выводить в том же порядке, в котором они поступали на вход программы.
T2005#53605
Клавиатура сотового телефона выглядит так:
1 — пробел 2 — abc 3 — def
4 — ghi 5 — jkl 6 — mno
7 — pqrs 8 — tuv 9 — wxyz

Режим ввода T2005 устроен следующим образом. В телефоне есть словарь. Пользователь, чтобы ввести слово, последовательно нажимает клавиши, на которых написаны буквы этого слова. Например, чтобы ввести слово begin пользователь должен нажимать клавиши 23446. Но как только в словаре оказывается только одно слово с таким началом, это слово автоматически подставляется и, кроме того, после этого слова автоматически добавляется пробел. Например, пусть пользователь нажал клавиши 234, и оказалось, что слов, ввод которых начинается с нажатия именно этих клавиш, — ровно одно. Тогда автоматически подставится это слово и пробел после него, а все последующие нажатия клавиш уже будут относиться к вводу следующего слова.

Если для ввода какого-то слова нужно нажать последовательность клавиш, которая может являться началом какого-то другого слова, то после ввода этого слова нужно нажать клавишу 1, что соответствует вводу пробела. При вводе пробела считается, что вы ввели все слово целиком (а не только какое-либо его начало). Если после ввода пробела оказалось, что в словаре такой последовательности клавиш удовлетворяет несколько слов, подставляется первое из них в алфавитном порядке. Если (опять же после ввода пробела) оказалось, что в словаре нет слова, которое может быть введено такой последовательностью клавиш, то все, что было введено после предыдущего пробела (введенного или автоматически подставленного, или, если в тексте ранее не встречалось ни одного пробела — от начала текста) удаляется. Если после ввода пробела (как нажатием "1", так и автоподстановкой) или в начале текста нажимается клавиша "1", то ее нажатие игнорируется.

Вам дан словарь и последовательность нажатий клавиш. Выведите текст, который был введен пользователем.

Примечание: в тексте используются только маленькие латинские буквы и символ пробел.

Входные данные
Сначала на вход программы поступает число N — количество слов в словаре (2≤N≤100000). В следующих N строках задается словарь. Каждое слово записано в отдельной строке. Слова расположены в алфавитном порядке. Никакое слово в словаре не встречается дважды. Длина каждого слова не превосходит 10 символов.

Далее вводится число M — количество нажатий клавиш (1≤M≤20000). Затем задается M разделяющихся пробелами чисел, описывающих нажатые клавиши. Последней нажатой клавишей всегда является клавиша "1".

Выходные данные
Выведите одну строку — текст, который оказался введен пользователем. Пробел после последнего введенного слова также должен быть выведен.

Примечание:
2
a
z
2
5 1                                        
Примечание: в этом примере выходной файл должен быть создан, но должен быть пустым, в частности, в него не нужно выводить пробел

 
Поделиться
Класснуть