Домашняя работа по курсу

Как сдавать домашнюю работу

  1. Зарегистрироваться на факультетском Ejudge

    • <!> ВНИМАНИЕ! Зарегистрированные пользователи заходят тут

  2. Выбрать 86-й «турнир» (UNИX Python 2017)
    • Возможно, придётся пойти по ссылке «Confirm registration» («Подтвердить регистрацию»)
    • Возможно, придётся пойти по ссылке «Participate» («Участвовать»)
  3. Выбрать соответствующую задачку
  4. Загрузить решение
    • Прежде, чем загружать решение, убедитесь, что оно правильное. Не надо вместо этого делать много различных вариантов решения в надежде, что какой-то один всё-таки пройдёт тесты.
    • Если возникают вопросы — спрашивайте, для этого есть и интерфейс eJudge, и почта/ВК/телеграф/телефон (FrBrGeorge)

  5. Дождаться конца проверки (как правило, несколько секунд) и обновить страницу браузера

Как оформлять решение

Задача типа «написать программу»

По умолчанию, т. е. если иное не указано отдельно:

⇒ Для ввода можно пользоваться input() (чаще даже eval(input())) без строки-подсказки, а для вывода — print(). Ещё раз: никаких переговоров с роботом — только ввод входных данных и вывод выходных, иначе программа не пройдёт тест!

Задача типа «написать класс»

Задача типа «написать модуль»

Пример задачи: Написать модуль, в котором будет присутствовать целочисленный объект Count, изначально равный 0, и функция incr(level), увеличивающая Count на число level

Модуль-решение:

Count = 0

def incr(level):
    global Count
    Count += level

Тест:

print(mod.Count)
mod.incr(100)
print(mod.Count)
# Список неспециальных объектов моудуля
print(*sorted(s for s in dir(mod) if not s.startswith("_")))

Вывод:

0
100
Count incr

Тестирующая программа

Сводный список домашних заданий

  • Установить Python и поработать в командной строке
  • Прочитать и отщёлкать вторую главу учебника (имеется перевод, правда, для Python3.1.5)

  • Прочитать про настройку командной строки в учебнике

  • Настроить что-нибудь
  • <!> Настроить что-нибудь на Windows :(

    • Подсказка: для не-unix систем есть модуль, имитирующий readline (кажется, pyreadline)

См. ../HomeworkRules

  1. Установить и настроить подходящий текстовый редактор или IDE (пример: настройка Geany)

  2. Разобраться с #WAT

  3. EJudge: HelloWorld 'Hello World'

    Написать программу, которая выводит строку Hello, world (в точности)

    Input:

    (ввод не нужен)
    Output:

    Hello, world
  4. EJudge: AndOr 'Условное выражение'

    Ввести два объекта Python и вывести первый непустой из них. Если оба пустые, вывести NO.

    Input:

    []
    123
    Output:

    123
  5. EJudge: DotsInCircle 'Точки в круге'

    В первой строке ввести координаты центра круга и его радиус (числа x, y, r через запятую). Во второй и последующих строках ввести пары чисел — координаты точек. Ввод заканчивается парой 0,0 (она не входит в проверку!). Вывести YES, если все точки принадлежат кругу и NO, если не все.

    Input:

    1,1,2
    1,2
    1,3
    2,2
    0,0
    Output:

    YES
  6. EJudge: IntPalindrome 'Число-палиндром'

    Ввести целое положительное число и проверить, является ли оно палиндромом, т. е. совпадает ли первая цифра с последней, вторая — с предпоследней и т. д. Представлять число в виде последовательности (строки, списка и т. п.) нельзя. Вывести YES или NO соответственно. Лидирующие нули не учитывать (числа, заканчивающиеся на 0 — автоматически не палиндромы).

    Input:

    1234321
    Output:

    YES
  7. EJudge: AnyPower 'Какая-нибудь степень'

    Ввести небольшое натуральное число 2⩽N⩽1000000 и проверить, является ли оно степенью натурального числа (>1). Вывести YES или NO соответственно.

    Input:

    1024
    Output:

    YES
  • Прочитать:
  • <!> Как передать eval(input()) что-нибудь действительно нехорошее, чтобы Python что-нибудь выполнил или завёл очень большой объект?

  • EJudge: ParallelSegments 'Параллельные отрезки'

    Ввести восемь чисел через запятую — целочисленные координаты 4-х несовпадающих точек A1, A2, A3 и A4: X1, Y1, X2, Y2, X3, Y3, X4, Y4. Вывести YES, если прямая A1A2 параллельна прямой A3A4 (или совпадает с ней), и NO — если не параллельна.

    Input:

    1,2,7,14,8,8,18,28
    Output:

    YES
  • EJudge: SectionShuffle 'Перетасовать кортеж'

    Ввести последовательность A объектов Python через запятую, и вывести кортеж, состоящий из элементов последовательности, стоящих на чётных местах — в обратном порядке (включая A[0]), после которых идут в исходном порядке элементы последовательности, стоящие на нечётных местах.

    Input:

    '0', 1, 2, '3', 4, 5, '6', 7, 8, '9', 10, 11
    Output:

    (10, 8, '6', 4, 2, '0', 1, '3', 5, 7, '9', 11)
  • EJudge: SecondMax 'Второй максимум'

    Ввести последовательность S и вывести второй максимум этой последовательности, т. е. элемент a∈S : ∃ b∈S : b>a и a⩾c ∀c∈S, c≠b. Если второго максимума нет, вывести NO. Пользоваться функциями наподобие max() или sorted() нельзя.

    Input:

    3,4,5,6,7
    Output:

    6
  • EJudge: PaidStairs 'Платная лестница'

    (MCCME) Мальчик подошел к платной лестнице. Чтобы наступить на любую ступеньку, нужно заплатить указанную на ней сумму (положительное целое число). Мальчик умеет перешагивать на следующую ступеньку, либо перепрыгивать через ступеньку. Требуется узнать, какая наименьшая сумма понадобится мальчику, чтобы добраться до верхней ступеньки. На последнюю ступеньку наступать обязательно

    Input:

    9,5,3,5,2,4,5,3,7,8,3,7,1,9,10,1,1,10,10,7,10,3,2,6,7,2,2,10,3,8
    Output:

    77
  • {i} Прочитать про функции, итераторы и генераторы в учебнике

  • Как одним print()-ом вывести все элементы произвольного кортежа Python3 через пробел?

  • Придумать пример «из жизни» для вложенного задания функции
  • EJudge: Det4x4 'Определитель матрицы 4×4'

    Матрица 4×4 задаётся кортежем из 4 кортежей по 4 целых числа в каждом. Посчитать определитель этой матрицы. Допустимо заранее составить (а не вычислять на ходу) последовательность из всех перестановок индексов и знаков этих перестановок.

    Input:

    (5, -4, 4, -7), (1, -2, 6, 0), (3, -8, -6, -4), (-1, 2, -9, 3)
    Output:

    702
  • EJudge: EvalFunction 'Сложение и умножение'

    Ввести строку, содержащую выражение ЯП Python3. В строке, помимо стандартных действий над объектами, может встречаться вызов функции Add(a,b) (возвращает сумму a и b) и Mul(a,b) (возвращает произведение a и b). Вычислить и вывести значение этого выражения.

    Input:

    Mul(Add(-2,5),Add((1,2),(100,500)))[3:]
    Output:

    (500, 1, 2, 100, 500, 1, 2, 100, 500)
  • EJudge: IterPi 'Расстояние от Пи'

    Пользуясь формулой Лейбница для вычисления числа Пи:

    • LeibnitzPi.png

    написать бесконечный генератор pigen(), возвращающий последовательно 4, 4-4/3, 4-4/3+4/5, …; ввести некоторое расстояние E и вывести номер элемента этой последовательности, первым попадающего в E/2-окрестность числа Пи. Внимание! Тесты написаны из расчёта, что проверка такая: как только очередное значение pigen() по модулю перестанет отличаться от предыдущего значения больше, чем на E, выводим, на каком обороте цикла это произошло.

    Input:

    0.001
    Output:

    2000
  • EJudge: GenTriseq 'Повторитель'

    Ввести кортеж целых чисел V, затем число N. Написать генератор, возвращающий сначала все числа из кортежа (в порядке следования), не превосходящие его нулевой элемент, затем все числа, не превосходящие первый, и т. д. вплоть до последнего элемента. Вывести N-й элемент этой последовательности, или "NO", если таковой не существует.

    Input:

    10, 10, 1, 7, 8, 0, 5
    10
    Output:

    7

Внимание!: более подробное объяснение условий и некоторые подсказки можно найти по ссылкам «полное условие»`

  • Прочитать
  • Придумать пример использования параметрического генератора
  • EJudge: FilterList 'Отфильтрованный список'

    Ввести кортеж целых чисел, затем два натуральных числа M и N, и вывести список из элементов, (1) не стоящих на местах, кратных M, и (2) при этом не кратных N

    Input:

    1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
    3,4
    Output:

    [2, 3, 5, 6, 9, 11, 14, 15]
  • EJudge: LookSay 'Прочти это вслух'

    Написать генератор цифр последовательности Конвея «Look and Say». (Сама последовательность Конвея). Ввести N⩾0 и вывести N-ю цифру последовательности.

    Input:

    100500
    Output:

    2
  • EJudge: DodgsonDet 'Определитель'

    Ввести квадратную целочисленную матрицу построчно и посчитать её определитель (например, методом конденсации Доджсона). Размер матрицы (1<N<14) определяется длиной её нулевой строки.

    Input:

    8, 8, 5, 6, 3
    1, 4, 4, 9, 0
    9, 6, 7, 7, 3
    4, 1, 0, 1, 4
    6, 7, 9, 7, 3
    Output:

    2784
  • EJudge: SpiralDigits 'Цифры по спирали'

    Ввести целые M и N, вывести последовательность 0 1 2 3 4 5 6 7 8 9 0 1 2 3 … в виде спирально (по часовой стрелке, из верхнего левого угла) заполненной таблицы M×N. Не забываем про то, что M и N могут быть чётными, нечётными и неизвестно, какое больше.

    Input:

    6,5
    Output:

    0 1 2 3 4 5
    7 8 9 0 1 6
    6 7 8 9 2 7
    5 6 5 4 3 8
    4 3 2 1 0 9
  • (Разбор решения в полном условии задачи, но на EJudge она тоже будет)

    EJudge: YieldFrom 'Суперпозиция генераторов'

    Ввести последовательность четвёрок целых чисел вида (s, d, m, n), (…), …. Для каждой четвёрки составить целочисленную последовательность {ai}: a0=s, ai+1=ai/d+m, если ai делится на d и ai+1=ai+n в противном случае. Последовательность заканчивается на i-м элементе, если i+1-й будет ему равен, в противном случае (цикл из нескольких значений или неограниченный рост) последовательность считается бесконечной. Если последовательность, полученная из очередной четвёрки, заканчивается, начинается последовательность, полученная из следующей четвёрки. Ввести k и вывести k-й член этой общей последовательности или "NO", если в ней меньше k элементов. См. далее разбор решения.

    Input:

    (4,2,5,3),(3,5,8,1),(5,3,8,2),(3,4,2,6)
    30
    Output:

    13
  • Прочитать
  • Посмотреть, как оформлена, и разобраться, как работает программа «рисования» фигур на текстовом экране. Дописать функции, рисующие:

    • прямоугольник со сторонами, параллельными осям координат
    • ломаную (из последовательности пар координат)
    • <!> окружность

  • EJudge: MaxInt 'Поиск наибольшего числа в тексте'

    Ввести текст, состоящий из нескольких строк (заканчивается пустой строкой). Каждая строка состоит из «слов» (последовательностей непробельных символов), разделённых пробелами или табуляциями. Некоторые слова — целые числа (возможно, отрицательные), другие числами не являются (хотя могут содержать цифры). Найти и вывести наибольшее из этих чисел.

    Input:

    enemies -565 glanduliform h252Tbeaic -tv5naa2re4 55 silicamortar eared
    ra50ertc-8 -4 94 ohgutyd38 163 -562 u8e8qisn handout crossword 22s4cico
    -v80s6eessl beaning en1A1i-2l 545 december flo ch00a0-h1t vignettist
    ­­
    Output:

    545
  • EJudge: PatternFind 'Поиск простого шаблона в строке'

    Ввести строку, содержащую произвольные символы (кроме символа «@»). Затем ввести строку-шаблон, которая может содержать символы @. Проверить, содержится ли в исходной строке подстрока, совпадающая со строкой-шаблоном везде, кроме символов @; на месте @ в исходной строке должен стоять ровно один произвольный символ. Вывести позицию в строке, с которой начинается эта подстрока или -1, если её там нет.

    Input:

    исходной строке подстрока, совпадающая со строкой
    ст@ок@
    Output:

    9
  • задачу на обход лабиринта я решил пока не давать и так много. Но почитайте всё-таки :)

  • Почитать
  • Разобраться с кодом, имитирующим хеш-таблицы

    • Задать вопросы, если что непонятно
  • EJudge: ThreeSquares 'Три квадрата'

    Ввести произвольную последовательность (не обязательно кортеж) натуральных чисел, не превышающих 1000000. Вывести, сколько среди них различных чисел, являющихся суммой трёх квадратов.

    • Пояснение. Поскольку входная последовательность обрабатывается eval(), она может быть, например, такой: (1+i%10 for i in range(100000)), в этом случае ответ — тоже 3 :)

    Input:

    3, 4, 2, 9, 1, 5, 6, 7, 8, 3, 6
    Output:

    3
    • ВНИМАНИЕ! В тестах по задаче до 2017-11-09 содержалась ошибка!

  • EJudge: MostPopular 'Самые популярные'

    Ввести строку, состоящую из разделённых пробелами последовательностей маленьких и больших латинских букв. Вывести, сколько различных слов (без учёта регистра) встречается в этой строке чаще всего.

    Input:

    dAh Dit dah dIT dAH Dit GIgly diGLy biglY GiGly bOOm quack OH quack
    Output:

    2
  • EJudge: DungeonMap 'Карта подземелья'

    Вводится карта проходимых в обе стороны тоннелей подземлья в виде строк, содержащих разделённые пробелом названия двух пещер, которые соединяет соответствующий тоннель. Две последние строки не содержат пробелов — это название входа в подземелье и название выхода. Вывести "YES", если из входа можно попасть в выход, и "NO" в противном случае. Пары могут повторяться или содержать одинаковые слова.

    Input:

    markers jumping
    jumping guinea
    skiing pre
    markers gauge
    skiing mpeg
    solar jackson
    skiing solar
    guinea gauge
    mpeg honor
    pre honor
    guinea gauge
    pre mpeg
    markers guinea
    markers gauge
    honor mpeg
    markers jumping
    skiing
    jumping
    Output:

    NO
  • EJudge: FarGalaxy 'В далёкой галактике'

    Ввести построчно четвёрки вида «число число число слово», где первые три числа — это координаты галактики по имени «слово» (некоторые галактики могут называться одинаково, но координаты у всех разные). Последняя строка ввода не содержит пробелов и не учитывается. Вывести в алфавитном порядке имена любых двух наиболее удалённых друг от друга галактик.

    Input:

    35.764 -797.636 -770.320 almost
    88.213 -61.688 778.457 gene
    -322.270 -248.555 -812.730 trend
    721.262 630.355 968.287 dow
    -895.519 -970.173 97.282 non
    -561.036 -350.840 -723.149 disco
    -151.546 -900.962 -658.862 bidder
    -716.197 478.576 -695.843 hawaii
    -744.664 -173.034 -11.211 sad
    -999.968 990.467 650.551 erik
    .
    Output:

    almost erik
  • Прощёлкать FrBrGeorge/ClassesInPython3

  • Прочитать
  • Как оформлять Д/З типа «написать класс»

  • EJudge: DummyClass 'Просто класс'

    Написать класс Delay, экземпляры которого содержат объект slot (задаётся конструктором) и метод delay(new), который присваивает slot новое значение new, а возвращает предыдущее значение slot.

    Input:

    de = Delay(100500)
    print(de.delay(42))
    print(de.delay(0))
    print(de.slot)
    print(*sorted(s for s in dir(de) if not s.startswith("_")))
    Output:

    100500
    42
    0
    delay slot
  • EJudge: CountInt 'Целые поля'

    Ввести (с помощью eval(input())) некоторый объект Python3 и посчитать, склько у него целочисленных полей (включая спецполя, имя которых начинается на "_").`

    Input:

    100500
    Output:

    4
  • EJudge: SharedBrain 'Единый мозг'

    Написать класс Overall, в котором будет единственный метод .click(), возвращающий количество вызовов этого метода у всех экземпляров класса Overall.

    Input:

    a, b = Overall(), Overall()
    print(a.click())
    print(b.click())
    print(b.click())
    print(a.click())
    Output:

    1
    2
    3
    4
  • EJudge: NormalDouble 'Простой и двойной'

    Написать два класса — Normal и Double, в каждом из которых будет два метода — .swap(other) и .what().__init__(start), задающий начальное значение некоторому полю. Метод .what() класса Normal должен возвращать значение этого поля, а .swap(other) — менять местами значния полей текущего объекта и объекта other. Аналогичные методы класса Double должны все значения умножать на 2: само поле — при инициализации и обмене (у обоих объектов), возвращаемое значение — в методе .what()

    Input:

       1 a = Normal(3)
       2 b = Double(1)
       3 print(a.what(), b.what())
       4 a.swap(b)
       5 print(a.what(), b.what())
       6 b.swap(a)
       7 print(a.what(), b.what())
    
    Output:

    3 4
    2 6
    6 8
  • Прочитать:
  • EJudge: SimpleVector 'Простой вектор'

    Определить класс Vector, работающий с трёхмерными векторами Вектора должны поддерживать:

    • Конструктор вектора из трёх вещественных чисел
    • Сложение и вычитание векторов A+B, A-B
    • Умножение и деление на число A*n, A/n; а также и n*A
    • Скалярное произведение A@B
    • Преобразование в строковый вид "x:y:z, где x, y и z — представление вещественного числа с двумя знаками после запятой (см. пример)
    Input:

    A = Vector(1,2,3)
    B = Vector(-1,3,-2)
    C = Vector(7,3,5)
    print("A, B, C:", A, B, C)
    print(A, "+", B, "=", A+B)
    print(A, "-", C, "=", A-C)
    print(A, "*", 2, "=", A*2)
    print(2, "*", B, "=", 2*B)
    print(C, "/", 3, "=", C/3)
    print(B, "@", C, "=", "{:.2f}".format(B@C))
    Output:

    A, B, C: 1.00:2.00:3.00 -1.00:3.00:-2.00 7.00:3.00:5.00
    1.00:2.00:3.00 + -1.00:3.00:-2.00 = 0.00:5.00:1.00
    1.00:2.00:3.00 - 7.00:3.00:5.00 = -6.00:-1.00:-2.00
    1.00:2.00:3.00 * 2 = 2.00:4.00:6.00
    2 * -1.00:3.00:-2.00 = -2.00:6.00:-4.00
    7.00:3.00:5.00 / 3 = 2.33:1.00:1.67
    -1.00:3.00:-2.00 @ 7.00:3.00:5.00 = -8.00
  • EJudge: StrangeDots 'Странные отрезки'

    Написать класс Dots, генерирующий заданное количество точек на заданом отрезке

    • При создании объекта типа Dots задаются вещественные границы отрезка

    Объект d типа Dots должен поддерживать индексирование по таким правилам:

    • d[n] — последовательность из n равноудалённых точек от начала до конца отрезка (включая конец)

    • d[i:n]i-я точка такой последовательности

    • d[i:j:n] — последовательность начиная с i-той и заканчивая j-1-й точкой такой последовательности

    • Выход за границы отрезка означает экстраполяцию (см. пример)
    Input:

    a = Dots(0,40)
    print(*a[5])
    print(a[0:5])
    print(a[2:5])
    print(a[4:5])
    print(a[7:5])
    print(a[-7:5])
    print(*a[1:3:5])
    print(*a[:3:5])
    print(*a[2::5])
    print(*a[::5])
    print(*a[-2:6:5])
    Output:

    0.0 10.0 20.0 30.0 40.0
    0.0
    20.0
    40.0
    70.0
    -70.0
    10.0 20.0
    0.0 10.0 20.0
    20.0 30.0 40.0
    0.0 10.0 20.0 30.0 40.0
    -20.0 -10.0 0.0 10.0 20.0 30.0 40.0 50.0
  • EJudge: UnaryNumber 'Палочная система счисления'

    Написать класс Unary, реализующий единичную систему счисления. Палочное представление L числа N

    • создаётся из любой строки длиной N
    • представляется в виде строки из N символов "|"
    • имеет длину N
    • можно пройти циклом (при этом N раз возвращается палочная единица)
    • можно дополнить другим палочным числом K с помощью L |= K (при этом длина L увеличивается на длину K)

    • можно поделить пополам нацело с помощью ~L (лишняя палка исчезает)

    • можно дополнить одной палкой с помощью +L

    Во всех случаях изменения числа идентификатор объекта сохраняется. Унарныеоперации не только изменяют объект, но и возвращают его.

    Input:

       1 a = Unary("||")
       2 b = Unary("||||")
       3 print(a, b)
       4 a |= b
       5 print(a)
       6 print(~a)
       7 for c in a:
       8     print("  ",c)
       9     print(". ",+c)
      10     print("..",+c)
      11 ~a
      12 ~a
      13 print("Error" if a else a is a)
    
    Output:

    || ||||
    ||||||
    |||
       |
    .  ||
    .. |||
       |
    .  ||
    .. |||
       |
    .  ||
    .. |||
    True
  • EJudge: TrianglesCmp 'Сравниваем треугольники'

    Написать класс Triangle, моделирующий треугольник

    • объект T типа Triangle создаётся из трёх вещественных чисел — сторон треугольника

    • T пуст, если не выполняется строгое неравенство треугольника или хотя бы одна из сторон не положительна

    • abs(T) — площадь треугольника (0, если T пуст)

    • сравнение на неравенство двух объектов типа Triangle есть результат сравнения их площадей

    • два объекта S и T типа Triangle равны, если попарно равны их стороны (в некотором порядке)

    • строковое представление: a:b:c, где a, b и c — стороны треугольника в порядке их задания

    Input:

       1 Tri = Triangle(3,4,5), Triangle(5,4,3), Triangle(7,1,1), Triangle(5,5,5), Triangle(7,4,4)
       2 for a,b in zip(Tri[:-1],Tri[1:]):
       3     print(a if a else b)
       4     print("{}={:.2f} {}={:.2f}".format(a, abs(a), b, abs(b)))
       5     print(a == b)
       6     print(a >= b)
       7     print(a < b)
    
    Output:

    3.0:4.0:5.0
    3.0:4.0:5.0=6.00 5.0:4.0:3.0=6.00
    True
    True
    False
    5.0:4.0:3.0
    5.0:4.0:3.0=6.00 7.0:1.0:1.0=0.00
    False
    True
    False
    5.0:5.0:5.0
    7.0:1.0:1.0=0.00 5.0:5.0:5.0=10.83
    False
    False
    True
    5.0:5.0:5.0
    5.0:5.0:5.0=10.83 7.0:4.0:4.0=6.78
    False
    True
    False
  • Прочитать
  • EJudge: MegaStroka 'Усиленная строка'

    Написать класс Stroka, унаследованииый от str, экземпляр которого s дополнительно поддерживает следующие операции:

    • объект типа Stroka, содержащий символы s в обратном порядке: -s

    • объект типа Stroka, содержащий все пары символов из объектов s и t в порядке следования — s*t (t может быть просто строкой)

    • объект типа Stroka, равный s*s*…(n-1 раз)…*ss**n (s**0 — пустая Stroka)

    Input:

       1 a, b, c, d = Stroka("wer"), Stroka("ASDF"), Stroka("12"), Stroka(":,")
       2 print(a+b)
       3 print(c*4)
       4 print(b[2:])
       5 print(a*b)
       6 print(c**3)
       7 print(a*c*d)
    
    Output:

    werASDF
    12121212
    DF
    wAwSwDwFeAeSeDeFrArSrDrF
    11121112111221222122111221222122
    w:w,1:1,w:w,2:2,e:e,1:1,e:e,2:2,r:r,1:1,r:r,2:2,
  • EJudge: GuessABC 'Угадайка'

    Задать три класса — A, B и C, свойства которых неизвестны, но для которых верен пример.

    Input:

       1 a, b, c, d = A(2), B(3), C(4), C("Op")
       2 print(a,b,c, a+b+c, a*b*c, a*b*d)
       3 print(*(o+p for o in (a,b,c) for p in (a,b,c) if not o==b==p))
       4 print(*(o*p for o in (a,b,c,d) for p in (a,b,c,d) if not o==a==p and not o==d==p))
       5 print(*(isinstance(e,T) for e in (a,b,c) for T in (A,B,C)))
       6 print(*(a in T.__dict__.keys() for a in ('__add__','__mul__','__str__') for T in (A,B,C)))
    
    Output:

    /2/ |3| |4| /9/ |24| |OpOpOpOpOpOp|
    /4/ /5/ /6/ /5/ |7| |6| |7| |8|
    |6| |8| |OpOp| |6| |9| |12| |OpOpOp| |8| |12| |16| |OpOpOpOp| |OpOp| |OpOpOp| |OpOpOpOp|
    True False False False True False True True True
    True False False False True False True True False
  • EJudge: SemDescriptor 'Семафор'

    Реализовать с помощью дескрипторов абстракцию «простой семафор», используемую при разделении некроторого ресурса. При обращении к семафору либо происходит захват ресурса (семафор взводится), либо возвращается объект, который этот ресурс захватил. Взведённый семафор может сбросить только объект, который его захватил.

    Input:

       1 a, b = Sem("A"), Sem("B")
       2 print("Locked:",a.lock) # A взводит опущенный семафор
       3 print("Locked:",a.lock) # Семафор взведён A
       4 print("Locked:",b.lock) # Семафор взведён A
       5 del(b.lock)             # B пытается сбросить семафор
       6 print("Locked:",b.lock) # Семафор взведён A
       7 print("Locked:",a.lock) # Семафор взведён A
       8 del(a.lock)             # А сбрасывает семафор
       9 print("Locked:",b.lock) # B взводит опущенный семафор
      10 print("Locked:",a.lock) # Семафор взведён B
    
    Output:

    Locked: None
    Locked: <A>
    Locked: <A>
    Locked: <A>
    Locked: <A>
    Locked: None
    Locked: <B>
  • Прочитать
  • EJudge: BoldCalc 'Надёжный калькулятор'

    Написать программу — калькулятор с переменными и обработкой ошибок

    • Команда, начинающаяся на '#' — комментарий
    • Команда вида Переменная=выражение задаёт переменную

    • Команда вида выражение выводит значение выражения.

    • Если команда содержит знак "=", но не является присваиванием, выводится диагностика "invalid assignment" (см. пример)
    • Если слева от "=" находится не идентификатор, выводится диагностика "invalid identifier (см. пример)"
    • В случае любых других ошибок выводится текст ошибки.

    «Выражение» — это произвольное выражение Python3, в котором вдобавок можно использовать уже определённые переменные (и только их). Пробелов в командах нет. Пустая команда означает конец вычислений. Калькулятор вводит и исполняет команды по одной, тут же выводя диагностику, но в тестах это выглядит как ввод последовательности строк и вывод последовательности строк.

    Input:

    42
    100500//33
    "Qq!"*(6-2)
    # Здесь ошибка
    3,,5
    10/(8-8)
    "wer"[2]+"qwe"[1]
    "wer"[7]+"qwe"[9]
    1+(2+(3
    a0=5
    b0=7
    # И здесь ошибка
    12N=12
    # И ещё где-то были
    a0+b0*8
    c=b0//2+a0
    d==100
    c+d
    sorted(dir())
    Output:

    42
    3045
    Qq!Qq!Qq!Qq!
    invalid syntax (<string>, line 1)
    division by zero
    rw
    string index out of range
    unexpected EOF while parsing (<string>, line 1)
    invalid identifier '12N'
    61
    invalid assignment 'd==100'
    name 'd' is not defined
    ['__builtins__', 'a0', 'b0', 'c']


TODO

TODO


TODO

  • Прочитать
    • про параметры функций
    • про файлы
    • про pickle и struct