Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2017
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.70 KB | None | 0 0
  1. class LinkedList:
  2.     def __init__(self, array):
  3.         self.first = Node("", 1, None, None)
  4.         current_el = self.first
  5.         for element in array:
  6.             if current_el.value == element:
  7.                 current_el.count += 1
  8.             else:
  9.                 current_el.next_el = Node(element, 1, current_el, None)
  10.                 current_el = current_el.next_el
  11.  
  12.     @staticmethod
  13.     def insert_before(insertable_el, count_insertable_el, el_in_array):
  14.         node = Node(insertable_el, count_insertable_el, el_in_array.past_el, el_in_array)
  15.         if el_in_array.past_el is not None:
  16.             el_in_array.past_el.next_el = node
  17.         el_in_array.past_el = node
  18.  
  19.     @staticmethod
  20.     def insert_after(insertable_el, count_insertable_el, el_in_array):
  21.         node = Node(insertable_el, count_insertable_el, el_in_array, el_in_array.next_el)
  22.         if el_in_array.next_el is not None:
  23.             el_in_array.next_el.past_el = node
  24.         el_in_array.next_el = node
  25.  
  26.     @staticmethod
  27.     def delete_char(char):
  28.         left = char.past_el
  29.         left.next_el = char.next_el
  30.         right = char.next_el
  31.         if right is not None:
  32.             right.past_el = left
  33.             if left.value == right.value:
  34.                 LinkedList.union(left, right)
  35.         return left
  36.  
  37.     @staticmethod
  38.     def union(left, right):
  39.         left.count += right.count
  40.         left.next_el = right.next_el
  41.         if right.next_el is not None:
  42.             right.next_el.past_el = left
  43.  
  44.     def __str__(self):
  45.         text_in_list = []
  46.         current_el = self.first.next_el
  47.         while current_el is not None:
  48.             text_in_list.append(current_el.value * current_el.count)
  49.             current_el = current_el.next_el
  50.         return "".join(text_in_list)
  51.  
  52.  
  53. class Node:
  54.     def __init__(self, value, count, past_el, next_el):
  55.         self.value = value
  56.         self.count = count
  57.         self.past_el = past_el
  58.         self.next_el = next_el
  59.  
  60.  
  61. def main():
  62.     initial_code = input()
  63.     code_mutants = LinkedList(initial_code)
  64.     message_about_modifiers = input()
  65.     modifiers = dict()
  66.     for letter in message_about_modifiers:
  67.         if letter in modifiers.keys():
  68.             modifiers[letter] += 1
  69.         else:
  70.             modifiers[letter] = 1
  71.     for letter_in_alp in sorted(modifiers.keys(), reverse=True):
  72.         current_el = code_mutants.first.next_el
  73.         while True:
  74.             if letter_in_alp < current_el.value:
  75.                 code_mutants.insert_before(letter_in_alp, modifiers[letter_in_alp], current_el)
  76.                 break
  77.             elif letter_in_alp > current_el.value:
  78.                 if current_el.next_el is None:
  79.                     if modifiers[letter_in_alp] % 2 == 0:
  80.                         break
  81.                     else:
  82.                         code_mutants.insert_after(letter_in_alp, 1, current_el)
  83.                     break
  84.                 else:
  85.                     current_el = current_el.next_el
  86.             else:
  87.                 if current_el.next_el is None or current_el.next_el.value < letter_in_alp:
  88.                     if current_el.count <= modifiers[letter_in_alp]:
  89.                         modifiers[letter_in_alp] -= current_el.count
  90.                         current_el = code_mutants.delete_char(current_el)
  91.                         if modifiers[letter_in_alp] == 0:
  92.                             break
  93.                     else:
  94.                         current_el.count -= modifiers[letter_in_alp]
  95.                         break
  96.                 else:
  97.                     current_el.count += modifiers[letter_in_alp]
  98.                     break
  99.     print(str(code_mutants))
  100.  
  101.  
  102. if __name__ == "__main__":
  103.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement