Домашнее задание № 1

Для выполнения задания найди ссылку-приглашение в онлайн чате, получи доступ к репозиторию с файлом-заготовкой и заполни пропуски в нём. Фиксируй изменения (делай коммиты) после решения каждой задачи. Оставь название файла неизменным, иначе робот-проверятель не найдёт твои ответы. Отправить решения на GitHub нужно до истечения установленного срока.

После завершения работы над каждым вопросом требуется фиксировать изменения (делать коммит), сопровождая его вменяемым описанием сделанного, например:

$ git add .
$ git commit -m "Решение вопроса X"

Также не возбраняется в любое время проталкивать изменения на GitHub:

$ git push

Вопрос 1

Используя возможность присваивания существующим функциям новых имен, заполни пробелы в определении приведенной функции для сложения a с абсолютным значением b. Вызывать abs запрещено.

from operator import add, sub
def a_plus_abs_b(a, b):
    """Возвращает a+abs(b), но не использует abs.

    >>> a_plus_abs_b(2, 3)
    5
    >>> a_plus_abs_b(2, -3)
    5
    """
    if b < 0:
        op = _____
    else:
        op = _____
    return op(a, b)

Вопрос 2

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

def two_of_three(a, b, c):
    """Возвращает x*x + y*y, где x и y — два наибольших значения среди a, b, c.

    >>> two_of_three(1, 2, 3)
    13
    >>> two_of_three(5, 3, 1)
    34
    >>> two_of_three(10, 2, 8)
    164
    >>> two_of_three(5, 5, 5)
    50
    """
    return _____

Попробуй использовать функции min и max.

>>> max(1, 2, 3)
3
>>> min(-1, -2, -3)
-3

Вопрос 3

Вот функция, которая делает то же самое, что и инструкция if:

def if_function(condition, true_result, false_result):
    """Возвращает true_result, если условие condition истинно и false_result в противном случае.

    >>> if_function(True, 2, 3)
    2
    >>> if_function(False, 2, 3)
    3
    >>> if_function(3==2, 3+2, 3-2)
    1
    >>> if_function(3>2, 3+2, 3-2)
    5
    """
    if condition:
        return true_result
    else:
        return false_result

В действительности эта функция не во всех случаях идентична инструкции if. Для доказательства этого факта напиши функции c, t и f так, что with_if_statement напечатает число 2, а with_if_function напечатает и 2, и 1.

def with_if_statement():
    """
    >>> result = with_if_statement()
    2
    >>> print(result)
    None
    """
    if c():
        return t()
    else:
        return f()

def with_if_function():
    """
    >>> result = with_if_function()
    1
    2
    >>> print(result)
    None
    """
    return if_function(c(), t(), f())

def c():
    "*** ТВОЙ КОД ЗДЕСЬ ***"

def t():
    "*** ТВОЙ КОД ЗДЕСЬ ***"

def f():
    "*** ТВОЙ КОД ЗДЕСЬ ***"

Если никак не удается понять, в чём разница между инструкцией if и функцией if_function, припомни, как в точности выполняется инструкция if и как обрабатывается вызывающее выражение.

Вопрос 4

Одна из нерешенных проблем математики — гипотеза Коллатца — касается последовательности чисел, называемой сиракузской, или последовательностью чисел-градин.

  1. Выберем любое положительное число n.

  2. Если n четное, тогда делим его на 2.

  3. Если n нечетное, тогда умножаем его на 3 и прибавляем 1.

  4. Продолжаем те же действия с n, пока не получим 1.

Гипотеза Коллатца заключается в том, что какое бы начальное число n мы ни взяли, рано или поздно мы получим 1. Число n будет то увеличиваться, то уменьшаться, но в результате все равно n станет равным 1 (по крайней мере для всех проверенных чисел — строгих доказательств этого не существует).

Последовательность чисел n иногда называют последовательностью чисел-градин, поскольку градины тоже перемещаются в атмосфере вверх и вниз, пока в конце концов не упадут на землю.

def hailstone(n):
    """Выводит сиракузскую последовательность (числа-градины), начинающуюся с n, и возвращает её длину.

    >>> a = hailstone(10)  # Семь элементов: 10, 5, 16, 8, 4, 2, 1
    10
    5
    16
    8
    4
    2
    1
    >>> a
    7
    """
    "*** ТВОЙ КОД ЗДЕСЬ ***"

Проверь, что рассмотренная последовательность может быть очень длинной, например при старте с 27. Попробуй отыскать вариант ещё длиннее.

Вопрос 5* (для самых умных)

Напиши однострочную программу, которая выводит в консоль саму себя. Можно использовать следующие возможности Python:

  • числа;

  • инструкции присвоения;

  • строки в одинарных и двойных кавычках;

  • арифметические операторы +, -, * и /;

  • встроенную функцию print;

  • встроенную функцию eval, которая вычисляет значение представленного строкой выражения;

  • встроенную функцию repr, которая возвращает строковое выражение аргумента.

Ты можешь соединить две строки с помощью +, можешь повторить строку много раз, домножив её на число. Точки с запятой ; могут использоваться для разделения нескольких инструкций в одной строке, например:

>>> c='c';print('a');print('b' + c * 2)
a
bcc
Разберись во взаимосвязи одиночных и двойных кавычек, а также в результатах вызова repr со строковым аргументом.

Размести решение в файле hw_01.py, в строке challenge_question_program.

Не забудь отправить работу на проверку:

$ git add .
$ git commit -m "Окончательное решение"
$ git push