Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Напишите код к этой интересной задачке

Пользователь удален Ученик (20), закрыт 1 год назад
Вам необходимо описывать в программе очень большие и разреженные таблицы данных (с большим числом пропусков). Для этого предлагается объявить класс SparseTable, объекты которого создаются командой:

st = SparseTable()
В каждом объекте этого класса должны создаваться локальные публичные атрибуты:

rows - общее число строк таблицы (начальное значение 0);
cols - общее число столбцов таблицы (начальное значение 0).

В самом классе SparseTable должны быть объявлены методы:

add_data(row, col, data) - добавление данных data (объект класса Cell) в таблицу по индексам row, col (целые неотрицательные числа);
remove_data(row, col) - удаление ячейки (объект класса Cell) с индексами (row, col).

При удалении/добавлении новой ячейки должны автоматически пересчитываться атрибуты rows, cols объекта класса SparseTable. Если происходит попытка удалить несуществующую ячейку, то должно генерироваться исключение:

raise IndexError('ячейка с указанными индексами не существует')
Ячейки таблицы представляют собой объекты класса Cell, которые создаются командой:

data = Cell(value)
где value - данные ячейки (любой тип).

Хранить ячейки следует в словаре, ключами которого являются индексы (кортеж) i, j, а значениями - объекты класса Cell.

Также с объектами класса SparseTable должны выполняться команды:

res = st[i, j] # получение данных из таблицы по индексам (i, j)
st[i, j] = value # запись новых данных по индексам (i, j)
Чтение данных возможно только для существующих ячеек. Если ячейки с указанными индексами нет, то генерировать исключение командой:

raise ValueError('данные по указанным индексам отсутствуют')
При записи новых значений их следует менять в существующей ячейке или добавлять новую, если ячейка с индексами (i, j) отсутствует в таблице. (Не забывайте при этом пересчитывать атрибуты rows и cols).

P.S. В программе нужно объявить только классы. Выводить на экран ничего не нужно.
Для примера:

Тест
st = SparseTable()
st.add_data(2, 5, Cell(25))
st.add_data(1, 1, Cell(11))
assert st.rows == 3 and st.cols == 6, "неверные значения атрибутов rows и cols"
Результат
Лучший ответ
Папа Высший разум (122581) 1 год назад
А вот и табличка. Я бы, честно говоря, реализовал её совсем по-другому, и было бы намного компактнее. Но раз у вас хотят словарь - пусть будет словарь.
 class Cell:
def __init__(self, value):
self.value = value

class SparseTable:
def __init__(self):
self.rows = 0
self.cols = 0
self.data = {}

def add_data(self, row, col, data):
self.data[(row, col)] = data
if self.rows <= row: self.rows = row + 1
if self.cols <= col: self.cols = col + 1

def remove_data(self, row, col):
if (row, col) in self.data:
del self.data[(row, col)]
if self.rows == row + 1 or self.cols == col + 1: self.recalc()
else:
raise IndexError('ячейка с указанными индексами не существует')

def __getitem__(self, key):
if key in self.data:
return self.data[key].value
else:
raise ValueError('данные по указанным индексам отсутствуют')

def __setitem__(self, key, value):
self.add_data(key[0], key[1], Cell(value))

def recalc(self):
self.rows = max(k[0] for k in self.data) + 1
self.cols = max(k[1] for k in self.data) + 1

st = SparseTable()
st.add_data(2, 5, Cell(25))
st.add_data(1, 1, Cell(11))
assert st.rows == 3 and st.cols == 6, "неверные значения атрибутов rows и cols"
Пользователь удаленУченик (20) 1 год назад
Эти задачи уже не нужны, гляньте пожалуйста последнюю
Папа Высший разум (122581) Мария Луганская Кузнецова, я видел её. Только там постановка задачи не особо понятна. А что ещё могут передать в параметре cell, кроме Integer?
Остальные ответы
Сергей Пузанский Ученик (204) 1 год назад
ChatGPT в помощь
Пользователь удаленУченик (20) 1 год назад
?
Сергей Пузанский Ученик (204) Мария Луганская Кузнецова, это название нейросети, которая по некоторым вводным может помочь с написанием кода
Похожие вопросы