Загрузка данных


# ======= ЗАДАНИЕ №2 (Логика) =======
def task_2():
    print('w x y z')
    for w in range(2):
        for x in range(2):
            for y in range(2):
                for z in range(2):
                    # Вставляй условие из задачи сюда:
                    # or (V), and (/\), <= (->), == (≡), not (¬)
                    if not ((not (x <= y)) or (z <= w) or (not z)):
                        print(w, x, y, z)


# ======= ЗАДАНИЕ №5 (Алгоритмы) =======
# Перевод в 2СС
def task_5_2cc():
    for n in range(1, 1000):
        r = bin(n)[2:]
        if r.count('1') % 2 == 0:
            r = '10' + r[2:] + '0'
        else:
            r = '11' + r[2:] + '1'
        res = int(r, 2)
        if res > 19:
            print(n)

# Перевод в 4СС (или любую другую)
def f_5_4cc(n):
    r = ''
    while n > 0:
        r = str(n % 4) + r
        n //= 4
    return r

def task_5_4cc():
    t = []
    for n in range(1, 100000):
        r = f_5_4cc(n)
        # Условие суммы или количества цифр
        if (r.count('1') + r.count('2')*2 + r.count('3')*3) % 2 == 0:
            r = '31' + r + '02'
        else:
            r = '1' + r + f_5_4cc(n % 3 * 7)
        res = int(r, 4)
        if res < 4528:
            t.append(n)
    print(max(t))


# ======= ЗАДАНИЕ №6 (Черепашка) =======
def task_6():
    from turtle import tracer, screensize, setpos, dot, done, forward, right, up
    k = 20
    tracer(0)
    screensize(2000, 2000)
    
    # Сюда алгоритм движения из задачи (forward, right и т.д.)
    
    # Сетка точек
    for x in range(-100, 100):
        for y in range(-100, 100):
            up()
            setpos(x * k, y * k)
            dot(2) # Размер точки
    done()


# ======= ЗАДАНИЕ №8 (Комбинаторика) =======
from itertools import product, permutations

def task_8_iter():
    k = 0
    # product - если символы повторяются
    # permutations - если символы НЕ повторяются
    for i in product('012345678', repeat=5):
        x = ''.join(i)
        if x[0] != '0' and x.count('0') == 1:
            t = x.index('0')
            # Условия на соседей
            if x[t-1] in '2468' and (t == 4 or x[t+1] in '2468'):
                k += 1
    print(k)


# ======= ЗАДАНИЕ №9 (Файлы/Таблицы) =======
def task_9():
    f = open('9.txt')
    k = 0
    for line in f:
        a = sorted([int(x) for x in line.split()])
        a2 = [int(x) for x in a if a.count(x) >= 3] # Повторяющиеся
        a3 = [int(x) for x in a if a.count(x) == 1] # Уникальные
        if len(a2) >= 1 and len(a3) >= 1:
            if sum(a2)/len(a2) > sum(a3)/len(a3):
                k += 1
    print(k)


# ======= ЗАДАНИЕ №13 (IP-адреса) =======
from ipaddress import ip_network

def task_13():
    # Ставим 0 в конце адреса, если ищем адрес сети
    net = ip_network('172.16.80.0/255.255.248.0', strict=False)
    k = 0
    for ip in net:
        s = bin(int(ip))[2:]
        if s.count('1') % 2 != 0:
            k += 1
    print(k)


# ======= ЗАДАНИЕ №14 (Системы счисления) =======
def task_14_calc():
    # Поиск цифры в уравнении
    for x in '0123456789abcdefghijk':
        a = int('82934' + x + '2', 21) + int('2924' + x + x + '7', 21)
        if a % 20 == 0:
            print(a // 20)

def task_14_digits():
    # Подсчет количества цифр или суммы в СС
    n = 125 + 25**3 + 5**9
    k0 = 0
    while n > 0:
        if n % 5 == 0: k0 += 1
        n //= 5
    print(k0)


# ======= ЗАДАНИЕ №15 (Логика/Графики/Отрезки) =======
def task_15_segments():
    p = list(range(15, 41))
    g = list(range(21, 64))
    a = []
    for x in range(1, 100):
        # Если находим НАИМЕНЬШЕЕ A (проверяем ложность выражения)
        if not ((x in p) <= (((x in g) and (not (x in a))) <= (not (x in p)))):
            a.append(x)
    print(a)

def task_15_del():
    for a in range(1, 900):
        m = 1
        for x in range(1, 900):
            # Если видим отрицание ДЕЛ, ставим != 0
            if not (((405 % x == 0) <= (81 % x == 0)) or (a - x > 162)):
                m = 0
                break
        if m == 1:
            print(a)
            break


# ======= ЗАДАНИЕ №16 (Рекурсия) =======
import sys
from functools import lru_cache
sys.setrecursionlimit(10**6)

@lru_cache(None)
def f_16(n):
    if n <= 9: return 3*n
    return f_16(n-4) + 2


# ======= ЗАДАНИЕ №17 (Последовательности) =======
def task_17():
    f = open('17.txt')
    a = [int(i) for i in f]
    al = [i for i in a if 9 < i < 100] # Условие (например, двузначные)
    k = []
    for i in range(len(a) - 1):
        # Сюда условия на пары элементов
        if ((a[i] in al and a[i+1] not in al) or (a[i] not in al and a[i+1] in al)):
            k.append(a[i] + a[i+1])
    print(len(k), max(k))


# ======= ЗАДАНИЯ №19-21 (Теория игр) =======
# Одна куча
def f_game1(k, h):
    if k >= 68: return h % 2 == 0
    if h == 0: return 0
    moves = [f_game1(k + 1, h - 1), f_game1(k * 2, h - 1)]
    if (h - 1) % 2 == 0: return any(moves)
    else: return all(moves)

# Две кучи
def f_game2(k1, k2, h):
    if k1 + k2 >= 68: return h % 2 == 0
    if h == 0: return 0
    moves = [f_game2(k1 + 1, k2, h - 1), f_game2(k1 * 2, k2, h - 1),
             f_game2(k1, k2 + 1, h - 1), f_game2(k1, k2 * 2, h - 1)]
    
    # h-1 % 2 == 0 - ход игрока, который хочет выиграть (any)
    # иначе - ход противника (all)
    if (h - 1) % 2 == 0: return any(moves)
    else: return all(moves)
    # ПРИМЕЧАНИЕ ДЛЯ 19 ЗАДАЧИ: если Ваня выиграл после НЕУДАЧНОГО хода Пети,
    # заменить последний all(moves) на any(moves).


# ======= ЗАДАНИЕ №23 (Пути) =======
def f_23(a, b):
    if a > b or a == 8: return 0 # 8 - точка, через которую НЕЛЬЗЯ проходить
    if a == b: return 1
    return f_23(a + 1, b) + f_23(a + 2, b) + f_23(a * 2, b)

# Если нужно пройти через 14: f_23(3, 14) * f_23(14, 18)