Advertisement
Guest User

Reibello AoC 11

a guest
Dec 11th, 2016
1,003
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.18 KB | None | 0 0
  1. #aoc_2016_11
  2. import copy
  3. import collections
  4.  
  5. input_file_object = open("aoc_2016_input_11.txt")
  6. input_as_string = input_file_object.read()
  7. input_file_object.close()
  8. input_by_line = input_as_string.split('\n')
  9.  
  10. floor1a = ['v','A','a']
  11. floor1b = ['v','A','a','F','f','G','g']
  12. floor2 = ['B','C','D','E']
  13. floor3 = ['b','c','d','e']
  14. floor4 = []
  15. moves = 0
  16. floors = [floor1b, floor2, floor3, floor4]
  17.  
  18. initial_state = [floors, moves]
  19. '''
  20. [
  21.  [
  22.   [f1],[],[],[]
  23.  ],
  24.   0
  25. ]
  26. '''
  27.  
  28. #goal = ',,,ABCDEabcdev,'
  29. goal = ',,,ABCDEFGabcdefgv,'
  30. seen = {}
  31. queue = collections.deque([])
  32.  
  33. test_state = [[[], ['B', 'C', 'D', 'E', 'a'], ['b', 'c', 'd', 'e', 'A', 'v'], []]]
  34.  
  35. '''def is_new(current):
  36.    #current = queue[0] = [state,moves]
  37.    c_state = current[0]
  38.    c_moves = current[1]
  39.    n_state = copy.deepcopy(current[0])
  40.    for x in range(len(n_state)):
  41.        n_state[x] = sorted(n_state[x])
  42.    if n_state == goal:
  43.        print(n_state, c_moves)
  44.        return (n_state, c_moves)
  45.    for pair in seen:
  46.        if pair[0] == n_state:
  47.            return False
  48.    else:
  49.        seen.append((n_state,c_moves))
  50.        return True'''
  51.  
  52. def is_new(current):
  53.     c_state = current[0]
  54.     c_moves = current[1]
  55.     n_state = copy.deepcopy(current[0])
  56.     for x in range(len(n_state)):
  57.         n_state[x] = sorted(n_state[x])
  58.     temp = ''
  59.     for x in range(len(n_state)):
  60.         #print(n_state[x])
  61.         temp += ''.join(n_state[x])
  62.         temp += ','
  63.     if temp == goal:
  64.         print(temp, c_moves)
  65.     if temp in seen:
  66.         return False
  67.     else:
  68.         seen[temp] = True
  69.         return True
  70.    
  71.  
  72. def is_valid(current):
  73.     #current = queue[0]
  74.     #c_state = queue[0][0]
  75.     c_state = current[0]
  76.    
  77.     for floor in c_state:
  78.         if len(floor) == 1 and floor[0] == 'v':
  79.             return False
  80.         for chip in 'abcdefg':
  81.             if chip in floor:
  82.                 #print('floor=',floor)
  83.                 #print('chip=',chip)
  84.                 if chip.upper() not in floor:
  85.                     for thing in floor:
  86.                         if thing.isupper():
  87.                             return False
  88.     else:
  89.         #print(c_state)
  90.         return True
  91.                        
  92.    
  93.    
  94. def expand_queue(current, stack):
  95.     c_state = current[0]
  96.     c_moves = current[1]
  97.  
  98.     for i in range(len(c_state)):
  99.        
  100.         if 'v' in c_state[i] and len(c_state[i]) > 1:
  101.             for item_one in c_state[i]:
  102.                 if item_one != 'v':
  103.                     #print(c_state)
  104.                     #print(item_one)
  105.                 ######################################################
  106.                     if i != 3:#as long as this isn't the top floor
  107.                         u_state = copy.deepcopy(c_state)
  108.                        
  109.                         u_state[i+1].append(item_one)
  110.                         u_state[i].remove(item_one)
  111.                         u_state[i+1].append('v')
  112.                         u_state[i].remove('v')
  113.                                            
  114.                         if is_valid([u_state, c_moves +1]) and is_new([u_state, c_moves+1]):
  115.                             queue.append([u_state, c_moves + 1])            
  116.                        
  117.                         for item_two in c_state[i]:
  118.                             if item_two != 'v' and item_two != item_one:
  119.  
  120.                                 uu_state = copy.deepcopy(u_state)
  121.                                 uu_state[i+1].append(item_two)
  122.                                 uu_state[i].remove(item_two)
  123.  
  124.                                 if is_valid([uu_state, c_moves +1]) and is_new([uu_state, c_moves+1]):
  125.                                     queue.append([uu_state, c_moves + 1])
  126.                              
  127.                 #########################################################
  128.                     if i != 0:#as long as this isn't the bottom floor
  129.                         d_state = copy.deepcopy(c_state)
  130.                        
  131.                         d_state[i-1].append(item_one)
  132.                         d_state[i].remove(item_one)
  133.                         d_state[i-1].append('v')
  134.                         d_state[i].remove('v')
  135.  
  136.                         if is_valid([d_state, c_moves +1]) and is_new([d_state, c_moves+1]):
  137.                             queue.append([d_state, c_moves + 1])
  138.                            
  139.                        
  140.                         for item_two in c_state[i]:
  141.                             if item_two != 'v' and item_two != item_one:
  142.  
  143.                                 dd_state = copy.deepcopy(d_state)
  144.                                 dd_state[i-1].append(item_two)
  145.                                 dd_state[i].remove(item_two)
  146.                                
  147.                                 if is_valid([dd_state, c_moves +1]) and is_new([dd_state, c_moves+1]):
  148.                                     queue.append([dd_state, c_moves + 1])
  149.                                    
  150.  
  151.     queue.popleft()
  152.            
  153. ###############################################################################
  154.  
  155. queue.append(initial_state)
  156. is_new(initial_state)
  157. while queue:
  158.     expand_queue(queue[0],queue)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement