Покажу как решил задачи 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)
или скриншот с выводом:
путем нехитрых логических рассуждений приходим к выводу, что ответ такой:
Задание 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 - в 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
а вот задача 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
Главная идея - после того как сделали слово, мы его проверяем на выполнимость условия - находим логическую сумму "каунтов" - она должна быть равна 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)
А вот скриншот, глядите его, с отступами
Ответ на задачу 896
Задача №12.
задача опять же типовая, проблем вызвать не должна
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)
Задача 13
Палиндром надо уметь определять. строка и ее разворот с помощью среза 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)
или скриншот с ответом:
Можно их вывести и посмотреть воочию
00000000
00011000
00100100
00111100
01000010
01011010
01100110
01111110
Задача 14
Уровень - простой. Чтобы найти количество шестерок, можно даже само число и не делать, добавлять в счетчик последнюю цифру числа, если она =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)
15 задача
Решать можно по-разному - от аналитического, до программного двумя вариантами. Вот решение через 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
Или с помощью флага, простым генерированием перебора x и y. Флаг мы роняем в том случае, если хотя бы один x или y обратил в ноль функцию
Задача 16
Задача на рекурсию. Легко решается "ручками". Вот привожу пример с доски:
Ну или проходит программное решение, правда, считает долго:
тут даже можно ни кэш ни честить, ни глубину рекурсии не устанавливать - так посчитает
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))
17 задача
опять же типовая совершенно задачка.
Подцепить файл тут главное правильно - чтобы он был в той же директории, что и сама программа
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))
ну или такое решение ученика:
Задачи 19-21
Вот код на все три задачи, но важный нюанс - в 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))])
Устно все решается - не забудьте проверить найденные ответы, прежде чем вносить в бланк
Задача 23
совершенно типовое условие, ну и решение, понятное дело, тоже
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))