Алгоритмы

2 280 задачвместе с подтемами
Число у задачи — рейтинг сложности, слово рядом — насколько она трудна по сравнению с другими задачами такого же типа. Шкалы задач с ответом и задач с кодом между собой не сравниваются. Рядом — счётчики попыток: успешные, неуспешные.

 Найти все целые числа в строке. Число - это последовательность из одной или более цифр, которая:

  • Ограничена слева либо началом строки, либо нецифровым символом

  • Ограничена справа либо концом строки, либо нецифровым символом

  • Может начинаться с нуля (например, "012" считается числом)

  • Цифры могут повторяться


Формат входных данных
Строка, содержащая алфавитно-цифровые символы и знаки препинания. 

Формат выходных данных
Вывести все числа, находящиеся в данной строке. Все найденные числа вывести в одной строке через один пробел. Если чисел в строке нет, вывести None.
Формат входных данных
В первой строке записано натуральное число N - количество строк. Далее, записаны N строк в каждой из которых находится последовательность строчных английских букв. 

Формат выходных данных
Выведите N строк. В каждой строке необхоидимо вывести главсные буквы (aeiou), которые встречаются в соответствующей строке входных данных. Буквы должны быть выведены через пробел в том же порядке, что в исходной строке. Если в строке таких букв нет, то для такой строки необходимо вывести слово None.

 
Студент Павел недавно приобрёл себе подержанный автомобиль и теперь ездит на нём в университет. На его пути в вуз имеется один загруженный перекрёсток, проезд через который регулируется светофором. Сделав ряд поездок, Павел обнаружил интересную закономерность: пока на светофоре горит зелёный свет, через перекрёсток успевает проехать не менее a, но не более b машин. Сверху над перекрёстком установлена уличная видеокамера. Павел может подключиться к ней со своего смартфона и сосчитать количество машин n, которые стоят перед светофором впереди него (свою машину он тоже считает). Назовём тактом светофора включение на нём зелёного сигнала. Напишите программу, определяющую минимальный и максимальный номер такта, на котором Павел проедет перекрёсток.
Формат входных данных
Впервых двух строках входных данных записаны целые числа a и b (1 ≤a ≤ b ≤ 109). В третьей строке записано целое число n (1≤ n ≤ 109).
Формат выходных данных
Выведите два целых числа минимальный и максимальный номер такта светофора, на котором Павел проедет перекрёсток.

Замечание
В примере из условия перед светофором стоят 10 машин. Если через перекрёсток будут проезжать по 5 машин на зелёный свет, то Павел проедет на втором такте. Если же будут проезжать по 3 машины, то он проедет лишь на четвёртом такте.

Забор состоит из N одинаковых вертикальных досок. Некоторые из досок сгнили и нуждаются в замене, для каждой доски известно, нужно ли её заменить. Для ремонта забора можно использовать продающиеся в магазине щиты, которые бывают L разных видов: шириной в 1 доску, в 2 доски, ..., в L досок. Щит нельзя разрезать на части, то есть одним щитом можно заменить не более любых L подряд идущих досок. При этом можно менять не только сгнившие доски, но и хорошие.

Оказалось, что все щиты стоят одинаково, независимо от размера щита. Определите, какое наименьшее число щитов необходимо приобрести, чтобы починить весь забор.

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

Первая строка входных данных содержит целое число L (L > 0) – максимальный размер щита. Во второй строке входных данных записано целое число N (N > 0) – количество досок в заборе. Следующие N строк содержат по одному числу, равному 0 или 1. Число 1 обозначает, что соответствующая доска в заборе нуждается в замене, число 0 – что доска может быть сохранена.

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

Программа должна вывести одно целое число – минимальное число щитов, которое необходимо приобрести для ремонта всего забора.

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$

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

  • Возвращает: список строк (если нет групп) или список кортежей (если есть группы)

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

Для извлечения (сохранения) конкретной части совпадения используйте группы. 
Пример
import re

text = "Цена: 100 руб."

# Без группы
print(re.findall(r"\d+ руб", text))  # ['100 руб']

# С группой  
print(re.findall(r"(\d+) руб", text))  # ['100']
Группы ( ) нужны, чтобы вытащить только нужную часть из найденного текста!
 
Задание
Найти все ID товаров (формат: английская буква + цифра) и вывести список (в формате ['A1', 'B2'....], ID товаров в алфавитном порядке).

Файл ко всем заданиям модуля
66864#66864
Маша очень любила строить башенки из кубиков в детстве, но теперь она уже взрослая, потому башенки из простых кубиков её не интересуют. Она купила детали для башенки, которые представляют собой блок 3*3*1, который очень легко описать матрицей 3 на 3, так как толщина блока всего 1 кубик.
Маше точно известно, что:
  •  при использовании всех блоков, можно гарантированно построить башенку, которая не будет иметь пустот, включая нижнюю и верхнюю границы;
  •  используя все блоки, можно построить башенку только одним и не более способами;
  •  при строительстве башенки блоки нельзя вращать;
  •  только два блока во всём наборе имеют сплошную верхнюю или же нижнюю границу;
  •  глубина пустот в блоке может состоять из 1 или 2 элементов;
  •  блоков, имеющих пустоты, которые нельзя покрыть при сборе башенки не существует.
Напишите программу, помогающую Маше определить, в каком порядке нужно строить башню, исходя из всех ограничений, написанных выше.

Входные данные
В первой строке подаётся число N (1 <= N <= 10) – количество блоков для башенки, далее на 3*N строках вводится по 3 цифры через пробел(0 – у блока отсутствует элемент в этой позиции, 1 – сам блок), представляющие из себя N блоков, доступных для строительства.
Нумерация блоков начинается с 1 и увеличивается при описании каждого последующего блока (то есть первый блок, второй и так далее).
Выходные данные
Вывести в ответе в одну строку через пробел каждый элемент – номера блоков в порядке сбора башни снизу-вверх.

Пояснение
Пример №2

 
66860#66860
Компания “РудниК” хочет построить автономный рудодобывающий городок и ей необходимо рассчитать хватит ли её новому городу припасов на автономное существование в течении 100 месяцев. Для автономного существования городу необходимы: токарные изделия, электронные платы, бетон и еда. Изначально в городке находится по 30 единиц каждого ресурса. Каждые 10 месяцев в городок приходит по X единиц каждого ресурса. То есть при наступлении 10-го, 20-го, 30-го месяца и так далее. Чтобы автономно существовать без построек город потребляет по Y единицы каждого ресурса за месяц. Потребление ресурса происходит после поступления ресурсов с заводов и других источников. Если в какой-то месяц один из ресурсов кончится (станет равным 0 или меньше 0), то город закроют, а жителей вывезут. Рудодобывающий город начинает свой отсчёт с дня №1. Администрация города может строить здания, чтобы производить ресурсы самостоятельно:
  • - завод по переработке отходов. Стоимость 8 токарных изделий, 3 электронные платы, 10 бетона. Время строительства 5 месяцев. Каждые 2 месяца завод будет выдавать 5 бетона и 2 токарных изделия. Потребляет 3 токарных изделия каждые 5 месяцев. ID завода - 1.
  • - теплица. Стоимость 8 бетона и 5 токарных изделий. Время строительства 5 месяцев. Каждые 5 месяцев теплица будет приносить 7 еды. Потребляет 2 бетона каждые 10 месяцев. ID завода - 2.
  • - завод по производству электроники. Стоимость 6 электронных плат, 10 токарных изделий, 10 бетона. Время строительства 10 месяцев. Каждые 10 месяцев будет выдавать по 6 электронных плат. Потребляет 2 токарных изделия каждые 18 месяцев. ID завода - 3.
  • - завод по производству бетона. Стоимость 4 электронные платы, 8 токарных изделий, 8 бетона. Время строительства 8 месяцев. Каждые 8 месяцев будет выдавать по 8 бетона. Потребляет 1 токарное изделие и 1 электронную плату каждые 12 месяцев. ID завода - 4.
Завод начинает приносить доход или начинает вести отсчёт до выдачи новых ресурсов на следующий месяц после завершения его постройки или прошлой выдачи ресурсов. Если завод приносит ресурсы на n-ый месяц, на следующий n+1 месяц начинается отсчёт прихода ресурсов в новом цикле. Представим, что теплица начнёт строительство в 5-ый месяц, значит её строительство завершится на 9-ый месяц, производить ресурсы она будет с 10-го месяца, а первый “урожай” будет собран на 14-ый месяц. Администрация города может построить несколько заводов, если у неё хватает на это ресурсов. Можно начать строительство завода только, если на момент начала строительства все ресурсы есть в наличии. Месяц начала строительства завода полностью учитывается во времени его строительства. Только разные заводы/строения могут строится одновременно. Эффекты от нескольких заводов складываются.

Формат входных данных
На вход программа получает 2 числа 0<=X<=40, 1<=Y<=40, количество ресурсов, которые колония получается и тратит соответственно. И двумерный массив (каждый элемент на новой строке), размером 4 на 5, указывающий в какой месяц должно начаться строительство того или иного здания. Где по вертикали - ID строения/завода, а по горизонтали номер планируемой к строительству постройки. Каждую постройку могут построить максимально 5 раз. Если в столбце строения указано число 0, значит завод/строение не строится.

Формат выходных данных
На выходе программа должна выдать количество месяцев, которые город смог самостоятельно себя обеспечивать, если он просуществовал 100 месяцев, значит город признан успешным. На следующих строках вывести остаток ресурсов на момент завершения расчётов, не важно успешных или неуспешных. Числа могут принимать отрицательные значения.
Строка 1: Кол-во прожитых месяцев; 2: Токарных изделий; 3: Электронных плат; 4:Бетона; 5:Еды.

Современные компьютеры состоят из микроскопических транзисторов (электронных переключателей). Каждый из них может быть в двух состояниях:

  • 1 (ВКЛ) — есть ток → True

  • 0 (ВЫКЛ) — нет тока → False


Какое число соответствует True в двоичном коде?
1) 1
2) 0
66451#66451
Глеб очень любит компьютерные игры, потому решил впервые разработать свою игру. Он начал с чего-то максимально простого – матричного пинг-понга. Первым этапом Глеб решил сделать алгоритм, который будет считать количество набранных очков мячиком, который будет запускаться в матрице, состоящей из целых чисел.
Для того, чтобы протестировать алгоритм, Глеб указывает стартовую позицию мячика и его стартовое направление (число от 1 до 8). Мячик после прохождения через ячейку матрицы оставляет на её месте дыру, при попадании в будущем в которую игра заканчивается.
Стоит также учесть, что так как это пинг-понг, то мячик отталкивается от стенок, но в данной игре отражение действует по принципу угол отражения равен углу преломления + 45 градусов по часовой стрелке (при попадании в угол мячик отталкивается в обратном направлении + 45 градусов). Если мячик попадает в угол под углом 45 градусов, то он отражается обратно вектору попадания.
Стартовое направление мячика задаётся числом от 1 до 8. Направления представлены в виде матрицы ниже, где x – это текущая позиция мячика.
1 2 3
4 x 5
6 7 8

Входные данные
В первой строке подаются два числа N, M (1 <= N, M <= 100) – размер матрицы, далее на N строках по M целых чисел (от -10000 до 10000) вводится сама матрица. После вводится на одной строке стартовая позиция мячика (нумерация в матрице с 1), а на последней строке вводится стартовое направление мячика (число от 1 до 8).
Выходные данные
Вывести в ответе единственное число – количество набранных очков мячиком после старта.

Примечание
Пример №2: При старте из ячейки -5 по направлению 8 (в правый нижний угол), мячик ударится в угол, значит он должен отразиться в обратном направлении, но так как к углу отражения по правилам игры прибавляется 45 градусов по часовой стрелке, то мячик полетит по направлению не 1 (в левый верхний угол), а по направлению 2 (вверх). Далее отразится в обратном направлении от верхней стенки и попадёт в ячейку -5, на месте которой уже осталась дыра, потому игра окончится.
 
66402#66402
Риэлторская фирма “КвартирКа” решила добавить в своё приложение кредитный калькулятор для своих клиентов. На время тестирования нового обновления калькулятор был сделан более простым.

Формат входных данных
На входе программа получает ряд натуральных целых чисел, разделённых переносом строки: сумма кредита (10000<=x<=999999999), процентная ставка (годовая) ( 1<=x<=100), планируемая сумма для ежемесячного погашения кредита (10000<=x<=999999999).
Формат выходных данных
На выходе программа должна выдать возможно ли выплатить кредит по представленным параметрам в виде: “True” - если возможно, “False” - если невозможно и на следующей строке количество месяцев необходимое для выплаты кредита, если кредит выплатить невозможно следует вывести ноль.

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

Пример: сумма кредита - 50.000, процентная ставка 50%, планируемая сумма погашения 10.000. В первый месяц будут начислены процента на долг, который составит 25.000. В первый месяц вся сумма пойдёт на погашения процентов 25.000-10.000. Во второй месяц, аналогично 15.000-10.000. В третий месяц 5.000 уйдёт на погашение долга по процентам и 5.000 на погашение задолженности, остаётся выплатить 45.000. В четвёртый месяц 45.000-10.000. В пятый 35.000-10.000. В шестой 25.000-10.000. В седьмой 15.000-10.000. На восьмой месяц кредит будет полностью погашен, так как не было набрано 12 месяцев проценты более не начислялись.
66175#66175
Старшеклассник Дима собирает робота, который должен передвигаться по рельсам вокруг испытательного стенда. Всего робот умеет выполнять 12 различных команд, но для нас представляют интерес три из них, связанные с управлением манипулятором. Дима решил передавать роботу блоки инструкций в виде числа: робот получает число, переводит его в систему счисления с основанием 12 и выполняет соответствующие цифрам команды. Коды команд, отвечающих за манипуляторы робота, кратны четырём. На вход подаётся N чисел – блоков с наборами команд. В скольких блоках робот выполнил не менее M команд с манипулятором?

Формат ввода На вход программе в первой строке подается натуральное число N (N ≤ 10000) – количество наборов команд. Во второй строке подаётся целое неотрицательное число M (0 ≤ M ≤ 1000) – требуемое количество команд с манипулятором. Далее в N строках на вход подаётся по одному целому числу в диапазоне от 0 до 4*109 – блок команд, записанных в десятичной системе счисления.
Формат вывода Вывести одно целое число – в скольких блоках команд робот выполнил не менее M команд с манипулятором.
66169#66169
Одна очень известная компания Я&Ко захотела создать сеть доставок из ресторанов и кафе по всему городу, притом доставку производили бы мини-поезда. Главной проблемой стала логистика – как добраться из точки отправления в точку назначения самым быстрым способом. Но так как мини-поезда представляли собой только прототип, то в них был очень плохо проработан аккумулятор, что заставило компанию подумать про эту проблему тщательнее.
Я&Ко решили проложить рельсы между всеми точками доставки и по некоторым рельсам пустить зарядку, чтобы мини-поезда могли ехать и заряжаться. Компания решила устроить среди всех программистов, кто сможет решить их задачу, соревнование. Далее выбрать победителя, но как, пока неизвестно.
Задача состоит в следующем – есть известная карта маршрутов в городе, которая представлена в виде направленного взвешенного графа с возможными циклами. На каждом ребре графа даны значения времени перемещения между связанными вершинами и заряжает рельс или нет на этом маршруте.
За 1 минуту по рельсам зарядки мини-поезд заряжается на 10%. Если он зарядился, но всё ещё в пути на зарядных рельсах, то его заряд составляет 100%.
Для простоты расчёта количество минут мини-поезда после съезда с рельсов округляется вверх к ближайшему целому (например, поезд максимально может проехать 30 минут, что означает его 100% заряда, на рельс он заехал, когда у него осталось заряда на 10 минут, пусть время в пути по рельсу составило 4 минуты, значит зарядился он на 40%, что составляет 12 минут, потому после съезда с зарядного рельса у него останется запас хода на 10 + 12 = 22 минуты.
Задача – найти минимальное время, за которое мини-поезд сможет доехать до клиента со стартовой точки, если точно известно, что он это сделать сможет.

Входные данные
на первой строке подаются два целых числа (1 <= N,M <= 1000), где N – количество вершин графа, M - количество рёбер.
на второй строке подаётся целое число T (1 <= T <= 100), где T – время, которое может проехать полностью заряженный мини-поезд;
на третьей строке подаются через пробел два целых числа – номер стартовой вершины и номер конечной вершины;
далее на M строках подаются рёбра графа через пробел с указанием зарядный рельс на данном пути или нет (0 – не зарядный, 1 – зарядный) (<откуда> <куда> <время в пути> <признак зарядного рельса>).
Выходные данные
выведите на первой строке количество минут, которое понадобится мини-поезду, чтобы полностью доехать до клиента (конечной точки) в виде одного целого числа.

Примечание
•робот изначально заряжен на 100%.
 
66165#66165
Ученики Школы №1232 обожают все праздники в году, так как школа всегда организует очень много всяких интересных активностей: конкурсов, викторин, квизов и так далее. И в очередном из праздников учителя захотели сделать интересную викторину: ученики находились на поле, когда начинала играть музыка, они перемещались в хаотичном порядке, когда заканчивала, через колонки называлось число K, что означало, что ученикам нужно было объединиться в группы из K человек, кто не успел, выбывали из игры. Далее игра снова продолжалась с теми учениками, которые остались.
Проблемой этой игры составлял выбор – с кем объединиться каждому ученику, так как абсолютно все ученики были дружелюбными и знали друг друга в школе.
Учителя всегда интересуются тем, как поведут себя ребята в стрессовой ситуации, потому запустили заранее дрон над полем, картинка с которого передавалась в программу, которая преобразовывала после окончания музыки снимок учеников сверху в набор координат в плоскости OXY. Далее находилась пара самых близких друг к другу двух учеников.
Напишите программу, которая на основании преобразованного снимка в координаты, выведет имена двух учеников, которые наиболее близки по расстоянию друг к другу на момент окончания музыки.

Входные данные
На первой строке подаётся целое число N (2 <= N <= 106).
Далее на N строках подаются данные каждого ученика: его имя, координата X, координата Y, все через пробел (координаты всегда целые).
Координаты в диапазоне от -104 до 104.
Выходные данные
Вывести на одной строке через пробел два имени учеников, которые наиболее приближены друг к другу на всём поле, чем все остальные. Имена выводить в алфавитном порядке.
Примечание:
·имена учеников всегда на английском языке для удобстваобработки;
·имена учеников всегда состоят только из одного слова итолько из букв латинского алфавита, без спецсимволов и прочих знаков;
·на одной координате не может быть двух учениководновременно;
·если пар подходящих для ответа несколько, то вывести ту,которая максимально приближена к координате (0;0);
·если и таких пар несколько, то вывести любую.
66153#66153
Иван Фёдорович сыщик с очень большим стажем. Однажды в городе произошла серия больших ограблений. На местах ограбления не было обнаружено ни улик, ни зацепок. Однажды грабителей практически застали врасплох, но они смогли скрыться. На месте преступления Иван Фёдорович заметил, что грабители обронили папку с листком и набором картонных карточек, с вырезанными окошками на этих картах. Придя в офис и рассмотрев улики подробнее, было замечено, что на листке напечатана прямоугольная матрица, состоящая из цифр, а карточки все были размером с матрицу, притом отверстия, вырезанные в карточках, отображали какие-то случайные цифры из матрицы.
Иван Фёдорович вспомнил, что когда-то сталкивался с подобной схемой обозначения мест ограбления, что карточки помогали определить координаты следующего места ограбления. Потому Иван Фёдорович решил выписать координаты всех мест преступлений в виде долготы и широты, а далее найти карточки, которые соответствуют координатам следующих мест преступлений.
Помогите ему быстрее найти преступников, определив координаты следующих мест преступлений.
Координаты преступления собираются при помощи карточки следующим образом:
  • на матрицу накладывается карточка;
  • далее двигаясь по каждой строке по порядку слева-направо, выписываются цифры, которые попали в прорези;
  • цифр всегда 18, притом координаты всегда состоят из 8цифр (две целой части, шесть вещественной), значит два символа игнорируются и обозначают точку в вещественном числе в соответствующем порядке.
Пример матрицы и карточки (где белые участки – это вырезы (отверстия)).

Таким образом начинаем выписывать цифры по строкам слева-направо: 554755831378617673. Знаем, что цифр обозначающих координату 8, а две лишние – обозначающие запятые, получим координаты 55.755831 37.617673.
Также на каждой карточке Иван Фёдорович заметил на углу пометку, которая, как позднее он понял, определяет, как должна быть развёрнута карточка, так как метка должна при наложении всегда находиться в левом верхнем углу при взгляде на неё:
  • 1 – метка в левом верхнем углу карточки;
  • 2 – метка в правом верхнем углу карточки;
  • 3 – метка в правом нижнем углу карточки;
  • 4 – метка в левом нижнем углу карточки.
Входные данные
на первой строке подаётся целое число K (2 <= K <= 100) – количество преступлений, которые совершили грабители;
далее на K строках подаются координаты предыдущих мест преступлений в виде вещественных чисел с точкой, разделённых пробелом (например, 55.755831 37.617673)
на следующей строке подаются размеры матрицы и карточек в виде целых чисел N, M (5 <= N,M <= 1000), где N – количество строк матрицы, а M – количество столбцов;
далее на N строках подаются по M цифр матрицы;
после подаётся на новой строке целое число – количество карточек L (K < L <= 100); 
далее подаётся на одной строке L цифр от 1 до 4 через пробел, которые отображаются метки карточка в соответствии с порядком их появления;
затем L раз по N строк и M цифр подаются карточки по порядку их появления, которые содержат либо цифру 1 – обозначающую наличие прорези на ней, либо 0 – если прорези в этом месте на карточке нет.
Выходные данные
выведите все координаты будущих мест преступлений (каждую с новой строки), отсортировав их по возрастанию (если две координаты одинаковые по первой координате, то сортировать по возрастанию по второй), координаты одного места выводить через пробел.
Примечание:
·при выводе дробной части координат выводить всегда 6 знаков, если знаков меньше, то дополнять их незначащими нулями;
·если матрица прямоугольная, то гарантируется, что при совмещении метки на карточке с левым верхним углом матрицы, карточка совпадёт с размером матрицы;
·данные на карточках нельзя отзеркаливать (переворачиватькарточки не в плоскости OXY);
·гарантируется, что если даны метки на карточках, то при повороте карточка совпадёт с размером матрицы, не будет такого, что карточка будет иного размера, чем матрица.
Поделиться
Класснуть