Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import csv
- class InvalidInputError(Exception):
- pass
- def parse_input_parameters(params):
- parsed = {"file": "input.csv", "rows": None, "cols": None, "n": None, "m": None, "items": []}
- for param in params:
- try:
- param = param.strip().strip(",")
- if param.startswith(("f=", "file=")):
- parsed["file"] = param.split("=", 1)[1]
- elif param.startswith(("n=", "number=")):
- parsed["n"] = int(param.split("=", 1)[1])
- elif param.startswith("rows="):
- parsed["rows"] = int(param.split("=", 1)[1])
- elif param.startswith("cols="):
- parsed["cols"] = int(param.split("=", 1)[1])
- elif param.startswith(("m=", "pigeons=")):
- parsed["m"] = int(param.split("=", 1)[1])
- else:
- items = param.split(";") if ";" in param else param.split(",")
- parsed["items"].extend(item.strip() for item in items)
- except ValueError:
- raise InvalidInputError(f"Неверный формат параметра: {param}")
- return parsed
- def validate_csv_and_params(file_path, rows, cols, n, m, items):
- try:
- with open(file_path, 'r', encoding='utf-8') as file:
- reader = csv.reader(file)
- csv_content = [row for row in reader]
- except FileNotFoundError:
- raise InvalidInputError(f"Файл {file_path} не найден.")
- errors = []
- unique_items = set(item for row in csv_content for cell in row for item in cell.split(",") if cell.strip())
- if rows is not None and rows != len(csv_content):
- errors.append(f"Ожидалось {rows} строк, но в файле их {len(csv_content)}.")
- if cols is not None and cols != max(len(row) for row in csv_content):
- errors.append(f"Ожидалось {cols} колонок, но в файле их {max(len(row) for row in csv_content)}.")
- if n is not None and n != len(csv_content) * max(len(row) for row in csv_content):
- errors.append(f"Ожидалось {n} ящиков, но в файле их {len(csv_content) * max(len(row) for row in csv_content)}.")
- if m is not None and m != len(items):
- errors.append(f"Ожидалось {m} предметов, но в списке их {len(items)}.")
- if set(items) != unique_items:
- errors.append(f"Предметы из параметров не совпадают с предметами в файле.")
- return errors, csv_content
- def dirichlet(n, m):
- if n == 0:
- return "Невозможно сформулировать принцип Дирихле: ящиков нет."
- if m == 0:
- return f"Если в {n} ящиках лежит 0 предметов, то все ящики пусты."
- if m > n:
- return f"Если в {n} ящиках лежит {m} предметов, то хотя бы в одном ящике лежит не менее {-(m // -n)} предметов."
- else:
- return f"Если в {n} ящиках лежит {m} предметов, то пустых ящиков как минимум {n - m}."
- def vvod_params():
- print("Введите параметры в формате: ")
- print("file=<имя файла>, n=<число ящиков>, rows=<число рядов>, cols=<число колонок>, m=<число предметов>")
- print("перечисление предметов через запятую или точку с запятой. 'end' для завершения.")
- params = []
- while True:
- s = input("Параметр: ").strip()
- if s.lower() == "end":
- break
- if s:
- params.append(s)
- return params
- input_param = [
- "file=input.csv",
- "cols=4",
- "rows=3",
- "n=12",
- "m=9",
- 'игрушка,коробка,свечка,лего,кукла,свитер с оленями,ни,че,го'
- ]
- if __name__ == "__main__":
- input_parameters = vvod_params()
- params = parse_input_parameters(input_parameters)
- errors, csv_data = validate_csv_and_params(
- params["file"], params["rows"], params["cols"], params["n"], params["m"], params["items"]
- )
- if errors:
- print("Ошибки проверки:")
- print("\n".join(errors))
- else:
- print(dirichlet(params["n"], params["m"]))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement