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

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

  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

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

   1 Count = 0
   2 
   3 def incr(level):
   4     global Count
   5     Count += level

Тест:

   1 print(mod.Count)
   2 mod.incr(100)
   3 print(mod.Count)
   4 # Список неспециальных объектов модуля
   5 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; full statement: 'Hello World'

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

    Input:

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

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

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

    Input:

    []
    123
    Output:

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

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

    Input:

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

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

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

    Input:

    1234321
    Output:

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

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

    Input:

    1024
    Output:

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

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

    Ввести восемь чисел через запятую — целочисленные координаты 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; full statement: 'Перетасовать кортеж'

    Ввести последовательность 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; full statement: 'Второй максимум'

    Ввести последовательность 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; full statement: 'Платная лестница'

    (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; full statement: 'Определитель матрицы 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; full statement: 'Сложение и умножение'

    Ввести строку, содержащую выражение ЯП 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; full statement: 'Расстояние от Пи'

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

    • LeibnitzPi.png

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

    Input:

    0.001
    Output:

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

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

    Input:

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

    7

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

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

    Ввести кортеж целых чисел, затем два натуральных числа 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; full statement: 'Прочти это вслух'

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

    Input:

    100500
    Output:

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

    Ввести квадратную целочисленную матрицу построчно и посчитать её определитель (например, методом конденсации Доджсона). Размер матрицы (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; full statement: 'Цифры по спирали'

    Ввести целые 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; full statement: 'Суперпозиция генераторов'

    Ввести последовательность четвёрок целых чисел вида (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; full statement: 'Поиск наибольшего числа в тексте'

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

    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; full statement: 'Поиск простого шаблона в строке'

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

    Input:

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

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

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

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

    Ввести произвольную последовательность (не обязательно кортеж) натуральных чисел, не превышающих 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; full statement: 'Самые популярные'

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

    Input:

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

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

    Вводится карта проходимых в обе стороны тоннелей подземлья в виде строк, содержащих разделённые пробелом названия двух пещер, которые соединяет соответствующий тоннель. Две последние строки не содержат пробелов — это название входа в подземелье и название выхода. Вывести "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; full statement: 'В далёкой галактике'

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

    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; full statement: 'Просто класс'

    Написать класс 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; full statement: 'Целые поля'

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

    Input:

    100500
    Output:

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

    Написать класс 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; full statement: 'Простой и двойной'

    Написать два класса — Normal и Double, в каждом из которых будет два метода — .swap() и .what(other).__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


TODO

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

  • Прочитать:
  • EJudge: SimpleVector; full statement: 'Простой вектор'

    Определить класс 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; full statement: 'Странные отрезки'

    Написать класс 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; full statement: 'Палочная система счисления'

    Написать класс 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; full statement: 'Сравниваем треугольники'

    Написать класс 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

LecturesCMC/PythonIntro2017/HomeworkRules (последним исправлял пользователь FrBrGeorge 2017-11-13 11:12:39)