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

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

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

    • По этой же ссылке заполнить графу «Имя» (там должны быть имя и группа, кому оценку ставить)
    • <!> ВНИМАНИЕ! Зарегистрированные пользователи заходят тут

  2. Выбрать 165-й «турнир» (UNИX GeoPython 2021)

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

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

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

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

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

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

Задача типа «написать функцию»

Алгоритм сдачи такого задания:

Пример решения задачи «написать функцию»

Написать функцию gt12(), которая принимает два заведомо сравнимых параметра и возвращает 1, если первый параметр больше второго, и 2 в противном случае:

Пример решения задачи «написать класс»

Написать класс C, который ничего не делает:

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

Пример задачи: Написать модуль, в котором будет присутствовать целочисленный объект 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

  • Запустить python в режиме командной строки, убедиться, что работает
  • Написать в текстовом редакторе простейший сценарий, запустить его
  • Попробовать запустить программу с помощью команды python3 имя_файла.py из командной строки

  1. Регистрация на EJudge

  2. EJudge: HelloWorld 'Hello World!'

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

    Input:

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

    Hello, world
  3. EJudge: ThreeSum 'Сумма трёх чисел'

    Ввести три вещественных числа по одному в строке. Вывести их сумму.

    Input:

    1
    2.2
    3.7e-3
    Output:

    3.2037
  4. EJudge: CalcDiscr 'Дискриминант'

    Ввести a, b, c и x, по одному вещественному числу в строке, и вывести дискриминант $$ax^2+bx+c$$

    Input:

    1
    2.2
    3
    4
    Output:

    27.8
  5. EJudge: CalcTrigonometry 'Вычислить формулу'

    Ввести x, вычислить формулу и вывести результат:

    • $$ x ln x-1/(12x^2+17 sin x+5) $$

    Input:

    1.234
    Output:

    0.23402832649377744
  6. EJudge: AthomizeFormula 'Раскрыть скобки'

    Ввести переменную x, вычислить формулу, и вывести результат.

    • Обязательное условие: на каждую операцию связывания ("=") должно приходиться не более одной арифметической операции или один вызов функции (см пример в лекиии)

    • $$ |x^2-x^3|-(7x)/(x^3-15x) $$

    Input:

    -1.23
    Output:

    3.8927814656746076

Все задачи можно решить без применения алгебры логики (т. е. без or, and и not), одними только сравнениями. Но если вы умеете в неё, то пожалуйста!

А вот составными типами данных Python, равно как и функциями min() и max(), пользоваться нельзя (хотя они и есть), потому что это упражнения на условные операторы.

Посмотрите полные варианты условий задач (по ссылкам с названиями задач). Там могут быть подсказки и советы, а в особо трудных случаях — спойлеры с алгоритмом.

  1. Прощёлкать
  2. EJudge: TriangleCheck 'Неравенство треугольника'

    Ввести в столбик три положительных вещественных числа (проверять правильность не надо), и вывести YES, если из отрезков указанной длины можно сложить треугольник, и NO в противном случае

    Input:

    3
    4
    5
    Output:

    YES
  3. EJudge: SquareEquation 'Квадратное уравнение'

    Ввести в столбик три вещественных числа: a, b и c, вывести все вещественные решения уравнения $$ax^2+bx+c=0$$. При $$a\ne 0$$ это уравнение превращается в квадратное. Решения выводить через пробел в порядке возрастания, если решений нет, вывести 0, если их бесконечно много — -1.

    Input:

    1
    -3
    2
    Output:

    1.0 2.0
  4. EJudge: ConfFormula 'Минимумы и максимумы'

    Ввести в столбик три вещественных числа x, y и z. Вычислить формулу:

    • $$ (max^2(x,y,z) - 2^xmin(x,y,z)) / (sin2x + max(x,y,z)//min(x,y,z)) $$

    Проверить возможное деление на 0 и вместо ответа вывести 0, если оно предвидится. В противном случае вывести результат вычислений. Последовательностями python и функциями min() и max() пользоваться нельзя!

    Input:

    2
    3
    4
    Output:

    6.435019351154122
    • <!> Необязательное упражнение:

      • Функцией min() нельзя пользоваться, но с помощью тернарной операции и операции «:=» выбор минимального из трёх чисел записать несложно. Попробуйте!

  5. EJudge: CorrectDate 'Правильная дата'

    Ввести в столбик три целых заведомо положительных числа — номер года, номер месяца и номер дня в месяце. Проверить, есть ли такой день в месяце, и если да, выдать "YES", а если нет — "NO". Считать високосными все кратные 4 номера годов.

    Input:

    2019
    2
    29
    Output:

    NO
  1. Прощёлкать:
    • Главу в учебнике «Think Python»

    • Занятие в Pythontutor

    • Работу функции print(). Чем отличается

      1.    1    print(a, "#", b)
           2    print(a, "ЫЫЫ", b)
        
      2. от

           1    print(a, "#", b, sep="!")
           2    print(a, "ЫЫЫ", c, sep="---")
        
      3. и от

           1    print(a, "#", b, end="...")
           2    print(a, "ЫЫЫ", b)
        
  2. EJudge: ManualLogarithm 'Логарифм'

    Ввести положительное вещественное число Y: $$ 1/100 <= Y <= 1000 $$. Известно, что $$ 10^x=Y $$. Вычислить $$ x $$ с точностью $$ +-10^-7 $$, не используя модуль math и/или иные функции, вычисляющие логарифм. Ответом является любое число, которое отличается от правильного значения не больше, чем на $$ 10^-7 $$. Пользоваться операцией возведения в степень можно.

    Input:

    234.567
    Output:

    2.37026698989898
  3. EJudge: SquareIntersect 'Площадь пересечения'

    В столбик вводятся 2×N целых не равных нулю чисел — координаты левых верхних вершин квадратов размером 1000×1000 (N>0). Последовательность заканчивается двумя нулями. Вывести площадь пересечения всех этих квадратов — области, которая входит в каждый из них. Оси координат направлены вправо и вниз — это стандартная практика для компьютерных изображений.

    Input:

    -10
    10
    100
    100
    -300
    -200
    0
    0
    Output:

    420000
  4. EJudge: MinSin 'Наименьший синус'

    Ввести в столбик 2*N целых чисел, не равных нулю. Назовём меньшее число в очередной введённой паре A, а большее — B. Для чисел A, A+1, …, B-1, B выбирается такое, значение синуса на котором минимально. Вывести N таких чисел. A может быть больше, меньше или равно B (в последнем случае в наборе всего одно это число). Ввод заканчивается двумя нулями.

    Input:

    1
    10
    25
    9
    -200
    300
    1000
    -25
    0
    0
    Output:

    5
    11
    11
    344
  5. EJudge: MultTable 'Таблица умножения'

    Ввести два натуральных числа, M и N. Вывести таблицу умножения от 1×1 до M*N в приведённом ниже формате (по колонкам, но без учёта количества разрядов в числе).

    Input:

    4
    5
    Output:

    1 * 1 = 1; 2 * 1 = 2; 3 * 1 = 3; 4 * 1 = 4; 5 * 1 = 5
    1 * 2 = 2; 2 * 2 = 4; 3 * 2 = 6; 4 * 2 = 8; 5 * 2 = 10
    1 * 3 = 3; 2 * 3 = 6; 3 * 3 = 9; 4 * 3 = 12; 5 * 3 = 15
    1 * 4 = 4; 2 * 4 = 8; 3 * 4 = 12; 4 * 4 = 16; 5 * 4 = 20

Документация по строкам:

Задания

  1. Прощёлкать:
  2. EJudge: Vovels 'Гласные'

    Ввести строку и посчитать, сколько в ней содержится английских гласных букв («y» считается гласной!).

    Input:

    The Quick Brown Fox Jumps Over The Lazy Dog
    Output:

    12
  3. EJudge: Braces 'Скобки'

    Вводится арифметическое выражение, содержащее круглые скобки (в действительности вводится что угодно, содержащее круглые скобки, но это неважно ☺). Проверить, правильно ли с точки зрения арифметики расставлены эти скобки. Скобки считаются расставленными правильно, если после каждой открывающей скобки можно найти однозначно соответствующую ей закрывающую. Больше ничего проверять не надо. Вывести "YES", если скобки расставлены правильно, и "NO" в противном случае.

    Input:

    12+(13/14+((15/16))-17*18+(19/20))
    Output:

    YES
  4. EJudge: Caesar 'Шифр Цезаря'

    Вводится строка — предложение, написанное латинскими буквами (большими и маленькими). Предложение зашифровано шифром цезаря. Известно, что исходное сообщение обязательно заканчивается словами «Ave Caesar!». Строчные буквы в сообщении заменяются на строчные, прописные — на прописные. Используется стандартный английский алфавит. Расшифровать и вывести это сообщение.

    Input:

    Ej pda bwya kb wixecqepu, nabqoa pda pailpwpekj pk cqaoo. Wra Ywaown!
    Output:

    In the face of ambiguity, refuse the temptation to guess. Ave Caesar!
  5. EJudge: Theodor 'Шифр Фёдора'

    Робот Фёдор посылает с космической станции зашифрованные сообщения, в которых читать надо каждую N-ю букву. Ввести две строки — зашифрованное сообщение (с лишними буквами), и слово, которое заведомо присутствует где-то в исходном сообщении. Вывести самую длинную из подходящих расшифровок. Если слово не встречается в шифровке, вывести "<NO>".

    Input:

    Vikingsed xeric sortrsebony capel  teakungetUginesheemolleeq criteriumoud
    antisel
    Output:

    inexistence antiselectio

Внимание! Часть домашнего задания надо оформлять как функцию. Просьба внимательно прочитать правила и спрашивать, если что не так.

  1. Прочитать и прощёлкать:
  2. EJudge: DummyFunction 'Примитивная функция'

    Это примитивная задача типа «написать функцию». Она нужна для того, чтобы освоить такой тип задач. Написать функцию divides(a, b), которая для целых a и b возвращает целый результат деления a на b, если a делится на b, или же деления b на a, если b делится на a, или 0 в противном случае. На 0, понятно, ничего не делится.

    Input:

    print(divides(1000,10), divides(64, 32768), divides(1024, 12345))
    Output:

    100 512 0
  3. EJudge: ArsakSequence 'Конечная последовательность'

    (Ж. Арсак) Написать функцию seq(n), которая последовательно вычисляет значения последовательности $$ {P_i} $$ для натурального n по формуле ниже, до тех пор, пока очередной член этой последовательности не станет равен 1, и возвращает наибольший элемент такой последовательности. Формула:

    1. $$ P_0=n $$

    2. $$ P_(i+1)=P_i/2 $$, если $$ P_i $$ чётно

    3. $$ P_(i+1)=3P_i+1 $$, если $$ P_i $$ нечётно

    Input:

    print(seq(27), seq(1), seq(16), seq(101))
    Output:

    9232 1 16 304
  4. EJudge: LongRepeat 'Блаблабла'

    Написать функцию blah(S, P), которая проверяет, встречается ли в строке S шаблон P, и возвращает наибольшую длину подстроки, образованной повторением шаблона P, которая встречается в S. Если шаблон встречается в строке, но без повторений, возвращается 1, а если и шаблона нет — 0.

    Input:

    print(blah("Hey blah, blahblahblah, more than blahblah, blah-blah!", "blah"))
    Output:

    12
  5. EJudge: TkinterSum 'Сумматор'

    Пользуясь статьёй про Tkinter, написать простейшее приложение (программу), в котором будет два поля ввода A1 и A2 типа tkinter.Entry, одно текстовое поле L типа tkinter.Label и одна кнопка B типа tkinter.Button. При нажатии кнопки в текстовом поле должна появляться сумма чисел, находящихся в полях ввода. Если хотя бы одна из строк в полях ввода не является числом, содержимое L не меняется. С самого начала поля ввода пусты, а в L записана строка "0". Условие: функция, которая считывает значения из A, проверяет их правильность и записывает результат в L, должна быть зарегистрирована при создании кнопки B как её свойство command. Внимание!. Программа должна использовать оператор import tkinter, как в примере из лекции, (а не from tkinter import *, как в статье).

    Input:

    23 и 456 в полях ввода A1 и A2
    Output:

    479 в поле вывода L
    • Обратите также внимание на то, что тестированием такой программы (она ничего не вводит со стандартного ввода и ничего не выводит на стандартный вывод) занимается специальный робот. Робот тупой — мы с вами куда хитрее, так что если тесты не проходят, сигнальте мне: возможно, вы просто его перехитрили
    • Выглядеть должно примерно так: TkinterSum.mp4

  1. Прочитать и прощёлкать:
  2. EJudge: PosCount 'Подсчёт Положительных'

    Вводятся построчно последовательности чисел через запятую. Если в строке нет запятых — это конец ввода, она не учитывается. Вывести общее количество положительных чисел.

    Input:

    1, 3, -3, 0, 234, 657
    -2, -4356, -345, 0, -11, -2134123412341234, 0, 0
    777, 2
    how boring!
    Output:

    6
  3. EJudge: NumSearch 'Поиск Числа'

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

    Input:

    123, 2, 777, -8, 2, 100500
    1w21e23qr123rwe34rt5t5
    это кот на клавиатуру 8 раз сел и 22 клавиши нажал!
    777777 7777
    12-8=-123, ой, ошибся…
    .
    Output:

    123: 2
    2: 7
    777: 3
    -8: 1
    2: 7
    100500: 0
  4. EJudge: ThirdsOut 'Третий Лишний'

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

    Input:

    print(squeeze([1, 5, 4, 3, 7, 6, 14, 8, 2]))
    Output:

    [1, 4, 3, 7, 6, 8, 2]
  5. EJudge: BinSearch 'Двоичный поиск'

    Написать функцию, binsearch(x, A), реализующую двоичный поиск элемента x по индексируемой последовательности (списку, кортежу или даже range) A. Гарантировано, что последовательность упорядочена по возрастанию. Функция возвращает True, если $$ x \in A $$ и False в противном случае.

    Input:

    print(binsearch(123, sorted([123, 12, 45, 67, 23, 678, 12345, 4, 23, 768])))
    Output:

    True

TODO

  1. EJudge: PaidStairs 'Платная лестница'

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

    • Пояснения и алгоритм — в полном тексте задачи
    Input:

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

    5
  2. EJudge: Cross 'Крестик'

    Написать функцию cross(width, paper, ink), которая на вход принимает три параметра — натуральное число width⩾2 и две строки единичной длины, paper, и ink. Возвращать эта функция должна строковый объект, при выводе на экран которого получается приведенная ниже фигура. Это квадрат шириной width, стороны и диагонали которого состоят из строки ink, а остальное пространство заполнено строкой paper.

    • Пояснения и алгоритм — в полном тексте задачи
    Input:

       1 print(cross(11, ".", "*"))
    
    Output:

    ***********
    **.......**
    *.*.....*.*
    *..*...*..*
    *...*.*...*
    *....*....*
    *...*.*...*
    *..*...*..*
    *.*.....*.*
    **.......**
    ***********
  1. Прочитать и прощёлкать занятие про двумерные массивы на pythontutor.ru

TODO EJudge

  1. EJudge: BackBack 'Всё наоборот'

    Ввести строку, содержащую пары натуральных чисел. Числа в парах разделены двоеточием. Строка начинается и заканчивается на некоторый один и тот же символ (не цифра, но в разных случаях он может быть разным), и этот же символ стоит между парами. Вывести эти числа в обратном порядке через пробел.

    Input:

    -12:3-4:56-7:8-9:10-
    Output:

    10 9 8 7 56 4 3 12
  2. EJudge: Matrix 'Матрица'

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

    Input:

    12 34 56 78 90
    23 45 67 89  2
    23 65 90 12 45
    13  4 35 46 57
    80 79 68 57 46
    Output:

    2
  3. EJudge: Screen 'Экран'

    Написать четыре функции:

    1. screen(width, height, space), которая создаёт «текстовый экран» размером width×height, при этом «пустыми местами» в нём служат символы space. Функция возвращает только что созданный экран.

    2. show(screen), которая выводит экран screen в виде прямоугольника

    3. hline(screen, x0, x1, y, ink), которая заменяет в строке y экрана screen символы на позиции с x0 по x1-1 на строку ink, т. е. «рисует горизонтальную линию»

    4. vline(screen, x, y0, y1, ink), которая заменяет в столбце x экрана screen символы на позиции с y0 по y1-1 на строку ink, т. е. «рисует вертикальную линию»

    Реализация «экрана» — произвольная. Координаты всегда упорядочены, т. е. x0 ⩽ x1 и y0⩽y1, и не выходят за границы экрана.

    S = screen(15, 7, '.')
    vline(S, 3, 2, 6, '|')
    hline(S, 2, 13, 3, '-')
    show(S)
    Input:

    S = screen(15, 7, '.')
    vline(S, 3, 2, 6, '|')
    hline(S, 2, 13, 3, '-')
    show(S)
    Output:

    ...............
    ...............
    ...|...........
    ..-----------..
    ...|...........
    ...|...........
    ...............

Напоминаю, что для вывода последовательности через пробел можно воспользоваться конструкцией print(*последовательность) — для начала попробуйте сами в командной строке, если ещё не.

  1. Прочитать и прощёлкать про множества и словари
  2. EJudge: MostPopular 'Самые популярные'

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

    Input:

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

    2
  3. EJudge: PairCounter 'Количество пар'

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

    Input:

    аwба%Ба б7
    Output:

    3
  4. EJudge: PublicFriend 'Знаком со всеми'

    Вводятся в столбик пары натуральных чисел через запятую. Каждая пара M, N обозначает взаимное знакомство людей под номерами M и N. Ввод заканчивается парой 0, 0 (не учитывается, и вообще человек N считается незнакомым с человеком N ;) ). Вывести через пробел в порядке возрастания номера тех, кто знаком со всеми остальными, или пустую строку, если таких нет.

    Input:

    7, 9
    1, 7
    9, 2
    9, 2
    9, 7
    2, 9
    9, 2
    2, 9
    7, 1
    9, 2
    9, 2
    2, 1
    7, 2
    7, 9
    7, 1
    7, 1
    0, 0
    Output:

    2 7
  5. 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

TODO

Python/GeoPython2021/HomeworkRules (last edited 2021-10-16 21:14:35 by FrBrGeorge)