10.10 Числа и строки
- Числа
функция-умножитель
напишите функцию multiplier(x, y, Type), возвращающую результат умножения x на y
x, y - строки; Type - тип, в соответствии с которым нужно интерпретировать x и y; должны поддерживаться варианты: float, Decimal, Fraction; для последних двух вариантов не забудьте выполнить импорт
Напишите программу, которая запустит функцию для каждого из трех вариантов третьего параметра, причем для Fraction задавайте сокращающиеся после умножения дроби, например: "1/6", "2/3"
- Точность вещественных
контекст в decimal
напишите функцию esum(N, one), вычисляющую число e через сумму ряда: $$ \sum_{n=0}^N\frac{1}{n!} $$
сумма ряда должна считаться с использованием типа float или Decimal, причем тип задается вторым параметром, в виде единицы, типизированной этим типом
для Decimal попробуйте вызывать эту функцию с различной точностью контекста: getcontext().prec = число_знаков (для e это число знаком после запятой -1 ☺)
- Строки
join(), split() и вообще где читать
напишите программу, получающую на вход строку вида "Фамилия Имя Отчество Год Город" (каждое из полей строки не содержит пробелов; разделитель - один или несколько пробелов; корректность ввода гарантируется), и выводящую строку вида "Город, Имя, Фамилия" (разделитель - запятая и один пробел)
Ленивый (ось OX направлена вниз, OY — вправо) график синуса:
- Вводим ширину W и высоту H экрана, A и B
Выводим W×H пробелов или "*" так, чтобы получить график синуса на отрезке [A, B] (включая B )
- В графике минимум H точек (по одной в строке)
- Необходимо масштабирование A…B к 0…H-1, а -1…1 к 0…W-1
Оно вообще часто необходимо, перепишем решение с использованием универсальной функции масштабирования scale(a, b, A, B, x), которая превращает вещественное x из отрезка [a … b] в число из отрезка [A … B] (включая края отрезка).
Метафора «Текстового экрана» — массив массивов односимвольных строк
Задание экрана [['.'] * Width for i in range(Height)]
Вывод с помощью join() - ов
Неленивый график синуса: ось OX направлена вправо, OY — вверх; диапазон по X: от 0 до 7; размер экрана: 60 по X, 20 по Y, при необходимости растяните терминал
Надо хранить массив массивов, и туда записывать * в нужные места
При выводе всего графика построчно join()-ить
Форматные строки и .format()
Описание языка форматирования; {{}}
выведите таблицу соответствия {bin(i)} = {hex(i)}, центрированную относительно "=", i от 12 до 23
- в каждой строке одно соответствие
пример соответствия, без учета центрирования: 0b1100 = 0xc
- FIXME: переделать с центрирования на выравнивание_по_ширине, чтобы не было тривильно
Задачи
Задача_1: Fractions
Заданы два многочлена от х (А(х), В(х)) с рациональными коэффициентами, а также рациональные числа s и w. Проверить, является ли s решением уравнения A(x)/B(x)=w
Структура ввода: s, w, степень_А, коэффициенты_А, степень_В, коэффициенты_В. Числа задаются в виде m или m/n, где m, n - целые, n - положительное.
В программе-решении должна присутствовать функция, способная получать на вход как рациональные, так и вещественные числа, и возвращающая True или False.
- Тестовый пример 1:
уравнение: $$ (x^2 -(5/2)x + 1) / (x+3) = -1/8; s=1 $$; результат проверки: True
Input (1):
1, -1/8, 2, 1, -5/2, 1, 1, 1, 3
Output (1):
True
- Тестовый пример 2:
уравнение то же; s=11/12; результат проверки: False
Output (2):
False
- Тестовый пример_3:
уравнение то же; s=-3; результат проверки: False
Output (3):
False
Задача_2: График функции
Ввести через пробел ширину W и высоту H экрана, A и B, и произвольную всюду на [A, B] определённую python-формулу от x, которая может включать в себя функции из модуля math. Вывести с помощью "*" растровый график этой функции
A, B (A < B), а также минимальное и максимальное значение функции могут оказаться любыми.
График может получиться страшным из-за дискретности, если мы сильно не попали в экстремум. Например, график синуса от -61 до 61 страшный
(Неправда! Он красивый! Только на график синуса не похож… -- FrBrGeorge 2021-10-15 21:08:39)
График должен быть «непрерывным»: в примере ниже есть «столбики» из символов «*». Чтобы этого добиться, надо либо рисовать очень много точек — больше, чем количество столбцов в графике (но в этом случае график может получиться «толстым», начнут встречаться треугольники и квадраты 2×2, целиком заполненные точками), либо рисовать «отрезки» между точками в соседних столбцах.
- В идеале график должен занимать все строки и столбцы «экрана»
Input (1):
40 20 -6 6 sin(x)
Output (1):
** ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** **
Input (2):
20 24 5 50 (x-13)**2+x+1
Output (2):
* * * * * * * * * * * * * * * * * * * * * * * ** *****
К этой задаче тесты делать нужно, но результаты перекрёстного тестирования учитываться на будут, потому что способы округления и соблюдения непрерывности у всех могут оказаться разными
Задача_3: Форматирование
- Вводится ASCII-art, представляющий прямоугольный контейнер, заполненный жидкостью и/или газом ("#" — стенки, "." — газ, "~" — жидкость)
- Контейнер следует повернуть на 90° и вывести (жидкость и газ перераспределятся):
- На входе слои жидкости заполнены целиком, от края до края. Неполный слой жидкости на выходе дополняется до полного. Например, если в контейнер-ответ налить ещё три капли и повернуть обратно, он окажется полным)
- Также следует вывести горизонтальную диаграмму долей объёма, занимаемых газом и жидкостью:
- строка для газа состоит из символов '.', для жидкости — из символов '~'
- ширина диаграммы (т.е. длина её наибольшей строки) фиксирована и равна 20 символам
справа от каждой строки выводится в виде x/y исходная доля объёма соответствующей субстанции от объёма контейнера, сокращать дроби не нужно
- дроби должны быть выравнены так, чтобы
- самые правые их символы располагались в одной и той же позиции,
- расстояние между самой длинной строкой и дробью — один пробел
при расчёте числа символов в строке, для округления использовать функцию round()
Input:
######## #......# #~~~~~~# #~~~~~~# ########
Output:
##### #...# #...# #~~~# #~~~# #~~~# #~~~# ##### .......... 6/18 ~~~~~~~~~~~~~~~~~~~~ 12/18