quate

Untitled

Jan 18th, 2023
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.96 KB | None | 0 0
  1. # "aabbcca" --> [('a', 2), ('b', 2), ('c', 2), ('a', 1)]
  2.  
  3. def compress(message: str) -> list[tuple[str, int]]:
  4. prev_unique = None
  5. ans = []
  6. for chr in message:
  7. if not(prev_unique) or prev_unique != chr:
  8. ans.append((chr, 1))
  9. prev_unique = chr
  10. else:
  11. ans[-1] = (chr, ans[-1][1] + 1)
  12.  
  13. return ans
  14.  
  15. # "aabb" --> [('a', 2)]
  16. # "c" --> [('b', 2)]
  17. # "ca" --> [('c', 2)]
  18.  
  19. # c,c,a
  20. class Encoder:
  21. def __init__(self) -> None:
  22. self.possible_next = None
  23.  
  24. def receive(self, message: str) -> list[tuple[str, int]]:
  25. compressed = compress(message)
  26.  
  27. if len(compressed) == 0:
  28. return []
  29.  
  30. if not(self.possible_next):
  31. self.possible_next = compressed.pop()
  32. return compressed
  33.  
  34. elif compressed[0][0] == self.possible_next[0]:
  35. merged = (compressed[0][0], compressed[0][1] + self.possible_next[1])
  36. compressed[0] = merged
  37. self.possible_next = compressed.pop()
  38. return compressed
  39.  
  40. else:
  41. first = [self.possible_next]
  42. self.possible_next = compressed.pop()
  43. first.extend(compressed)
  44. return first
  45.  
  46. # 4: "fg" --> []
  47. # 2: "c" --> []
  48. # 1: "ca" --> []
  49. # 0: "aabb" --> [('a', 2), ('b', 2), ('c', 1), ('a', 1)]
  50. # 3: "ddde" --> [('c', 1), ('d', 3), ('e', 1), ('f', 1)]
  51. class Encoder2:
  52. def __init__(self) -> None:
  53. self.possible_next_dict = {}
  54. self.msg_id_next = 0
  55.  
  56.  
  57. def receive(self, message_id: int, message: str) -> list[tuple[str, int]]:
  58. compressed = compress(message)
  59.  
  60. if len(compressed) == 0:
  61. return []
  62.  
  63. if message_id != msg_id_next:
  64. self.possible_next_dict[message_id] = compressed
  65. return []
  66.  
  67. else:
  68. compressed = compress(message)
  69.  
  70. for i in range(len(self.possible_next)):
  71. if self.possible_next_dict.get(msg_id_next + i + 1):
  72.  
  73. next = self.possible_next_dict[msg_id_next + i + 1]
  74. if compressed[-1][0] == next[0][0]:
  75.  
  76.  
  77.  
  78. else:
  79. break
  80.  
  81. return compressed
  82.  
Advertisement
Add Comment
Please, Sign In to add comment