Автор: Л.Шастин
Уровень: Средний
На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом.
1. Строится восьмеричная запись числа N.
2. Далее эта запись обрабатывается по следующему правилу:
а) если число N чётное, то в этой записи все нечётные цифры меняются на «2»;
б) если число N нечётное, то первая и последняя цифры меняются на «3».
Полученная таким образом запись является восьмеричной записью искомого числа R.
3. Результат переводится в десятичную систему и выводится на экран.
Например, для исходного числа 9 = 118 результатом является число 338 = 27, а для исходного числа 12 = 148 это число 248 = 20.
Укажите максимальное число R, меньшее 300, которое может быть получено с помощью описанного алгоритма. В ответе запишите это число в десятичной системе счисления.
Аудио с пояснением к коду решения оставлю в комментариях.
R = []
for n in range(1, 1000):
s = f'{n:o}'
if n % 2 == 0:
for x in '1357':
s = s.replace(x, '2')
else:
s = '3' + s[1:-1] + '3'
r = int(s, 8)
if r < 300:
R.append(r)
print(max(R))
Ответ: 294:
R = []
Создается пустой список R для хранения подходящих результатов.
for n in range(1, 1000):
Цикл перебирает числа от 1 до 999 включительно.
s = f'{n:o}'
Число n преобразуется в восьмеричную (octal) систему счисления и сохраняется в строку s.
if n % 2 == 0:
Проверяется, четное ли число n.
for x in '1357':
Если число четное, то перебираются нечетные цифры 1, 3, 5, 7.
s = s.replace(x, '2')
Каждую нечетную цифру в строке s заменяют на 2.
else:
Если число n нечетное, выполняется этот блок.
s = '3' + s[1:-1] + '3'
Для нечетных чисел:
- Первый символ строки s заменяется на '3'.
- Последний символ заменяется на '3'.
- Середина строки (s[1:-1]) остается без изменений.
Пример: s = '1234' → '323' (первая и последняя цифры заменены на 3).
r = int(s, 8)
Строка s (в восьмеричной системе) преобразуется обратно в десятичное число.
if r < 300:
Если полученное число r меньше 300, оно добавляется в список R.
print(max(R))
В конце выводится максимальное число из списка R.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥4👍3🔥3
Автор: С.Якунин
Уровень: Средний
Полина составляет слова, переставляя буквы в слове ПАЙТОН. Сколько слов может составить Полина, если известно, что сумма порядковых номеров гласных букв, в каждом из них, равна 6? Буквы нумеруются слева направо, начиная с единицы.
Аудио с пояснением к коду решения оставлю в комментариях.
from itertools import *
cnt = 0
for p in permutations('ПАЙТОН'):
word = ''.join(p)
summa = word.index('А')+1 + word.index('О')+1
if summa == 6:
cnt += 1
print(cnt)
Ответ: 96
from itertools import *
Импортируется модуль itertools для работы с перестановками (permutations).
cnt = 0
Создается счетчик cnt, который будет считать количество подходящих перестановок.
for p in permutations('ПАЙТОН'):
Цикл перебирает все возможные перестановки букв в слове 'ПАЙТОН'.
word = ''.join(p)
Каждая перестановка p (это кортеж букв) объединяется в строку word.
summa = word.index('А')+1 + word.index('О')+1
- word.index('А') возвращает индекс буквы 'А' в строке (начиная с 0).
- +1 добавляется, чтобы считать позицию с 1 (как в обычном порядке).
- Аналогично для буквы 'О'.
- summa — это сумма позиций букв 'А' и 'О' в текущей перестановке.
if summa == 6:
Проверяется, равна ли сумма позиций 'А' и 'О' 6.
cnt += 1
Если условие выполнено (summa == 6), счетчик увеличивается на 1.
print(cnt)
В конце выводится общее количество подходящих перестановок.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥9👍4🔥4
Автор: М.Шагитов
Уровень: Средний
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может убрать из кучи один камень, либо, если в куче 4 или больше камней, он может убрать четыре камня, либо, если количество камней в куче кратно трем, он может уменьшить количество камней в куче в три раза.
Игра завершается в тот момент, когда количество камней в куче становится не более 1.
Победителем считается игрок, сделавший последний ход, т.е. первым получивший кучу из 1 камня или меньше.
В начальный момент в куче было S камней; 4 ≤ S ≤ 100.
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника.
Укажите минимальное значение S, при котором Петя не может выиграть за один ход, но при любом ходе Пети Ваня может выиграть своим первым ходом.
Задание 20.
Для игры, описанной в задании 19, найдите два наименьших значения S, при которых у Пети есть выигрышная стратегия, причём одновременно выполняются два условия:
− Петя не может выиграть за один ход;
− Петя может выиграть своим вторым ходом независимо от того, как будет ходить Ваня.
Найденные значения запишите в ответе в порядке возрастания.
Задание 21.
Для игры, описанной в задании 19, найдите минимальное значение S, при котором одновременно выполняются два условия:
– у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;
– у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.
Аудио с пояснением к коду решения оставлю в комментариях.
def F(s, n):
if s <= 1:
return n % 2 == 0
if n == 0:
return 0
h = [F(s - 1, n - 1)]
if s >= 4:
h += [F(s - 4, n - 1)]
if s % 3 == 0:
h += [F(s / 3, n - 1)]
return any(h) if (n - 1) % 2 == 0 else all(h)
print([s for s in range(4, 100 + 1) if F(s, 2)])
print([s for s in range(4, 100 + 1) if F(s, 3) and not F(s, 1)])
print([s for s in range(4, 100 + 1) if F(s, 4) and not F(s, 2)])
Ответы:
6
7 10
8
def F(s, n):
• Объявление функции F с параметрами s (текущее состояние) и n (количество оставшихся ходов)
if s <= 1:
• Проверка, если s меньше или равно 1, игра завершена
return n % 2 == 0
• Возвращает True, если n чётное (победа текущего игрока), иначе False
if n == 0:
• Проверка, если ходы закончились (n = 0), игра проиграна
return 0
• Возвращает 0 (ложь), так как нет ходов для победы
h = [F(s - 1, n - 1)]
• Рекурсивный вызов F для хода s - 1 и уменьшенного n, результат добавляется в список h
if s >= 4:
• Проверка, можно ли сделать ход s - 4
h += [F(s - 4, n - 1)]
• Если s >= 4, рекурсивный вызов F для s - 4 и уменьшенного n, результат добавляется в h
if s % 3 == 0:
• Проверка, делится ли s на 3
h += [F(s / 3, n - 1)]
• Если s делится на 3, рекурсивный вызов F для s / 3 и уменьшенного n, результат добавляется в h
return any(h) if (n - 1) % 2 == 0 else all(h)
• Если предыдущий ход был чётным ((n - 1) % 2 == 0), возвращает any(h) (хотя бы один выигрышный ход), иначе all(h) (все ходы должны быть выигрышными)
print([s for s in range(4, 100 + 1) if F(s, 2)])
• Выводит список s от 4 до 100, где игрок может выиграть за 2 хода (F(s, 2) = True)
print([s for s in range(4, 100 + 1) if F(s, 3) and not F(s, 1)])
• Выводит список s от 4 до 100, где игрок может выиграть за 3 хода, но не за 1 (F(s, 3) = True и F(s, 1) = False)
print([s for s in range(4, 100 + 1) if F(s, 4) and not F(s, 2)])
• Выводит список s от 4 до 100, где игрок может выиграть за 4 хода, но не за 2 (F(s, 4) = True и F(s, 2) = False)
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5🔥5❤🔥4 2👍1
Автор: ЕГКР
Уровень: Базовый
Текстовый файл состоит из символов F, G, Q, R, S и W. Определите в прилагаемом файле максимальное количество идущих подряд символов, среди которых подстрока FSRQ встречается ровно 80 раз.
Аудио с пояснением к коду решения оставлю в комментариях.
s = open('0. files/24.txt').readline()
s = s.split('FSRQ')
maxi = 0
for i in range(len(s)-80):
r = 'SRQ' + 'FSRQ'.join(s[i:i+81]) + 'FSR'
maxi = max(maxi, len(r))
print(maxi)
Ответ: 2379
s = open('0. files/24.txt').readline()
Открываем файл 24.txt из папки 0. files и читаем первую строку, сохраняя её в переменную s
s = s.split('FSRQ')
Разбиваем строку s на список подстрок, используя разделитель 'FSRQ'
maxi = 0
Инициализируем переменную maxi для хранения максимальной длины найденной подстроки
for i in range(len(s)-80):
Запускаем цикл по индексам списка s, оставляя запас в 80 элементов для обработки последующих 81 элементов
r = 'SRQ' + 'FSRQ'.join(s[i:i+81]) + 'FSR'
Формируем строку r, соединяя 81 подстроку из списка s с разделителем 'FSRQ', добавляя префикс 'SRQ' и суффикс 'FSR'
maxi = max(maxi, len(r))
Обновляем maxi, если длина строки r больше текущего значения maxi
print(maxi)
Выводим максимальную найденную длину строки r
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥5❤2🔥2
Автор: А.Вдовин
Уровень: Средней
Найдите количество четырехзначных чисел в девятеричной системе счисления, в которых есть ровна одна цифра 8, а сумма цифр слева от нее равна сумме цифр справа от нее.
Примечание: если слева или справа от 8 цифр нет, то сумма считается равной нулю
Аудио с пояснением к коду решения оставлю в комментариях.
from itertools import *
cnt = 0
for p in product('012345678', repeat=4):
num = ''.join(p)
if num[0] != '0':
if num.count('8') == 1:
i = num.index('8')
summa_left = sum(map(int, num[:i]))
summa_right = sum(map(int, num[i+1:]))
if summa_left == summa_right:
cnt += 1
print(cnt)
Ответ: 64
from itertools import *
Импорт всех функций из модуля itertools, который предоставляет удобные инструменты для работы с итераторами
cnt = 0
Инициализация счётчика cnt, который будет хранить количество подходящих чисел
for p in product('012345678', repeat=4):
Цикл по всем возможным комбинациям длиной 4 из цифр '012345678' (включая повторы)
num = ''.join(p)
Преобразование текущей комбинации p в строку num
if num[0] != '0':
Проверка, что число не начинается с нуля (чтобы избежать ведущих нулей)
if num.count('8') == 1:
Проверка, что в числе ровно одна цифра '8'
i = num.index('8')
Нахождение индекса цифры '8' в строке num
summa_left = sum(map(int, num[:i]))
Вычисление суммы цифр слева от '8' (преобразование среза строки в числа и их суммирование)
summa_right = sum(map(int, num[i+1:]))
Вычисление суммы цифр справа от '8'
if summa_left == summa_right:
Проверка равенства сумм слева и справа от '8'
cnt += 1
Увеличение счётчика, если условие выполнено
print(cnt)
Вывод итогового количества подходящих чисел
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍5❤3❤🔥3
Автор: А.Богданов
Уровень: Базовый
Марина собирает восьмибуквенные слова из букв своего имени. Все буквы могут многократно повторяться. На каком месте окажется имя МАРИАННА в отсортированном по алфавиту списке сгенерированных слов? Нумерация начинается с 1.
Аудио с пояснением к коду решения оставлю в комментариях.
from itertools import *
for n, p in enumerate(product(sorted('МАРИН'), repeat=8), 1):
word = ''.join(p)
if word == 'МАРИАННА':
print(n)
break
Ответ: 169466
from itertools import *
Импорт всех функций из модуля itertools, включая функцию product, которая будет использоваться для генерации декартова произведения
for n, p in enumerate(product(sorted('МАРИН'), repeat=8), 1):
Запуск цикла, где:
• sorted('МАРИН') сортирует символы строки 'МАРИН' в алфавитном порядке (['А', 'И', 'М', 'Н', 'Р'])
• product(..., repeat=8) генерирует все возможные комбинации длины 8 из этих символов
• enumerate(..., 1) нумерует каждую комбинацию, начиная с 1
• n хранит номер текущей комбинации, p — саму комбинацию в виде кортежа символов
word = ''.join(p)
Преобразует кортеж символов p в строку word
if word == 'МАРИАННА':
Проверяет, совпадает ли текущая комбинация word с искомым словом 'МАРИАННА'
print(n)
Если условие выполняется, выводит номер комбинации n
break
Прерывает цикл после нахождения нужного слова
Please open Telegram to view this post
VIEW IN TELEGRAM
4❤🔥9👍4 4
Собрал для вас основные моменты, которые важно знать при решении 16 номера. Для закрепления материала оставляю ссылку на подборку всех 16 номеров разобранных на моем канале.
📚 По этой ссылке ты найдешь мои шпаргалки по всем остальным номерам ЕГЭ
Автор: Открытый вариант 2025
Уровень: Базовый
def F(n):
if n >= 2025:
return n
if n < 2025:
return n * 2 + F(n + 2)
print(F(82) - F(81)) # 1945
Автор: Досрочная волна 2025
Уровень: Базовый
import sys
sys.setrecursionlimit(100000)
def F(n):
if n <= 5:
return 1
if n > 5:
return n + F(n - 2)
print(F(2126) - F(2122))
В этом прототипе нужно расширить глубину рекурсии из-за ошибки: "RecursionError: maximum recursion depth exceeded".
Автор: Апробация 05.03.25
Уровень: Базовый
import sys
sys.setrecursionlimit(100000)
def F(n):
if n == 1:
return 1
if n > 1:
return n * F(n - 1)
print((F(2024) // 4 + F(2023)) // F(2022))
print((F(2024) / 4 + F(2023)) // F(2022))
~~~^~~
OverflowError: integer division result too large for a float
Такую ошибку мы получили на экзамене 2024 года.
Автор: М. Попков
Уровень: Базовый
from functools import *
import sys
sys.setrecursionlimit(100000)
@lru_cache(None)
def F(n):
if n <= 3:
return n - 1
if n > 3 and n % 2 == 0:
return F(n - 2) + n / 2 - F(n - 4)
if n > 3 and n % 2 != 0:
return F(n - 1) * n + F(n - 2)
for n in range(1, 5000):
F(n)
print(F(4952) + 2 * F(4958) + F(4964))
Самая неприятная ошибка, здесь необходимо использовать библиотеку functools.
📌 Тут оставлю сылку на старую версию шпаргалки, которую делал в Notion
Please open Telegram to view this post
VIEW IN TELEGRAM
4🔥18 10❤🔥8❤2
Собрал для вас основные моменты, которые важно знать при решении 5 номера. Для закрепления материала оставляю ссылку на подборку всех 5 номеров разобранных на моем канале.
📚 По этой ссылке ты найдешь мои шпаргалки по всем остальным номерам ЕГЭ
Автор: Досрочная волна 2025
Уровень: Базовый
for n in range(1, 1000):
s = f'{n:b}'
if s.count('1') % 2 == 0:
s = '10' + s[2:] + '0'
else:
s = '11' + s[2:] + '1'
r = int(s, 2)
if r > 480:
print(n)
break
Автор: ЕГКР 19.04.25
Уровень: Базовый
def tri(n):
s = ''
while n > 0:
s += str(n % 3)
n //= 3
s = s[::-1]
return s
for n in range(1000, 1, -1):
s = tri(n)
if n % 3 == 0:
s += s[-2:]
else:
s += tri(n % 3 * 3)
r = int(s, 3)
if r <= 150:
print(n)
break
В этом типе нужно использовать функцию для перевода в троичную систему счисления.
n = 24
num_2 = bin(n)[2:] # 11000
num_8 = oct(n)[2:] # 30
num_16 = hex(n)[2:] # 18
n = 24
num_2 = f'{n:b}' # 11000
num_8 = f'{n:o}' # 30
num_16 = f'{n:x}' # 18
from string import *
alphabet = digits + ascii_uppercase
# alphabet = sorted('0123456789QWERTYUIOPASDFGHJKLZXCVBNM')
def my_convert(num, base):
result = ''
while num > 0:
result += alphabet[num % base]
num //= base
return result[::-1]
n = 24
num_2 = my_convert(n, 2) # 11000
num_8 = my_convert(n, 8) # 30
num_16 = my_convert(n, 16) # 18
num_3 = my_convert(n, 3) # 220
print(int('1000', 2)) # 8
print(int('10', 8)) # 8
print(int('8', 16)) # 8
Диапазон работы функции (2 <= base <= 36)
s = '101001'
# Добавить '10' справа (в конец)
s = s + '10' # 10100110
# Добавить '01' слева (в начало)
s = '01' + s # 0110100110
print(s)
# Добавить '+' по середине
s = s[:len(s)//2] + '+' + s[len(s)//2:]
# 01101*00110
# Заменить все нули на единицы, а единицы на нули
s = s.replace('1', '*')
s = s.replace('0', '1')
s = s.replace('*', '0')
📌 Тут оставлю сылку на старую версию шпаргалки, которую делал в Notion
Давайте наберем 30 реакций, после этого заливаю следующую (свежую) шпору
Please open Telegram to view this post
VIEW IN TELEGRAM
5❤16 8👍7 4
Собрал для вас основные моменты, которые важно знать при решении 8 номера. Для закрепления материала оставляю ссылку на подборку всех 8 номеров разобранных на моем канале.
📚 По этой ссылке ты найдешь мои шпаргалки по всем остальным номерам ЕГЭ
Автор: Досрочная волна 2025
Уровень: Базовый
from itertools import *
k = 0
for i in product('ДГИАШЭ', repeat=5):
i = ''.join(i)
if i[0] not in 'ИАЭ' and i[-1] not in 'ДГШ':
k += 1
print(k)
В данном задании необходимо найти какое количество различных кодовых слов можно составить.
Автор: Открытый вариант 2025
Уровень: Базовый
from itertools import *
k = 0
for i in permutations('0123456789', 4):
i = ''.join(i)
if i[0] != '0':
i = i.replace('0', '2').replace('4', '2').replace('6', '2').replace('8', '2')
i = i.replace('3', '1').replace('5', '1').replace('7', '1').replace('9', '1')
if '11' not in i and '22' not in i:
k += 1
print(k)
В данном прототипе нужно найти количество чисел, которые можно составить.
Автор: ЕГКР 19.04.25
Уровень: Базовый
from itertools import *
number = 0
for i in product(sorted('ПОБЕДА'), repeat=6):
i = ''.join(i)
number += 1
if i[0] == 'О' and len(i) == len(set(i)):
if number % 2 == 0:
print(number)
Здесь нужно учесть исходный список слов и вывести номер подходящего слова.
📌 Тут оставлю сылку на старую версию шпаргалки, которую делал в Notion
Please open Telegram to view this post
VIEW IN TELEGRAM
7❤🔥26 11🔥8❤2 2
Для закрепления материала оставляю ссылку на подборку всех 12 номеров разобранных на моем канале.
📚 По этой ссылке ты найдешь мои шпаргалки по всем остальным номерам ЕГЭ
Автор: Апробация 05.03.25
Уровень: Базовый
s = '1' + 90 * '0'
while '1' in s:
if '10' in s:
s = s.replace('10', '0001', 1)
else:
s = s.replace('1', '000', 1)
print(s.count('0'))
В данном задании необходимо найти количество нулей в полученной строке.
Уровень: Базовый
M = []
for n in range(4, 10000):
s = '4' + n * '7'
while '444' in s or '777' in s:
if '777' in s:
s = s.replace('777', '4', 1)
else:
s = s.replace('444', '7', 1)
summ = s.count('4') * 4 + s.count('7') * 7
M.append(summ)
print(max(M))
В этом прототипе нужно найти максимальную сумму цифр в строке.
s = '12345'
summ = s.count('4') * 4 + s.count('7') * 7
summ = sum(map(int, s))
summ = sum([int(x) for x in s])
summ = sum([int(x) for x in s if x.isdigit()])
summ = 0
for x in s:
summ += int(x)
📌 Тут оставлю сылку на старую версию шпаргалки, которую делал в Notion
Please open Telegram to view this post
VIEW IN TELEGRAM
10❤🔥10👍4 4🔥2 1
Задача 21425 #kege по информатике #шпора
Автор: Досрочная волна 2025
Уровень: Базовый
PS: Для начала просто внимательно прочитайте условие задачи и сравните его с оригиналом! Также публикую код решения, но пока без комментариев - они будут добавлены постами ниже.
В файле A хранятся данные о звёздах двух кластеров. В файле B хранятся данные о звёздах трёх кластеров.
Для каждого файла определите координаты центра каждого кластера. Затем вычислите четыре числа:
1. PxA – среднее арифметическое абсцисс центров кластеров файла А.
2. PyA – среднее арифметическое ординат центров кластеров файла А.
3. PxB – среднее арифметическое абсцисс центров кластеров файла B.
4. PyB – среднее арифметическое ординат центров кластеров файла B.
В ответе запишите четыре числа: в первой строке сначала целую часть произведения PxA * 10000, затем целую часть произведения Py*10000 для файла А, во второй строке – аналогичные данные для файла B.
При этом будем называть центром кластера точку этого кластера, сумма расстояний от которой до всех остальных точек кластера минимальна.
А расстояние между двумя точками на плоскости между точками A(x1, y1) и B(x2, y2) вычисляется по формуле: d(A,B)= ((x2 - x1)**2 + (y2 - y1)**2)**0.5
from math import dist
clustersA = [[], []]
clustersB = [[], [], []]
for s in open('27_A.txt'):
s = s.replace(',', '.')
x, y = [float(i) for i in s.split()]
if y > 0:
clustersA[0].append([x, y])
else:
clustersA[1].append([x, y])
for s in open('27_B.txt'):
s = s.replace(',', '.')
x, y = [float(i) for i in s.split()]
if x > 0 and y > 0:
clustersB[0].append([x, y])
elif x > 0 and y < 0:
clustersB[1].append([x, y])
else:
clustersB[2].append([x, y])
def center(cl):
R = []
for p in cl:
summa=sum(dist(p, g) for g in cl)
R.append([summa,p])
return min(R)[1]
centersA = [center(cl) for cl in clustersA]
pxA = sum(x for x, y in centersA) / 2 * 10000
pyA = sum(y for x, y in centersA) / 2 * 10000
print(int(pxA), int(pyA))
centersB = [center(cl) for cl in clustersB]
pxB = sum(x for x, y in centersB) / 3 * 10000
pyB = sum(y for x, y in centersB) / 3 * 10000
print(int(pxB), int(pyB))
Ответ:
167990 73043
122627 29105
Файлы для решения задачи:
27_A.xlsx 27_A.txt
27_B.xlsx 27_B.txt
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥10❤4🔥4🤯2
Автор: Сергей Горбачев
Уровень: Средний
Сеть задана IP-адресом 140.116.194.0 и маской сети 255.255.240.0. Сколько в этой сети IP-адресов, в двоичной записи которых каждый из четырёх байтов оканчивается нулём?
from ipaddress import *
net = ip_network('140.116.194.0/255.255.240.0', 0)
cnt = 0
for ip in net:
b = f'{ip:b}'
if b[:8][-1] == '0':
if b[8:16][-1] == '0':
if b[16:24][-1] == '0':
if b[24:][-1] == '0':
cnt += 1
print(cnt)
Ответ: 1024
from ipaddress import *
• Импортируются все классы и функции из модуля ipaddress, используемого для работы с IP-адресами и сетями.
net = ip_network('140.116.194.0/255.255.240.0', 0)
• Создаётся объект сети net с заданным IP-адресом и маской. Аргумент 0 указывает, что используется маска, а не префикс.
cnt = 0
• Инициализируется счётчик для подсчёта подходящих IP-адресов.
for ip in net:
• Цикл перебирает все IP-адреса в заданной сети.
b = f'{ip:b}'
• Преобразует IP-адрес в строку его двоичного представления (без точек и пробелов).
if b[:8][-1] == '0':
• Проверяет, оканчивается ли первый байт (первые 8 бит) на 0.
if b[8:16][-1] == '0':
• Проверяет, оканчивается ли второй байт (биты с 8 по 15) на 0.
if b[16:24][-1] == '0':
• Проверяет, оканчивается ли третий байт (биты с 16 по 23) на 0.
if b[24:][-1] == '0':
• Проверяет, оканчивается ли четвёртый байт (биты с 24 по 31) на 0.
cnt += 1
• Увеличивает счётчик, если все четыре байта оканчиваются нулём.
• Выводит количество IP-адресов, удовлетворяющих условию задачи.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥6👍3❤2🔥2
Автор: Л.Шастин
Уровень: Сложный
Определите наибольший номер строки таблицы, для чисел которой выполнены оба условия:
– числа в строке расположены в порядке неубывания;
– в строке есть повторяющиеся числа с чётной суммой цифр.
R = []
for n, s in enumerate(open('0. files/9.csv'), 1):
M = [int(x) for x in s.split(';')]
if M == sorted(M):
if any(M.count(x) > 1 and sum(map(int, str(x))) % 2 == 0 for x in M):
R.append(n)
print(max(R))
Ответ: 6937
R = []
Создается пустой список R, в который будут добавляться номера строк, удовлетворяющих условиям
for n, s in enumerate(open('0. files/9.csv'), 1):
Открывается файл 9.csv, итерируемся по его строкам s с нумерацией n, начиная с 1
M = [int(x) for x in s.split(';')]
Каждая строка s разбивается по разделителю ;, элементы преобразуются в целые числа, формируется список M
if M == sorted(M):
Проверяется, равен ли список M своему отсортированному варианту (проверка на неубывающую последовательность)
if any(M.count(x) > 1 and sum(map(int, str(x))) % 2 == 0 for x in M):
Проверяется, есть ли в списке M хотя бы одно число x, которое встречается больше одного раза (M.count(x) > 1) и сумма цифр которого четная (sum(map(int, str(x))) % 2 == 0)
R.append(n)
Если оба условия выполнены, номер строки n добавляется в список R
print(max(R))
Выводится максимальный номер строки из списка R (последняя подходящая строка в файле)
Please open Telegram to view this post
VIEW IN TELEGRAM
3❤8❤🔥4🔥4
Автор: Л.Шастин
Уровень: Средний
В некоторых системах счисления, для записи оснований которых используются целочисленные переменные p<37 и s<35, выполняется равенство: R4_(p−1)+B0_(s+2)+ T3NK4_p = 23593399_10. Определите произведение подходящих значений p и s и укажите его в ответе в десятичной системе счисления.
for p in range(30, 37):
for s in range(10, 35):
A = int(f'R4', p-1)
B = int(f'B0', s+2)
C = int(f'T3NK4', p)
if (A + B + C) == 23593399:
print(p * s)
Ответ: 780
for p in range(30, 37):
• Цикл, перебирающий значения p от 30 до 36 (включительно)
for s in range(10, 35):
• Вложенный цикл, перебирающий значения s от 10 до 34 (включительно)
A = int(f'R4', p-1)
• Преобразует строку 'R4' в число, интерпретируя её как число в системе счисления с основанием p-1
B = int(f'B0', s+2)
• Преобразует строку 'B0' в число, интерпретируя её как число в системе счисления с основанием s+2
C = int(f'T3NK4', p)
• Преобразует строку 'T3NK4' в число, интерпретируя её как число в системе счисления с основанием p
if (A + B + C) == 23593399:
• Проверяет, равна ли сумма чисел A, B и C значению 23593399
print(p * s)
• Если условие выполняется, выводит произведение p и s
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥5🔥3👍2
Автор: Л.Шастин
Уровень: Средний
В файле содержится последовательность натуральных чисел, которые нумеруются, начиная с единицы. Определите количество пар элементов последовательности, сумма номеров которых оканчивается на ту же цифру, что и максимальный элемент последовательности. В ответе запишите количество найденных пар, затем минимальное значение среди модулей разностей суммы элементов и суммы номеров таких пар. В данной задаче под парой подразумевается два идущих подряд элемента последовательности.
M = [int(x) for x in open('0. files/17.txt')]
R = []
for i in range(len(M)-1):
x, y = M[i], M[i+1]
i, j = i+1, i+2
if (i + j) % 10 == max(M) % 10:
R.append(abs((x+y) - (i+j)))
print(len(R), min(R))
Ответ: 1000 811
M = [int(x) for x in open('0. files/17.txt')]
Читаем файл '0. files/17.txt', преобразуем каждую строку в целое число и сохраняем в список M
R = []
Создаем пустой список R для хранения результатов
for i in range(len(M)-1):
Запускаем цикл по индексам элементов списка M, кроме последнего
x, y = M[i], M[i+1]
Получаем текущий элемент x и следующий элемент y из списка M
i, j = i+1, i+2
Вычисляем индексы i и j для проверки условия (увеличиваем на 1 и 2 соответственно)
if (i + j) % 10 == max(M) % 10:
Проверяем, равен ли остаток от деления суммы индексов i и j на 10 остатку от деления максимального элемента списка M на 10
R.append(abs((x+y) - (i+j)))
Если условие выполняется, добавляем в список R модуль разности между суммой элементов x и y и суммой индексов i и j
print(len(R), min(R))
Выводим количество элементов в списке R и минимальное значение из этого списка
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥4👍2🔥1
Автор: Л.Шастин
Уровень: Средний
Текстовый файл состоит из символов, обозначающих буквы латинского алфавита A, В и С и цифры 1 и 8.
Определите в прилагаемом файле максимальную длину подстроки, которая начинается и заканчивается на разные цифры, включает в себя равное количество букв B и C и не содержит других цифр, кроме первой и последней.
Для выполнения этого задания следует написать программу.
s = open('0. files/24.txt').readline()
s = s.replace('1', '1 1').replace('8', '8 8')
maxi = 0
for x in s.split():
if x.count('1') == 1:
if x.count('B') == x.count('C'):
maxi = max(maxi, len(x))
print(maxi)
Ответ: 1315
s = open('0. files/24.txt').readline()
• Открываем файл '0. files/24.txt' и читаем первую строку, сохраняя её в переменную s
s = s.replace('1', '1 1').replace('8', '8 8')
• Заменяем каждый символ '1' на '1 1' и каждый символ '8' на '8 8', удваивая их и добавляя пробелы между ними
maxi = 0
• Инициализируем переменную maxi для хранения максимальной длины подходящей строки
for x in s.split():
• Разбиваем строку s на список подстрок по пробелам и начинаем перебирать каждую подстроку в цикле
if x.count('1') == 1:
• Проверяем, что текущая подстрока x содержит ровно один символ '1'
if x.count('B') == x.count('C'):
• Проверяем, что количество символов 'B' равно количеству символов 'C' в текущей подстроке
maxi = max(maxi, len(x))
• Если оба условия выше выполнены, обновляем maxi, сохраняя максимальное значение между текущим maxi и длиной подстроки x
print(maxi)
• Выводим максимальную длину подходящей подстроки, найденную в результате работы программы
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥4👍2🔥2
Автор: Е.Джобс
Уровень: Базовый
Определите количество пар элементов последовательности, в которых хотя бы одно число кратно минимальному двузначному значению последовательности, которое кратно сумме своих цифр.
Гарантируется, что в последовательности есть хотя бы одно двузначное число, соответствующее условию. В ответе запишите количество найденных пар чисел, затем максимальную из сумм элементов таких пар. В данной задаче под парой подразумевается два идущих подряд элемента последовательности.
M = [int(x) for x in open('0. files/17.txt')]
D = [x for x in M if len(str(abs(x))) == 2 and x % sum(map(int, str(x))) == 0]
R = []
for i in range(len(M) - 1):
x, y = M[i], M[i + 1]
if (x % min(D) == 0) + (y % min(D) == 0) >= 1:
R.append(x + y)
print(len(R), max(R))
Ответ: 537 19247
M = [int(x) for x in open('0. files/17.txt')]
Читает файл '0. files/17.txt', преобразует каждую строку в целое число и сохраняет в список M
D = [x for x in M if len(str(abs(x))) == 2 and x % sum(map(int, str(x))) == 0]
Создает список D из чисел M, у которых ровно две цифры (учитывая модуль) и которые делятся на сумму своих цифр
R = []
Инициализирует пустой список R для хранения сумм подходящих пар
for i in range(len(M) - 1):
Цикл по индексам списка M (кроме последнего элемента, чтобы не выйти за границы)
x, y = M[i], M[i + 1]
Берет текущий элемент x и следующий y из списка M
if (x % min(D) == 0) + (y % min(D) == 0) >= 1:
Проверяет, что хотя бы одно из чисел x или y делится на минимальное число из списка D
R.append(x + y)
Если условие выполняется, добавляет сумму x и y в список R
print(len(R), max(R))
Выводит количество найденных пар и максимальную сумму из списка R
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6🔥5👍3
Автор: М.Попков
Уровень: Средний
Откройте файл электронной таблицы, содержащей в каждой строке четыре натуральных чисел. Определите количество строк таблицы, для чисел которых выполнены следующие условия:
– в строке есть только одно число, которое повторяется дважды, остальные два числа различны;
– все неповторяющиеся числа нечетны, повторяющиеся числа чётны.
В ответе запишите только число.
cnt = 0
for s in open('0. files/9.csv'):
M = sorted([int(x) for x in s.split(',')])
copied = [x for x in M if M.count(x) == 2]
uncopied = [x for x in M if M.count(x) == 1]
if len(copied) == 2 and len(uncopied) == 2:
if all(x % 2 != 0 for x in uncopied):
if all(x % 2 == 0 for x in copied):
cnt += 1
print(cnt)
Ответ: 53
cnt = 0
Инициализация счетчика для подсчета подходящих строк.
for s in open('0. files/9.csv'):
Открытие файла и построчное чтение данных. Каждая строка s содержит числа, разделенные запятыми.
M = sorted([int(x) for x in s.split(',')])
Разделение строки по запятым, преобразование в целые числа и сортировка списка.
copied = [x for x in M if M.count(x) == 2]
Создание списка чисел, встречающихся ровно 2 раза (дубликаты).
uncopied = [x for x in M if M.count(x) == 1]
Создание списка уникальных чисел (встречаются 1 раз).
if len(copied) == 2 and len(uncopied) == 2:
Проверка, что есть ровно 2 дублирующихся числа (1 пара) и 2 уникальных числа.
if all(x % 2 != 0 for x in uncopied):
Проверка, что все уникальные числа нечетные.
if all(x % 2 == 0 for x in copied):
Проверка, что все дублирующиеся числа четные.
cnt += 1
Если все условия выполнены, счетчик увеличивается на 1.
print(cnt)
Вывод общего количества подходящих строк.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥3👍3❤2🔥2
Автор: Д.Бахтиев
Уровень: Средний
В файле содержится последовательность целых чисел.
Её элементы могут принимать целые значения от -100 000 до 100 000 включительно. Определите количество троек последовательности, сумма цифр элементов которых равна минимальному положительному элементу последовательности, оканчивающемуся на 4. В ответе запишите количество найденных троек, затем максимальную из сумм элементов таких троек. В данной задаче под тройкой подразумевается три идущих подряд элемента последовательности.
R = []
M = [int(x) for x in open('0. files/17.txt')]
W = [x for x in M if abs(x) % 10 == 4 and x > 0]
for i in range(len(M) - 2):
a, b, c = M[i], M[i + 1], M[i + 2]
summa = sum([int(x) for x in str(a) + str(b) + str(c) if x.isdigit()])
if summa == min(W):
R.append(a + b + c)
print(len(R), max(R))
Ответ: 11 180738
R = []
Создается пустой список R, в который будут записываться подходящие суммы троек чисел.
M = [int(x) for x in open('0. files/17.txt')]
Открывается файл 17.txt, читаются все числа и сохраняются в список M (каждое число преобразуется в int).
W = [x for x in M if abs(x) % 10 == 4 and x > 0]
В список W попадают только положительные числа из M, у которых последняя цифра равна 4 (например, 14, 24, -34 не подойдет, т.к. по условию x > 0).
for i in range(len(M) - 2):
Цикл перебирает индексы списка M до предпоследнего элемента, чтобы можно было взять тройку чисел (a, b, c) = (M[i], M[i+1], M[i+2]).
a, b, c = M[i], M[i + 1], M[i + 2]
Текущая тройка чисел из M записывается в переменные a, b и c.
summa = sum([int(x) for x in str(a) + str(b) + str(c) if x.isdigit()])
- str(a) + str(b) + str(c) — числа a, b, c преобразуются в строки и объединяются в одну строку (например, 123, -45, 678 → "123-45678").
- [int(x) for x in ... if x.isdigit()] — из этой строки берутся только цифры (минус игнорируется), и они преобразуются обратно в числа.
- sum(...) — вычисляется сумма всех цифр в тройке чисел.
if summa == min(W):
Проверяется, равна ли сумма цифр минимальному числу из W (т.е. минимальному положительному числу, оканчивающемуся на 4).
R.append(a + b + c)
Если условие выполнено, то сумма самой тройки чисел (a + b + c) добавляется в список R.
print(len(R), max(R))
В конце выводится:
- количество найденных троек (len(R)),
- максимальная сумма из этих троек (max(R)).
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥4🔥3👍2
Автор: Сергей Горбачев
Уровень: Средний
У исполнителя есть три команды, которые обозначены цифрами:
1. Прибавить 3
2. Прибавить 4
3. Умножить на 2
Сколько существует программ, для которых при исходном числе 11 результатом будет являться отрезок [50;54], при этом траектория вычислений не содержит числа 23?
def F(a, b: list):
if a >= min(b) or a == 23:
return a in b
return F(a + 3, b) + F(a + 4, b) + F(a * 2, b)
print(F(11, [50, 51, 52, 53, 54]))
Ответ: 3254
def F(a, b: list):
• Объявление функции F с двумя параметрами: a (число) и b (список чисел).
if a >= min(b) or a == 23:
• Условие: если a больше или равен минимальному элементу списка b ИЛИ a равен 23.
return a in b
• Если условие выше выполняется, возвращается True/False (проверка, есть ли a в списке b).
return F(a + 3, b) + F(a + 4, b) + F(a * 2, b)
• Если условие не выполняется, функция вызывает саму себя рекурсивно с тремя разными значениями a:
• Результаты этих вызовов суммируются.
print(F(11, [50, 51, 52, 53, 54]))
Вызов функции с аргументами a = 11 и b = [50, 51, 52, 53, 54], затем вывод результата.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥4❤4🔥4