Добавить в корзинуПозвонить
Найти в Дзене

Разбираем пробник Яндекса, №11 - показываю то, что можно программировать в Python в этом апрельском варианте ЕГЭ по информатике

Покажу как решил задачи 2, 5, 6, 8, 12, 13, 14, 15, 16, 17, 19-21, 23, позже может быть 25 оформлю и остальные код для вывода таблички типовой, творчества нет: print('xyuw') for x in range(0,2): for y in range(0,2): for u in range(0,2): for w in range(0,2): if ( (not((y <= w) == x)) and u ) == 1: print(x,y,u,w) или скриншот с выводом: путем нехитрых логических рассуждений приходим к выводу, что ответ такой: код - типовое решение, без хитростей def f(x):
s = ''
while x:
s = str(x % 7) + s
x = x // 7
return s
for n in range(1000,1,-1):
s = f(n)
if n % 7 == 0: s = s + s[-2:]
else: s = s + f((n % 7)*2)
r = int(s, 7)
if r < 220:
print(n)
break скриншот с выводом: код типовой - творчества ноль. from turtle import * tracer(0) m=20 screensize(2000,2000) left(90) right(135) for i in range(7): forward(7*m) right(45) forward(8*m) right(135) penup() for x in range(-20,20
Оглавление

Покажу как решил задачи 2, 5, 6, 8, 12, 13, 14, 15, 16, 17, 19-21, 23, позже может быть 25 оформлю и остальные

Задача №2.

условие
условие

код для вывода таблички типовой, творчества нет:

print('xyuw')

for x in range(0,2):

for y in range(0,2):

for u in range(0,2):

for w in range(0,2):

if ( (not((y <= w) == x)) and u ) == 1:

print(x,y,u,w)

или скриншот с выводом:

-3

путем нехитрых логических рассуждений приходим к выводу, что ответ такой:

-4

Задание 5

-5

код - типовое решение, без хитростей

def f(x):
s = ''
while x:
s = str(x % 7) + s
x = x // 7
return s

for n in range(1000,1,-1):
s = f(n)
if n % 7 == 0: s = s + s[-2:]
else: s = s + f((n % 7)*2)
r = int(s, 7)
if r < 220:
print(n)
break

скриншот с выводом:

-6

Задача № 6 - в Python

условие
условие
код типовой - творчества ноль.

from turtle import *

tracer(0)

m=20

screensize(2000,2000)

left(90)

right(135)

for i in range(7):

forward(7*m)

right(45)

forward(8*m)

right(135)

penup()

for x in range(-20,20):

for y in range(-20,20):

setpos(x*m, y*m)

dot(5, 'red')

done()

ну или скриншот с отступами.

-8

рисунок ниже, точки считаем. Помним, что там не над о считать точки на границе

-9

Задача №8

-10

а вот задача 8 интересная, мне понравилась - несмотря на простую формулировку, тут можно сильно напутать и ошибиться. Проверяйте все несколько раз!

aa = 'ВОЗДУХ'
a = sorted(a)
k = 0
for a1 in a:
for a2 in a:
for a3 in a:
for a4 in a:
for a5 in a:
s = a1+a2+a3+a4+a5
u1 = (s.count('О') + s.count('У')) == 1
u2 = ('ОВ' not in s) and ('ОХ' not in s) and ('ВО' not in s) and ('ХО' not in s) and ('УВ' not in s) and ('УХ' not in s) and ('ВУ' not in s) and ('ХУ' not in s)
if u1 and u2:
k = k + 1
print(k)

или скриншот с отступами. Это решение переборное, без product

-11

Главная идея - после того как сделали слово, мы его проверяем на выполнимость условия - находим логическую сумму "каунтов" - она должна быть равна 1, а сочетаний 'ОВ' и других не должно быть в слове - соединяем проверки andом.
from itertools import product
cnt = 0
for i in product(sorted('ВОЗДУХ'), repeat = 5):
a = ''.join(i)
if (a.count('О') + a.count('У') == 1) and ('ОВ' not in a) and ('ОХ' not in a) and ('ВО' not in a) and ('ХО' not in a) and ('УВ' not in a) and ('УХ' not in a) and ('ВУ' not in a) and ('ХУ' not in a):
cnt += 1
print(cnt)

А вот скриншот, глядите его, с отступами

-12

Ответ на задачу 896

Задача №12.

-13

задача опять же типовая, проблем вызвать не должна

for n in range(4,300):
s = '8' + '5'*n
while ('8858' in s) or ('555' in s):
if ('8858' in s):
s = s.replace('8858','4',1)
else:
s = s.replace('555','58',1)
if ('5858' in s):
s = s.replace('5858', '85', 1)
if (sum(map(int,s))) == 66:
print(n)

вот скриншот кода и ответ, смотрите. Типовой алгоритм подсчета цифр в числе (символов в строке, переведенных в число) надо знать - пригодится. Он может быть и без функции map - sum(int(c) for c in s)

-14

Задача 13

-15

Палиндром надо уметь определять. строка и ее разворот с помощью среза s[::-1] - хорошая идея решения, но надо грамотно определить последний октет адреса. Конечно, вариантов кода может быть несколько, но в целом сводятся к этому:

from ipaddress import *
k = 0
net = ip_network('
95.112.224.0/255.255.255.128')
for ip in net:
ip_b = bin(int(ip))[2:]
a = ip_b[23:]
if a == a[::-1]:
k = k + 1
print(k)

или скриншот с ответом:

-16

Можно их вывести и посмотреть воочию

00000000

00011000

00100100

00111100

01000010

01011010

01100110

01111110

Задача 14

-17

Уровень - простой. Чтобы найти количество шестерок, можно даже само число и не делать, добавлять в счетчик последнюю цифру числа, если она =6

x = 7*49**120 - 6*343**65 - 5*7**40
k = 0
while x:
if x % 7 == 6: k += 1
x = x // 7
print(k)

-18

15 задача

-19

Решать можно по-разному - от аналитического, до программного двумя вариантами. Вот решение через all

def f(a,x,y):
return ((x>=a) or (121>=x**2)) and ((y**2<49) or (a<y))

for a in range(1000, 1, -1):
if all(f(a,x,y) for x in range(1, 100) for y in range(1, 100)):
print(a)
break

-20

Или с помощью флага, простым генерированием перебора x и y. Флаг мы роняем в том случае, если хотя бы один x или y обратил в ноль функцию

-21

Задача 16

-22

Задача на рекурсию. Легко решается "ручками". Вот привожу пример с доски:

-23

Ну или проходит программное решение, правда, считает долго:

тут даже можно ни кэш ни честить, ни глубину рекурсии не устанавливать - так посчитает

from sys import *
setrecursionlimit(5000)
def f(n):
if n <= 1: return 1
if n > 1 and n%3==0: return f(n-1) + n/3
else: return f(n-1) + f(n-2)
print(f(54) - f(52) - f(50))

-24

17 задача

опять же типовая совершенно задачка.

-25

Подцепить файл тут главное правильно - чтобы он был в той же директории, что и сама программа

sp = [int(x) for x in open('1.txt')]
x = 79971
tr = []
for i in range(len(sp)-2):
a = sp[i]
b = sp[i+1]
c = sp[i+2]
u1 = ((a%2 == 0) + (b%2 == 0) + (c%2 == 0)) <= 2
u2 = (a+b+c) <= x
if u1 and u2:
tr.append(a+b+c)
print(len(tr), max(tr))

ну или такое решение ученика:

-26

Задачи 19-21

-27
-28
-29

Вот код на все три задачи, но важный нюанс - в 19-й ход неудачный у Поли - меняем в функции all на any

def f(s1, s2, m):
if s1 + s2 >=150: return m%2==0
if m == 0: return 0
nm = [f(s1+2,s2,m-1),f(s1,s2+2,m-1),f(s1*3,s2,m-1),f(s1,s2*3,m-1)]
return any(nm) if (m-1)%2==0 else any(nm)
print(19, [s for s in range(1, 134) if f(16,s,2)])

На 20 и 21 задачи вот такое решение:

def f(s1, s2, m):
if s1 + s2 >=150: return m%2==0
if m == 0: return 0
nm = [f(s1+2,s2,m-1),f(s1,s2+2,m-1),f(s1*3,s2,m-1),f(s1,s2*3,m-1)]
return any(nm) if (m-1)%2==0 else all(nm)
print(19, [s for s in range(1, 134) if f(16,s,2)])
print(20, [s for s in range(1, 134) if not f(16,s,1) and f(16,s,3)])
print(21, [s for s in range(1, 134) if not f(16,s,2) and (f(16,s,2) or f(16,s,4))])

-30

Устно все решается - не забудьте проверить найденные ответы, прежде чем вносить в бланк

Задача 23

совершенно типовое условие, ну и решение, понятное дело, тоже

-31

def f(x,fin):
if x>fin or x==11: return 0
if x==fin: return 1
if x<fin: return f(x+1,fin) + f(x+4,fin) + f(x*3,fin)
print(f(7,27)*f(27,42))

-32