Базовые алгоритмы используемые в решении.
Задача 2
Шаблон задания
Логическая функция F задаётся выражением. Например ((x → y ) ≡ (z → w)) ∨ (x ∧ w).
Дан частично заполненный фрагмент, содержащий неповторяющиеся строки таблицы истинности функции F.
Определите, какому столбцу таблицы истинности соответствует каждая из переменных x, y, z, w.
print("x y z w")
for x in range(0,2):
for y in range(0,2):
for z in range(0,2):
for w in range(0,2):
if 'переведенное в язык Python условие':
print(x, y, z, w)
Правила перевода условия в язык Python:
Логическая операция |
python |
Отрицание ¬ |
not() |
Логическое умножение ∧ |
and |
Логическое сложение ∨ |
or |
Следование X ⟶ Y |
x <= y |
Равносильность ≡ |
== |
Задача 5
5.1 Десятичное преобразование
Шаблон задания
Автомат получает на вход число. По этому числу строится новое число по следующим правилам.
1. Складываются / вычитаются / умножаются определенные цифры числа
2. Из полученных чисел выбираются определенные числа и соединяются подобно строкам для получения выходного числа
Укажите наименьшее/наибольшее число, при обработке которого автомат выдаёт определенный результат.
# Перебираем входные числа n
for n in range(0,100):
# 1. Преобразовать число в строку, для получения цифр числа
s = str(i)
# 2. Из цифр получаем новые числа
s1 = int(s[0]) + int(s[1])
s2 = int(s[1]) + int(s[2])
#3. Из полученных чисел строим выходное число соединяя их как строки
r = str(s1) + str(s2)
#4. Проверяем получили ли мы нужное нам выходное число r
if r == '1111':
# Сообщаем входное число n
print(n)
5.2 Двоичное преобразование
Шаблон задания
На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом.
1. Строится двоичная запись числа N.
2. К этой записи дописываются справа / слева ещё цифры по определенному правилу:
а) складывают / вычитаются цифры. Получают остаток от деления на 2;
б) дописываются к двоичной записи числа слева или справа
Получили таким образом какое то двоичное число и переводим его в десятичное — это и есть выходное число R.
Укажите минимальное число N, после обработки которого с помощью этого алгоритма получается число, большее, чем 85. В ответе запишите это число в десятичной системе счисления.
# Перебираем входные числа N
for n in range(1,100):
# 1. Переводим в двоичную запись и преобразовать число в строку, для получения цифр числа
a = bin(i)[2:]
s = str(a)
# 2. Из цифр получаем двоичную запись нового число R (r_bin)
k = 0
for i in s:
k = k + int(i)
s1 = str(k%2)
r_bin = s + s1
# 3. Получаем десятичную запись числа R
r = int(r_bin,2)
#4. Проверяем получили ли мы нужное нам выходное число r
if r > 85:
# Сообщаем входное число n
print(n)
Может потребоваться функция для удаления лидирующих нулей: s.strip(«0»)
Задача 6
6.1 Найти количество точек внутри фигуры
Шаблон задания
Черепахе был дан для исполнения следующий алгоритм:
Направо 315
Повтори 7 [Вперёд 16 Направо 45 Вперёд 8 Направо 135]
Определите, сколько точек с целочисленными координатами будет находиться внутри фигуры, ограниченной заданным алгоритмом линиями, не включая точки на линиях.
# Импортируем модуль черепашки
import turtle
# Устанавливаем максимальную скорость
turtle.tracer(0)
# Устанавливаем шаг. Его можно изменять если получается слишком маленький рисунок
step = 30
# Чертим рисунок исходя из условий задач
for i in range(4):
# Вперед
turtle.fd(10*step)
# Влево
turtle.lt(90)
# Вправо
turtle.rt(90)
# Поднимаем перо и чертим координатную плоскость точками
turtle.up()
for x in range(-10,10):
for y in range(-10,10):
turtle.goto(x * step,y * step)
# Устанавливаем размер точки
turtle.dot(3)
6.2 Найти расстояние между начальным положением черепахи и конечным положением
Шаблон задания
Исполнитель Черепаха передвигается по плоскости и оставляет след в виде линии. Черепаха может выполнять две команды: Вперёд n (n — число) и Направо m (m — число). По команде Вперёд n Черепаха перемещается вперёд на n единиц. По команде Направо m Черепаха поворачивается на месте на m градусов по часовой стрелке, при этом соответственно меняется направление дальнейшего движения.
Запись Повтори k [Команда1 Команда2 … Команда S] означает, что заданная последовательность из S команд повторится k раз.
Черепаха выполнила следующую программу:
Повтори 11 [Вперёд 36 Направо 72].
Определите расстояние между положениями Черепахи в начале и в конце выполнения этой программы. В ответе запишите целое число, ближайшее к найденному расстоянию.
# Импортируем модуль черепашки
import turtle
# Устанавливаем максимальную скорость
turtle.tracer(0)
# Получаем начальные координаты черепашки
x1 = turtle.xcor()
y1 = turtle.ycor()
# Чертим рисунок исходя из условий задач
for i in range(11):
# Вперед
turtle.fd(36)
# Вправо
turtle.rt(72)
# Получаем конечные координаты черепашки
x2 = turtle.xcor()
y2 = turtle.ycor()
# Определяем расстояние между двумя точками по теореме Пифагора
print(round(((x2 - x1)**2 + (y2 - y1)**2))**0.5)
Внимание
В задаче, где нужно найти расстояние переменную шаг не используем — это исказит результат
Задача 8
8.1 Слова по порядку
Шаблон задания
Все пятибуквенные слова, в составе которых могут быть только буквы Б, А, Т, Ы, Р, записаны в алфавитном порядке и пронумерованы начиная с 1.
Ниже приведено начало списка.
- ААААА
- ААААБ
- ААААР
- ААААТ
- ААААЫ
- АААБА
…
Под каким номером в списке идёт первое слово, которое не содержит ни одной буквы Ы и не содержит букв А, стоящих рядом?
s1 = 'батыр'
s = sorted(s1)
k = 0
for a1 in s:
for a2 in s:
for a3 in s:
for a4 in s:
for a5 in s:
k = k + 1
b = a1 + a2 + a3 + a4 + a5
if 'условие из задачи':
print(k, '===', b)
8.2 Составление слов
Шаблон задания
Составляются коды из букв слова РОСОМАХА. Код должен состоять из 8 букв, и каждая буква в нём должна встречаться столько же раз, сколько в заданном слове. Кроме того, в коде не должны стоять рядом две гласные и две согласные буквы. Сколько кодов может составить Светлана?
s1 = 'росомаха'
s = sorted(s1)
k = 0
#Столько циклов сколько букв в получаемом слове
for a1 in s:
for a2 in s:
for a3 in s:
for a4 in s:
for a5 in s:
b = a1 + a2 + a3 + a4 + a5
if 'условие':
k = k + 1
print(k)
Задача 12
Шаблон задания
Дана программа для Редактора:
НАЧАЛО
- ПОКА нашлось (49) ИЛИ нашлось (97)
- ЕСЛИ нашлось (47)
- ТО заменить (47, 74)
- КОНЕЦ ЕСЛИ
- КОНЕЦ ПОКА
- КОНЕЦ
На вход поступает строка, содержащая 30 цифр 7, 50 цифр 9, расположенных в произвольном порядке. Какая строка получается на выходе?
s = 30 * '7' + 50 * '9'
print(s)
while ('49' in s) or ('97' in s):
if '47' in s:
s = s.replace('47','74',1)
print(s)
=====
Задача 25
Шаблон числа
Шаблон задания
Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
– символ «?» означает ровно одну произвольную цифру;
– символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.
Например, маске 123*4?5 соответствуют числа 123405 и 12300405.
Среди натуральных чисел, не превышающих 1010, найдите все числа, соответствующие маске 1?2157*4, делящиеся на 2024 без остатка.
В ответе запишите в первом столбце таблицы все найденные числа в порядке возрастания, а во втором столбце – соответствующие им результаты деления этих чисел на 2024.
Количество строк в таблице для ответа избыточно.
from fnmatch import *
for i in range(2024, 10**10+1, 2024):
if fnmatch(str(i), '1?2157*4'):
print(i, i//2024)