fork download
  1. mapping: dict[int, list[int]] = {
  2. 0: [127, 136, 145, 190, 235, 280, 370, 389, 460, 479, 569, 578, 118, 226, 244, 299, 334, 488, 668, 677, 0, 550],
  3. 1: [128, 137, 146, 236, 245, 290, 380, 470, 489, 560, 678, 579, 119, 155, 227, 335, 344, 399, 588, 669, 100, 777],
  4. 2: [129, 138, 147, 156, 237, 246, 345, 390, 480, 570, 679, 589, 110, 228, 255, 336, 499, 660, 688, 778, 200, 444],
  5. 3: [120, 139, 148, 157, 238, 247, 256, 346, 490, 580, 670, 689, 166, 229, 337, 355, 445, 599, 779, 788, 300, 111],
  6. 4: [130, 149, 158, 167, 239, 248, 257, 347, 356, 590, 680, 789, 112, 220, 266, 338, 446, 455, 699, 770, 400, 888],
  7. 5: [140, 159, 168, 230, 249, 258, 267, 348, 357, 456, 690, 780, 113, 122, 177, 339, 366, 447, 799, 770, 500, 555],
  8. 6: [123, 150, 169, 178, 240, 259, 268, 349, 358, 457, 367, 790, 114, 277, 330, 448, 466, 556, 880, 899, 600, 222],
  9. 7: [124, 160, 179, 250, 269, 278, 340, 359, 368, 458, 467, 890, 115, 133, 188, 223, 377, 449, 557, 566, 700, 999],
  10. 8: [125, 134, 170, 189, 260, 279, 350, 369, 378, 459, 567, 468, 116, 224, 233, 288, 440, 477, 558, 990, 800, 666],
  11. 9: [126, 135, 180, 234, 270, 289, 360, 379, 450, 469, 117, 478, 568, 144, 199, 225, 388, 559, 577, 667, 900, 333],
  12. }
  13.  
  14. msgs: list[str] = [
  15. 5,
  16. "238-3X458-7",
  17. "667-9X560-1",
  18. "170-8X233-8",
  19. "570-2X155-1"
  20. ]
  21.  
  22. def validate(msg: str) -> bool:
  23. return all([
  24. isinstance(msg, str),
  25. len(msg) == 11,
  26. msg[:3].isdigit(),
  27. msg[4].isdigit(),
  28. msg[6:9].isdigit(),
  29. msg[10].isdigit(),
  30. msg[3] == "-",
  31. msg[5] == "X",
  32. msg[9] == "-"
  33. ])
  34.  
  35. def search(num: int, mapping: dict[int, list[int]]) -> list[int]:
  36. groups: list[int] = []
  37. for i, values in enumerate(mapping.values()):
  38. if num in values:
  39. groups.append(i)
  40.  
  41. return groups
  42.  
  43.  
  44. def prepare_data(msg: str) -> list[int]:
  45. if not validate(msg):
  46. raise ValueError(f"There is error in format of msg: {msg}")
  47. return [int(num) for num in [msg[:3], msg[4], msg[6:9], msg[10]]]
  48.  
  49.  
  50. def analysis(
  51. msg: str, mapping: dict[int, list[int]]
  52. ) -> dict[int, list[int] | None]:
  53. nums: list[int] = prepare_data(msg)
  54.  
  55. return {num: search(num, mapping) for num in nums}
  56.  
  57.  
  58. def display(msg: str, mapping: dict[int, list[int]]) -> str:
  59. analysed: str = ""
  60.  
  61. for num, group in analysis(msg, mapping).items():
  62. group = [str(item) for item in group or ["None"]]
  63. analysed += f" {num} -> group {', '.join(group)}.\n\n"
  64.  
  65. return f"Message {msg}\n\n{analysed}"
  66.  
  67.  
  68. def display_all(msgs: list[str], mapping: dict[int, list[int]]) -> str:
  69. return "\n".join([display(msg, mapping) for msg in msgs])
  70.  
  71.  
  72. if __name__ == "__main__":
  73. try:
  74. print(display_all(msgs, mapping))
  75. except Exception as e:
  76. print(e)
Success #stdin #stdout 0.09s 14064KB
stdin
Standard input is empty
stdout
object of type 'int' has no len()