Базовые алгоритмы используемые в решении.
Задача 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)
Задача 23
Шаблон задания
Исполнитель РазДваТри преобразует число на экране.
У исполнителя есть три команды, которым присвоены номера.
1. Прибавить 1.
2. Умножить на 2.
3. Умножить на 3.
Первая команда увеличивает число на экране на 1, вторая умножает его на 2, третья умножает его на 3.
Программа для исполнителя РазДваТри — это последовательность команд.
Сколько существует программ, которые преобразуют исходное число 2 в число 44 и при этом траектория вычислений содержит число 13 и не содержит числа 29?
Траектория вычислений — это последовательность результатов выполнения всех команд программы. Например, для программы 312 при исходном числе 6 траектория будет состоять из чисел 18, 19, 38.
def kol_put(a1,a2):
new1_a1 = a1 - 2
if new1_a1 == a2:
n = 1
elif new1_a1 < a2:
n = 0
else:
n = kol_put(new1_a1,a2)
new2_a1 = a1 // 2
if new2_a1 == a2:
m = 1
elif new1_a1 < a2:
m = 0
else:
m = kol_put(new2_a1,a2)
return n + m
kol1 = kol_put(50,11)
kol2 = kol_put(11,2)
print(kol1 * kol2)
=====
Задача 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)