Домашние задания

  • Настроить какой-нибудь IDE (например, Geany), добиться работоспособности

  • Прочитать и прощёлкать

Задачи и упражнения:

  1. (domari:SecondMax) Найти второй максимум

    Ввести список и вывести второй максимум этого списка, т. е. элемент a∈S : ∃ b∈S : b>a и a⩾c ∀c∈S, c≠b. Если второго максимума нет, вывести NO.

    Input:

    3,4,5,6,7
    Output:

    6
  2. (domari:Else) Точки в круге

    В первой строке ввести координаты центра круга и его радиус (три числа через запятую). Во второй строке ввести координаты точек (чётное количество чисел через запятую). Вывести YES, если все точки принадлежат кругу и NO, если не все.

    Input:

    0,0,10
    1,2,3,4,5,6,5,4,3,2
    Output:

    YES
  3. (domari: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
  4. (domari: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)
  5. (domari:Labyrinth) Обход лабиринта

    Ввести заданный построчно лабиринт размером N×N. Каждая из N строк ввода содержит N символов: «.» — проходимый участок и «#» — непроходимый. Левый верхний и правый нижний участки лабиринта проходимы. С одного проходимого участка можно попасть на соседний либо по вертикали, либо по горизонтали. Проверить, можно ли попасть из левого верхнего участка в правый нижний, и вывести YES, если можно, и NO, если нельзя.

    Input:

    ...........
    .#.###.###.
    .#...#...#.
    .#.#####.#.
    .#.....#.#.
    ##.###.###.
    .....#.#.#.
    .#.###.#.##
    .#...#.#...
    ##.#.###.##
    ...#.......
    Output:

    YES

Прочитать:

Задачи и упражнения:

  • Все примеры попробовать не только на заданном В/В, но и на самостоятльно сгенерированном (если получится, написать генератор входных данных)
  • Рекурсия:

    (domari:ReqSum) Сумма подпоследовательности

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

    Input:

    21
    1,2,3,4,5,6,7
    Output:

    YES
  • Передача функции в качестве параметра:

    (domari:DiffLet) Количество разных символов

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

    Input:

        sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list
    Output:

    --> new list sorted key=None, cmp=None, reverse=False) sorted(iterable,
  • Словарь:

    (domari:PopularWord) Самое популярное слово

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

    Input:

    Sed tempus ipsum quis eros tempus lacinia Cras finibus lorem ut lacinia egestas nunc nibh iaculis est convallis tincidunt mi mi sed nisl Sed porttitor aliquam elit ullamcorper tincidunt arcu euismod quis Mauris congue elit suscipit leo varius facilisis Cras et arcu sodales laoreet est vitae pharetra orci Integer eget nulla dictum aliquet justo semper molestie neque Maecenas bibendum lacus tincidunt auctor varius purus felis ullamcorper dui et laoreet ligula ex et risus Donec eget fringilla nibh Cras congue tincidunt accumsan Maecenas euismod eleifend elit ut rhoncus tortor sodales a Cras egestas finibus lorem non tempor tincidunt aera
    Output:

    tincidunt
  • Строки и random:

    (domari:EasySentence) Произносимое предложение

    Сгенерпровать предложение, состоящее из не более, чем 12 случайных хорошо произносимых сочетаний букв. Сочетание букв длины не больше 12 называется «хорошо произносимым», если в нём встречается не более двух гласных и не более трёх согласных подряд. Первое слово предложения наинается с большой буквы, в конце стоит случайный знак препинания. Вввод не используется, вывод даётся примерный.

    Input:

    <ВВОД НЕ ИСПОЛЬЗУЕТСЯ>
    Output:

    <ЭТО ПРИМЕР ВЫВОДА>
    Пе вожи ичумкяп леобсил ботрумч сбкясотно шфтулзоём аирба уотэлмя?
  • Форматирование строки:

    (domari:MultTable) Таблица умножения на N

    Ввести через запятую M и N и вывести таблицу умножения от M×1 до M×N в столбик, где K-я строчка имеет вид __P_=__K_*_M. Между элементами стоят символы подчёркивания, причём перед P может быть ноль или больше подчёркиваний, а перед K — одно или больше, в остальных случаях подчёркивание одно. В результате символы = и * должны стоять друг под другом.

    Input:

    7,11
    Output:

    _7_=__1_*_7
    14_=__2_*_7
    21_=__3_*_7
    28_=__4_*_7
    35_=__5_*_7
    42_=__6_*_7
    49_=__7_*_7
    56_=__8_*_7
    63_=__9_*_7
    70_=_10_*_7
    77_=_11_*_7
  • Использование eval()

    (domari:GenMinMax) Найти минимум и максимум произвольной функции на целочисленном отрезке

    Ввести строку — произвольное выражение Python, в котором могут дополнительно встречаться функции из модуля math и переменная x. На следующей строке ввести через запятую целые числа A и B (выражение должно быть определено как минимум на A или на B). Вывести через пробел минимальное и максимальное значение выражения на всех допустимых целых x, принадлежащих отрезку [A,B]. Точностью вычислений не управлять.

    Input:

    (x**5+1)/(factorial(x)-720)
    -10,10
    Output:

    -6 3
  • <!>

    (domari:PaidStairs) Классическая задача динамического программирования «Платная лестница»

    Наступить на k-ю ступень лестницы A стоит Ak монет. Ввести через запятую «цены» ступеней A, и на следующей строке — ширину шага S (все числа натуральные) и вывести минимальную стоимость пути с земли до последней ступени (на которую наступать обязательно), при условии, что идти можно только вверх и перешагивать можно не более, чем через S-1 ступень.

    Input:

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

    14

Прочитать

Задачи и упражнения

  • (SimpleVector) Вектора на плоскости

    Реализовать класс Vector, позволяющий

    • задавать двумерный вектор (из двух чисел)
    • вычислять вектор — сумму двух векторов
    • вычислять вектор — результат умножения вектора на число (или числа на вектор)
    • скалярно умножать вектор на вектор
    • преобразовывать вектор в строку вида |x,y|

    Input:

       1 A = mod.Vector(1,2)
       2 B = mod.Vector(3,4)
       3 print A
       4 print A+B
       5 print A*B
       6 print 7*A
    
    Output:

    |1,2|
    |4,6|
    11
    |7,14|
  • (FakeField) Гласные поля

    Реализовать класс Vovel, у объекта которого можно получить значение любого поля, если имя этого поля состоит только из маленьких гласных латинских букв. Значение это — строка, совпадающая с именем поля, только состоящая из больших латинских букв. В противном случае поведение объекта должно быть естественным (вызывть исключение AttributeError, как минимум с тем же сообщением, что и «естественный» AttributeError в случае несуществующего поля). Реализовывать что-то, кроме получения значения поля, не надо.

    Input:

       1 A = Vovel()
       2 print A.aoao
       3 try:
       4   print A.field
       5 except AttributeError, msg:
       6   print "ERROR",msg
    
    Output:

    AOAO
    ERROR Vovel instance has no attribute 'field'
  • (domari:SelfishTuple) Выворачиваемый кортеж

    Определить класс MTuple, проксирующий тип tuple, с добавлением в него единственной операции — унарного минуса (операция возвращает MTuple с элементами в обратном порядке). Прочие операции также должны возвращать MTuple вместо tuple.

    Input:

       1 c=MTuple(range(10))
       2 print -(-c[2:6]+c[-1:2:-2])
       3 print -c[7:9]+("Bdyshch","Bdyshch")
       4 print {-c[3:5]:"QQ"}
    
    Output:

    (3, 5, 7, 9, 2, 3, 4, 5)
    (8, 7, 'Bdyshch', 'Bdyshch')
    {(4, 3): 'QQ'}
  • (domari:ArgsChecker) Проверка параметров функции

    Написать декоратор chkargs(тип1, тип2, …, типN), проверяющий, что у функции N параметров, и что они, соответственно, типа тип1, тип2, … , типN. В противном случае бросать исключение TypeError.

    Input:

       1 @chkargs(int,str)
       2 def fun(*args):
       3     return args[0]*args[1]
       4 
       5 print fun(5,"Qq")
       6 try:
       7     print fun(2,3)
       8 except TypeError as ex:
       9     print ex
      10 try:
      11     print fun(5,"Qq",6)
      12 except TypeError as ex:
      13     print ex
    
    Output:

    QqQqQqQqQq
    Parameter 1 of fun should be <type 'str'> (<type 'int'> given)
    fun takes exactly 2 arguments (3 given)

Прочитать

Задачи и упражнения

Lectures/PythonIntro/Homework (последним исправлял пользователь FrBrGeorge 2015-03-20 23:54:26)