Домашняя работа по курсу
- Домашняя работа нужна в первую очередь для того, чтобы доказать себе и экзаменатору, что ты освоил тему.
- Задача считается сданной в срок, если в ejudge (см. ниже) зафиксирована посылка решения, успешно принятого системой (результат OK) до наступления срока сдачи.
- Количество (точнее, процент от общего числа) домашних задач, сданных в срок, будет учитываться при допуске к экзамену.
Если решение не проходит проверку, придумайте побольше своих тестов. Напишите генератор входных данных (модуль random вам в помощь).
Домашняя работа — не олимпиада. Если что-то не получается, всегда можно спросить (FrBrGeorge, знакомого питониста).
- Текст решений домашней работы — повод для разговора на экзамене.
Как сдавать домашнюю работу
Зарегистрироваться на факультетском Ejudge
ВНИМАНИЕ! Зарегистрированные пользователи заходят тут
- Выбрать 86-й «турнир» (UNИX Python 2017)
- Возможно, придётся пойти по ссылке «Confirm registration» («Подтвердить регистрацию»)
- Возможно, придётся пойти по ссылке «Participate» («Участвовать»)
- Выбрать соответствующую задачку
- Загрузить решение
- Прежде, чем загружать решение, убедитесь, что оно правильное. Не надо вместо этого делать много различных вариантов решения в надежде, что какой-то один всё-таки пройдёт тесты.
Если возникают вопросы — спрашивайте, для этого есть и интерфейс eJudge, и почта/ВК/телеграф/телефон (FrBrGeorge)
- Дождаться конца проверки (как правило, несколько секунд) и обновить страницу браузера
Как оформлять решение
Задача типа «написать программу»
По умолчанию, т. е. если иное не указано отдельно:
- программа читает со стандартного ввода и выводит на стандартный вывод
- вводимые данные корректны
- Тесты представляют собой наборы входных данных и соответствующие им наборы выходных. Если ваше решение останавливается с ошибкой, работает слишком долго или выдаёт не такие выходные данные, как в тесте, тест считается не пройденным.
⇒ Для ввода можно пользоваться input() (чаще даже eval(input())) без строки-подсказки, а для вывода — print(). Ещё раз: никаких переговоров с роботом — только ввод входных данных и вывод выходных, иначе программа не пройдёт тест!
Задача типа «написать класс»
Решение — фрагмент программы, реализующий часть её функциональности (как правило — определение классов или функций), который ничего не вводит и не выводит сам.
Пример задачи. Написать класс C, который ничего не делает:
Тест — это также фрагмент программы, который использует определённые в решении объекты
- Пример теста:
- Пример теста:
К решению в конец приписывается тестирующий код
Полученная программа вводит и исполняет тест, вывод теста сравнивается с соответствующим эталоном
- Эталон для примера выше:
- Эталон для примера выше:
Тест может включать в себя проверку на то, что в классе нет полей, кроме тех, что указаны в условии
Задача типа «написать модуль»
- Решение — программа-модуль, которую предполагается импортировать и использовать определённые в ней объекты (функции, классы и т. п.)
Решение может содержать раздел
- для самостоятельного запуска (при тестировании не используется)
Тесты представляют собой программы, которые импортируют модуль-решение под именем mod и задействуют определённые в нём объекты. Для каждой такой программы есть соответствующий файл с выходными данными, с которыми сравнивается результат её работы.
Тест может включать в себя проверку на то, что в модуле нет имён, кроме тех, что указаны в условии
Пример задачи: Написать модуль, в котором будет присутствовать целочисленный объект Count, изначально равный 0, и функция incr(level), увеличивающая Count на число level
Модуль-решение:
Тест:
Вывод:
0 100 Count incr
Сводный список домашних заданий
- Установить Python и поработать в командной строке
Прочитать и отщёлкать вторую главу учебника (имеется перевод, правда, для Python3.1.5)
Прочитать про настройку командной строки в учебнике
- Настроить что-нибудь
Настроить что-нибудь на Windows
Подсказка: для не-unix систем есть модуль, имитирующий readline (кажется, pyreadline)
См. ../HomeworkRules
Установить и настроить подходящий текстовый редактор или IDE (пример: настройка Geany)
Разобраться с #WAT
EJudge: HelloWorld 'Hello World'
Написать программу, которая выводит строку Hello, world (в точности)
(ввод не нужен)
Hello, world
EJudge: AndOr 'Условное выражение'
Ввести два объекта Python и вывести первый непустой из них. Если оба пустые, вывести NO.
[] 123
123
EJudge: DotsInCircle 'Точки в круге'
В первой строке ввести координаты центра круга и его радиус (числа x, y, r через запятую). Во второй и последующих строках ввести пары чисел — координаты точек. Ввод заканчивается парой 0,0 (она не входит в проверку!). Вывести YES, если все точки принадлежат кругу и NO, если не все.
1,1,2 1,2 1,3 2,2 0,0
YES
EJudge: IntPalindrome 'Число-палиндром'
Ввести целое положительное число и проверить, является ли оно палиндромом, т. е. совпадает ли первая цифра с последней, вторая — с предпоследней и т. д. Представлять число в виде последовательности (строки, списка и т. п.) нельзя. Вывести YES или NO соответственно. Лидирующие нули не учитывать (числа, заканчивающиеся на 0 — автоматически не палиндромы).
1234321
YES
EJudge: AnyPower 'Какая-нибудь степень'
Ввести небольшое натуральное число 2⩽N⩽1000000 и проверить, является ли оно степенью натурального числа (>1). Вывести YES или NO соответственно.
1024
YES
- Прочитать:
введение в Python в учебнике
Числовые типы Python в справочнике
Структуры данных в учебнике
Последовательности в справочнике
Как передать eval(input()) что-нибудь действительно нехорошее, чтобы Python что-нибудь выполнил или завёл очень большой объект?
EJudge: ParallelSegments 'Параллельные отрезки'
Ввести восемь чисел через запятую — целочисленные координаты 4-х несовпадающих точек A1, A2, A3 и A4: X1, Y1, X2, Y2, X3, Y3, X4, Y4. Вывести YES, если прямая A1A2 параллельна прямой A3A4 (или совпадает с ней), и NO — если не параллельна.
1,2,7,14,8,8,18,28
YES
EJudge: SectionShuffle 'Перетасовать кортеж'
Ввести последовательность A объектов Python через запятую, и вывести кортеж, состоящий из элементов последовательности, стоящих на чётных местах — в обратном порядке (включая A[0]), после которых идут в исходном порядке элементы последовательности, стоящие на нечётных местах.
'0', 1, 2, '3', 4, 5, '6', 7, 8, '9', 10, 11
(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() нельзя.
3,4,5,6,7
6
EJudge: PaidStairs 'Платная лестница'
(MCCME) Мальчик подошел к платной лестнице. Чтобы наступить на любую ступеньку, нужно заплатить указанную на ней сумму (положительное целое число). Мальчик умеет перешагивать на следующую ступеньку, либо перепрыгивать через ступеньку. Требуется узнать, какая наименьшая сумма понадобится мальчику, чтобы добраться до верхней ступеньки. На последнюю ступеньку наступать обязательно
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
77
Прочитать про функции, итераторы и генераторы в учебнике
Как одним print()-ом вывести все элементы произвольного кортежа Python3 через пробел?
- Придумать пример «из жизни» для вложенного задания функции
EJudge: Det4x4 'Определитель матрицы 4×4'
Матрица 4×4 задаётся кортежем из 4 кортежей по 4 целых числа в каждом. Посчитать определитель этой матрицы. Допустимо заранее составить (а не вычислять на ходу) последовательность из всех перестановок индексов и знаков этих перестановок.
(5, -4, 4, -7), (1, -2, 6, 0), (3, -8, -6, -4), (-1, 2, -9, 3)
702
EJudge: EvalFunction 'Сложение и умножение'
Ввести строку, содержащую выражение ЯП Python3. В строке, помимо стандартных действий над объектами, может встречаться вызов функции Add(a,b) (возвращает сумму a и b) и Mul(a,b) (возвращает произведение a и b). Вычислить и вывести значение этого выражения.
Mul(Add(-2,5),Add((1,2),(100,500)))[3:]
(500, 1, 2, 100, 500, 1, 2, 100, 500)
EJudge: IterPi 'Расстояние от Пи'
Пользуясь формулой Лейбница для вычисления числа Пи:
написать бесконечный генератор pigen(), возвращающий последовательно 4, 4-4/3, 4-4/3+4/5, …; ввести некоторое расстояние E и вывести номер элемента этой последовательности, первым попадающего в E/2-окрестность числа Пи. Внимание! Тесты написаны из расчёта, что проверка такая: как только очередное значение pigen() по модулю перестанет отличаться от предыдущего значения больше, чем на E, выводим, на каком обороте цикла это произошло.
0.001
2000
EJudge: GenTriseq 'Повторитель'
Ввести кортеж целых чисел V, затем число N. Написать генератор, возвращающий сначала все числа из кортежа (в порядке следования), не превосходящие его нулевой элемент, затем все числа, не превосходящие первый, и т. д. вплоть до последнего элемента. Вывести N-й элемент этой последовательности, или "NO", если таковой не существует.
10, 10, 1, 7, 8, 0, 5 10
7
Внимание!: более подробное объяснение условий и некоторые подсказки можно найти по ссылкам «полное условие»`
- Прочитать
о списках в учебнике,
о различных последовательностях в справочнике
- Придумать пример использования параметрического генератора
EJudge: FilterList 'Отфильтрованный список'
Ввести кортеж целых чисел, затем два натуральных числа M и N, и вывести список из элементов, (1) не стоящих на местах, кратных M, и (2) при этом не кратных N
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 3,4
[2, 3, 5, 6, 9, 11, 14, 15]
EJudge: LookSay 'Прочти это вслух'
Написать генератор цифр последовательности Конвея «Look and Say». (Сама последовательность Конвея). Ввести N⩾0 и вывести N-ю цифру последовательности.
100500
2
EJudge: DodgsonDet 'Определитель'
Ввести квадратную целочисленную матрицу построчно и посчитать её определитель (например, методом конденсации Доджсона). Размер матрицы (1<N<14) определяется длиной её нулевой строки.
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
2784
EJudge: SpiralDigits 'Цифры по спирали'
Ввести целые M и N, вывести последовательность 0 1 2 3 4 5 6 7 8 9 0 1 2 3 … в виде спирально (по часовой стрелке, из верхнего левого угла) заполненной таблицы M×N. Не забываем про то, что M и N могут быть чётными, нечётными и неизвестно, какое больше.
6,5
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 элементов. См. далее разбор решения.
(4,2,5,3),(3,5,8,1),(5,3,8,2),(3,4,2,6) 30
13
- Прочитать
про строки в учебнике и в справочнике (там же про байтовые последовательности)
про форматирование строк в учебнике и в в справочнике
Посмотреть, как оформлена, и разобраться, как работает программа «рисования» фигур на текстовом экране. Дописать функции, рисующие:
- прямоугольник со сторонами, параллельными осям координат
- ломаную (из последовательности пар координат)
окружность
EJudge: MaxInt 'Поиск наибольшего числа в тексте'
Ввести текст, состоящий из нескольких строк (заканчивается пустой строкой). Каждая строка состоит из «слов» (последовательностей непробельных символов), разделённых пробелами или табуляциями. Некоторые слова — целые числа (возможно, отрицательные), другие числами не являются (хотя могут содержать цифры). Найти и вывести наибольшее из этих чисел.
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
545
EJudge: PatternFind 'Поиск простого шаблона в строке'
Ввести строку, содержащую произвольные символы (кроме символа «@»). Затем ввести строку-шаблон, которая может содержать символы @. Проверить, содержится ли в исходной строке подстрока, совпадающая со строкой-шаблоном везде, кроме символов @; на месте @ в исходной строке должен стоять ровно один произвольный символ. Вывести позицию в строке, с которой начинается эта подстрока или -1, если её там нет.
исходной строке подстрока, совпадающая со строкой ст@ок@
9
задачу на обход лабиринта я решил пока не давать и так много. Но почитайте всё-таки
- Почитать
Про хеширование в документации, и далее по ссылкам
требуемые свойства метода .__hash__()
отмена рандомизации хеша с помощью переменной окружения PYTHONHASHSEED
Про множества в учебнике и в документации
Про словари в учебнике и в документации
Разобраться с кодом, имитирующим хеш-таблицы
- Задать вопросы, если что непонятно
EJudge: ThreeSquares 'Три квадрата'
Ввести произвольную последовательность (не обязательно кортеж) натуральных чисел, не превышающих 1000000. Вывести, сколько среди них различных чисел, являющихся суммой трёх квадратов.
Пояснение. Поскольку входная последовательность обрабатывается eval(), она может быть, например, такой: (1+i%10 for i in range(100000)), в этом случае ответ — тоже 3
3, 4, 2, 9, 1, 5, 6, 7, 8, 3, 6
3
ВНИМАНИЕ! В тестах по задаче до 2017-11-09 содержалась ошибка!
EJudge: MostPopular 'Самые популярные'
Ввести строку, состоящую из разделённых пробелами последовательностей маленьких и больших латинских букв. Вывести, сколько различных слов (без учёта регистра) встречается в этой строке чаще всего.
dAh Dit dah dIT dAH Dit GIgly diGLy biglY GiGly bOOm quack OH quack
2
EJudge: DungeonMap 'Карта подземелья'
Вводится карта проходимых в обе стороны тоннелей подземлья в виде строк, содержащих разделённые пробелом названия двух пещер, которые соединяет соответствующий тоннель. Две последние строки не содержат пробелов — это название входа в подземелье и название выхода. Вывести "YES", если из входа можно попасть в выход, и "NO" в противном случае. Пары могут повторяться или содержать одинаковые слова.
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
NO
генратор тестовых даных (вам понадобится google-10000-english.txt)
EJudge: FarGalaxy 'В далёкой галактике'
Ввести построчно четвёрки вида «число число число слово», где первые три числа — это координаты галактики по имени «слово» (некоторые галактики могут называться одинаково, но координаты у всех разные). Последняя строка ввода не содержит пробелов и не учитывается. Вывести в алфавитном порядке имена любых двух наиболее удалённых друг от друга галактик.
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 .
almost erik
генратор тестовых даных (вам понадобится google-10000-english.txt)
Прощёлкать FrBrGeorge/ClassesInPython3
- Прочитать
о модулях в учебнике
о классах в учебнике
EJudge: DummyClass 'Просто класс'
Написать класс Delay, экземпляры которого содержат объект slot (задаётся конструктором) и метод delay(new), который присваивает slot новое значение new, а возвращает предыдущее значение slot.
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("_")))
100500 42 0 delay slot
EJudge: CountInt 'Целые поля'
Ввести (с помощью eval(input())) некоторый объект Python3 и посчитать, склько у него целочисленных полей (включая спецполя, имя которых начинается на "_").`
100500
4
EJudge: SharedBrain 'Единый мозг'
Input: Output:EJudge: NormalDouble 'Простой и двойной'
Написать два класса — Normal и Double, в каждом из которых будет два метода — .swap(other) и .what() (и .__init__(start), задающий начальное значение некоторому полю. Метод .what() класса Normal должен возвращать значение этого поля, а .swap(other) — менять местами значния полей текущего объекта и объекта other. Аналогичные методы класса Double должны все значения умножать на 2: само поле — при инициализации и обмене (у обоих объектов), возвращаемое значение — в методе .what()
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 — представление вещественного числа с двумя знаками после запятой (см. пример)
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))
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-й точкой такой последовательности
- Выход за границы отрезка означает экстраполяцию (см. пример)
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])
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
Во всех случаях изменения числа идентификатор объекта сохраняется. Унарныеоперации не только изменяют объект, но и возвращают его.
|| |||| |||||| ||| | . || .. ||| | . || .. ||| | . || .. ||| True
EJudge: TrianglesCmp 'Сравниваем треугольники'
Написать класс Triangle, моделирующий треугольник
объект T типа Triangle создаётся из трёх вещественных чисел — сторон треугольника
T пуст, если не выполняется строгое неравенство треугольника или хотя бы одна из сторон не положительна
abs(T) — площадь треугольника (0, если T пуст)
сравнение на неравенство двух объектов типа Triangle есть результат сравнения их площадей
два объекта S и T типа Triangle равны, если попарно равны их стороны (в некотором порядке)
строковое представление: a:b:c, где a, b и c — стороны треугольника в порядке их задания
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
- Прочитать
про наследование в учебнике
про дескрипторы в HowTo
EJudge: MegaStroka 'Усиленная строка'
Написать класс Stroka, унаследованииый от str, экземпляр которого s дополнительно поддерживает следующие операции:
объект типа Stroka, содержащий символы s в обратном порядке: -s
объект типа Stroka, содержащий все пары символов из объектов s и t в порядке следования — s*t (t может быть просто строкой)
объект типа Stroka, равный s*s*…(n-1 раз)…*s — s**n (s**0 — пустая Stroka)
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, свойства которых неизвестны, но для которых верен пример.
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)))
/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 'Семафор'
Реализовать с помощью дескрипторов абстракцию «простой семафор», используемую при разделении некроторого ресурса. При обращении к семафору либо происходит захват ресурса (семафор взводится), либо возвращается объект, который этот ресурс захватил. Взведённый семафор может сбросить только объект, который его захватил.
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
Locked: None Locked: <A> Locked: <A> Locked: <A> Locked: <A> Locked: None Locked: <B>
- Прочитать
про C3 в Википедии, на сайте Python
Про super() в статье Раймонда Хеттингера и документации
про исключения в учебнике
EJudge: BoldCalc 'Надёжный калькулятор'
Написать программу — калькулятор с переменными и обработкой ошибок
- Команда, начинающаяся на '#' — комментарий
Команда вида Переменная=выражение задаёт переменную
Команда вида выражение выводит значение выражения.
- Если команда содержит знак "=", но не является присваиванием, выводится диагностика "invalid assignment" (см. пример)
- Если слева от "=" находится не идентификатор, выводится диагностика "invalid identifier (см. пример)"
- В случае любых других ошибок выводится текст ошибки.
«Выражение» — это произвольное выражение Python3, в котором вдобавок можно использовать уже определённые переменные (и только их). Пробелов в командах нет. Пустая команда означает конец вычислений. Калькулятор вводит и исполняет команды по одной, тут же выводя диагностику, но в тестах это выглядит как ввод последовательности строк и вывод последовательности строк.
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())
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
- …