Матрицы. Задачи
Задача 1. Конструктор, \_\_str\_\_
Реализуйте класс Matrix. Он должен содержать:
- Конструктор от списка списков. Гарантируется, что списки состоят из чисел, не пусты и все имеют одинаковый размер. Конструктор должен копировать содержимое списка списков, т.е. при изменении списков, от которых была сконструирована матрица, содержимое матрицы изменяться не должно.
- Метод \_\_str\_\_ переводящий матрицу в строку. При этом элементы внутри одной строки должны быть разделены знаками табуляции, а строки — переносами строк. При этом после каждой строки не должно быть символа табуляции и в конце не должно быть переноса строки.
- Метод size без аргументов, возвращающий кортеж вида (число строк, число столбцов)
Тест 1
Входные данные:
# Task 1 check 1
m = Matrix([[1, 0], [0, 1]])
print(m)
m = Matrix([[2, 0, 0], [0, 1, 10000]])
print(m)
m = Matrix([[-10, 20, 50, 2443], [-5235, 12, 4324, 4234]])
print(m)
Вывод программы:
1 0
0 1
2 0 0
0 1 10000
-10 20 50 2443
-5235 12 4324 4234
Тест 2
Входные данные:
# Task 1 check 2
m1 = Matrix([[1, 0, 0], [1, 1, 1], [0, 0, 0]])
m2 = Matrix([[1, 0, 0], [1, 1, 1], [0, 0, 0]])
print(str(m1) == str(m2))
Вывод программы:
True
Тест 3
Входные данные:
# Task 1 check 3
m = Matrix([[1, 1, 1], [0, 100, 10]])
print(str(m) == '1\t1\t1\n0\t100\t10')
Вывод программы:
True
Задача 2. Перегрузка операций
Добавьте в предыдущий класс следующие методы:
- \_\_add\_\_ принимающий вторую матрицу того же размера и возвращающий сумму матриц
- \_\_mul\_\_ принимающий число типа int или float и возвращающий матрицу, умноженную на скаляр
- \_\_rmul\_\_ делающий то же самое, что и \_\_mul\_\_. Этот метод будет вызван в том случае, аргументнаходится справа. Можно написать \_\_rmul__ = \_\_mul\_\_
Например:
- В этом случае вызовется \_\_mul\_\_: Matrix([[0, 1], [1, 0]) * 10
- В этом случае вызовется \_\_rmul\_\_ (так как у int не определен mul для матрицы справа): 10 * Matrix([[0, 1], [1, 0])
Разумеется, данные методы не должны менять содержимое матрицы.
Проект "игра UNO"
Task | Developer |
Подсчитать счет в конце игры по всем игрокам и вывести его. | |
Вводить не номер выбранной карты, а ее написание в вашей руке. | |
Требовать писать UNO если после сыгранной карты на руке остается 1 карта. Если игрок забыл это сделать, начислять пенальти. Автоматические игроки должны делать UNO всегда | |
Показывать руку игроку отсортированной по цветам (RGBY), и цифре на карте, потом идут специальные, потом черные. | |
? Когда банкующая колода заканчивается, замешать в нее (перемешать!) колоду отбоя (кроме верхней карты). | |
?? Локализация | |
Тестирование: запускать состояние игры, прочитав его из файла (json). При этом ввести моду TEST, которая позволит обходить требование, что в руках строго 7 карт и нет отбоя. | |
Тестирование: recorder, который пишет лог игры для последующего проигрывания его плеером | |
Тестирование: player, который шаг за шагом проигрывает лог, записанный recorder. | |
| |
Поля класса
Методы класса
Перегрузка операторов
https://docs.python.org/3/reference/datamodel.html
Operator |
Function |
Method Description |
+ |
__add__(self, other) |
Addition |
* |
__mul__(self, other) |
Multiplication |
- |
__sub__(self, other) |
Subtraction |
% |
__mod__(self, other) |
Remainder |
/ |
__truediv__(self, other) |
Division |
< |
__lt__(self, other) |
Less than |
<= |
__le__(self, other) |
Less than or equal to |
== |
__eq__(self, other) |
Equal to |
!= |
__ne__(self, other) |
Not equal to |
> |
__gt__(self, other) |
Greater than |
>= |
__ge__(self, other) |
Greater than or equal to |
[index] |
__getitem__(self, index) |
Index operator |
in |
__contains__(self, value) |
Check membership |
len |
__len__(self) |
The number of elements |
str |
__str__(self) |
The string representation |
Как работает @property и зачем он нужен
property([fget[, fset[, fdel[, doc]]]]) -> property
- fget : Функция, реализующая возврат значения свойства.
- fset : Функция, реализующая установку значения свойства.
- fdel : Функция, реализующая удаление значения свойства.
- doc : Строка документации для создаваемого свойства. Если не задано , будет использовано описание от fget (если оно существует).
Позволяет использовать методы в качестве свойств объектов — порождает дескриптор, позволяющий создавать «вычисляемые» свойства (тип property).
Пример использования в классическом виде:
class Mine(object):
def __init__(self):
self._x = None
def get_x(self):
return self._x
def set_x(self, value):
self._x = value
def del_x(self):
self._x = 'No more'
x = property(get_x, set_x, del_x, 'Это свойство x.')
type(Mine.x) # property
mine = Mine()
mine.x # None
mine.x = 3
mine.x # 3
del mine.x
mine.x # No more
Используя функцию в качестве декоратора можно легко создавать вычисляемые свойства только для чтения:
class Mine(object):
def __init__(self):
self._x = 'some value'
@property
def prop(self):
return self._x
mine = Mine()
mine.prop # some value
mine.prop = 'other value' # AttributeError
del mine.prop # AttributeError?
Объект свойства также предоставляет методы getter, setter, deleter, которые можно использовать в качестве декораторов для указания функций реализующих получение, установку и удаление свойства соответственно. Следующий код эквивалентен коду из первого примера:
class Mine(object):
def __init__(self):
self._x = None
x = property()
@x.getter
def x(self):
"""Это свойство x."""
return self._x
@x.setter
def x(self, value):
self._x = value
@x.deleter
def x(self):
self._x = 'No more'

Как видно из приведённого выше примера, функции-вычислители свойства должны иметь то же имя, что и само свойство.
Задачи
Задача 0 - "Справедливый" купец
Купец нанял N работников (не менее 1 и не более 100). Все работники делали одинаковую работу. По окончании работ купец расплатился с работниками монетами. Но он дал каждому монет не поровну, а как-нибудь: кому-то много, а кому-то мог вообще не заплатить.
Работники возмутились и стали требовать справедливости.
Купец обещал уладить дело.
Он поставил всех работников в круг. Затем у каждой пары работников он брал деньги и складывал. Если число монет двух работников нечетное, то одну монету купец забирал себе, а остальное поровну делил между этими двумя работниками. Купец начинал круг с пары 1-2, затем 2-3, ... и заканчивал круг парой N-1
После каждого такого "уравнивания" все проверяли поровну ли у них монет. Если у всех было поровну, процесс заканчивался.
Рабочие, получив РАВНОЕ количество монет уходили домой, а купец получал еще немножечко денег.
Написать программу, которая вычисляет сколько монет получил купец и сколько каждый работник.
Автор: Овсянникова Т.В.
Задача 1. Сдача долларами
За 1 доллар дают 65 рублей 33 коп. В одном долларе 100 центов. Автомат по продаже мороженного принимает деньги в рублях и долларах. Сдачу отдает только в долларах и центах. Мороженное стоит D долларов, p центов. Человек положил в автомат R рублей.
Написать программу, чтобы вычислить сколько он получит сдачи в долларах и центах.
Задача 2. Сдача той же валютой
За 1 доллар дают 65 рублей 33 коп. В одном долларе 100 центов. Автомат по продаже мороженного принимает деньги в рублях и долларах. Сдачу отдает только в долларах и центах. Мороженное стоит D долларов, p центов. Человек положил в автомат R рублей.
Написать программу, чтобы вычислить сколько он получит сдачи в той же валюте, что платил за мороженое.
Задача 3. Сдача той же валютой - 2
Автомат по продаже мороженого стоит на территории посольства России в Мьянме.
За 1 доллар дают 65 рублей 33 коп.
За 1 доллар дают 1364 kyat 50 pya.
В одном долларе 100 центов.
Автомат по продаже мороженного принимает деньги в рублях, kyat и долларах. Сдачу отдает той же валютой.
Мороженное стоит D долларов, p центов.
Человек положил в автомат R рублей, kyat или долларов.
Написать программу, чтобы вычислить сколько он получит сдачи в той же валюте, что платил за мороженое.
Задача 5. Юань
Добавить в автомат юани. 1 доллар 6.63 юаня.
"Копеек" у юаня нет.
Добавить юани в автомат
--
TatyanaDerbysheva - 19 Nov 2017