Принцип работы рекурсивный
Объяснение:
# В комментариях я использовал слово итерация в значении запуска новой функции с данными spos/ppos большими на 1 (аналогично с циклом for
# Ввод данных
s = input("Слово: ")
p = input("Шаблон: ")
# match возвращает True, если подстрока s, начинающаяся с позиции spos,
# соответствует шаблону (подстрока p, которая начинается
# с позиции ppos)
def match(spos, ppos):
if (spos == len(s)) or (ppos == len(p)):
return (spos == len(s) and ppos == len(p)) #когда все символы слова либо шаблона пройдены возвращается True, если и шаблон и слово пройдены полностью, в другом случае возвращается False
elif p[ppos] == '?':
return match(spos + 1, ppos + 1) #когда встречается ? начинается новая итерация
elif p[ppos] == '*': #проверка если подстрока - *
for i in range(spos, len(s)): #обход всех оставшихся символов слова
if match(i, ppos + 1):
return True #если дочерняя функция (вызванная выше) выдала True, цикл for заканчивается до выдавая True
else: #выполняется когда не встретилось */?
return (s[spos] == p[ppos]) and (match(spos + 1, ppos + 1))# проверка на равентсво соответствующих (по индексу) символов слова и шаблона и запуск новой функции (итерации)
if match(0, 0):
print('YES') #если результат функции True в консоль выводится 'YES', иначе 'NO'
else:
print('NO')
1) 9 км
Объяснение:
Транспортная задача (классика теории графов).
Населенные пункты - названия столбцов и строк. Число в пересечении строк и столбцов - расстояние между соответствующими населенными пунктами. Например, для нахождения расстояния между населенными пунктами E и D найдем пересечение строки E и столбца D. На пересечении стоит 1. Значит расстояние между этими населенными пунктами равно одному километру.
Поскольку движение между населенными пунктами двустороннее, длина пути из пункта E в пункт D, равна длине пути из пункта D в пункт E. По этой причине на пересечении строки E и столбца D стоит тоже значение, что и на пересечении строки D и столбца E. То есть матрица симметричная. Главная диагональ матрицы закрашена, поскольку маршрута из населенного пункта в самого себя не существует.
Вот, собственно и весь смысл приведенной таблицы.
Теперь по поводу задания: найти кротчайший путь от населенного пункта B в населенный пункт C.
Рассмотрим строку B (при желании можно и столбец, ведь матрица-то симметричная).
Единственный путь, который ведет из пункта B ведет в пункт A (никаких других значений в строке B нет).
Длина пути BA равна 3 км.
Посмотрим, куда можно попасть из пункта A.В строке A три значения:
1) |AB|=3 км
нам туда не надо, мы только что оттуда вышли
2) |AC|=7 км
Итак, у нас есть длина первого пути: |BC|=|BA|+|AC|=3+7=10 км.
3) |AF|=2 км
Из F можно вернуться в A и попасть в D. Из D можно попасть в С и в тот-же F. Получаем второй маршрут: |BC|=|BA|+|AF|+|FD|+|DC|=3+2+2+3=10 км.
Рассмотрим обратный путь из C в B.
Населенный пункт C соединен с тремя населенными пунктами: A,D и E.
Проезд через A и D мы рассмотрели, остается проезд через E.
|CB|=|CE|+|ED|+|DF|+|FA|+|AB|=1+1+2+2+3=9 км
Ну, вот мы и нашли кротчайший путь, из всех возможных.
// Внимание! Если программа не работает, обновите версию!
begin
var s1:=ReadlnString('Первое слово:');
var s2:=ReadlnString('Второе слово:');
// #1
Writeln('Задание 1) ',s1.Length>s2.Length?s1:s2);
// #2
if s1[1]=s1[2] then Writeln('Задание 2) ',s1);
if s2[1]=s2[2] then Writeln('Задание 2) ',s2);
// #3
Write('Задание 3) Более короткое слово ');
// предполагаем, что s1 более короткое.
// Если это не так, меняем их местами.
if s1.Length>s2.Length then Swap(s1,s2);
if pos(s1,s2)=0 then Write('не');
Writeln(' входит в более длиное');
// #4
s1:=s1.ToCharArray.Select((c,i)->i mod 2<>0?'a'+c:c).JoinIntoString('');
Writeln('Задание 4) ',s1);
// #5
Writeln('Задание 5) Сумма кодов (в UNICODE) для длинного слова: ',
s2.ToCharArray.Select(c->integer(Ord(c))).Sum)
end.
Примеры
Первое слово: Колокольчик однозвучный утомительно звенит
Второе слово: дно
Задание 1) Колокольчик однозвучный утомительно звенит
Задание 3) Более короткое слово входит в более длиное
Задание 4) дaно
Задание 5) Сумма кодов (в UNICODE) для длинного слова: 42383
Первое слово: ссора
Второе слово: рессора
Задание 1) рессора
Задание 2) ссора
Задание 3) Более короткое слово входит в более длиное
Задание 4) сaсоaра
Задание 5) Сумма кодов (в UNICODE) для длинного слова: 7589