Advertisement
Guest User

Untitled

a guest
Dec 13th, 2019
241
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 24.66 KB | None | 0 0
  1. # Testdaten Advent 9
  2. #liste_src = [109,1,204,-1,1001,100,1,100,1008,100,16,101,1006,101,0,99]
  3. #liste_src = [1102,34915192,34915192,7,4,7,99,0]
  4. #liste_src = [104,1125899906842624,99]
  5. #liste_src = [1102,34463338,34463338,63,1007,63,34463338,63,1005,63,53,1102,3,1,1000,109,988,209,12,9,1000,209,6,209,3,203,0,1008,1000,1,63,1005,63,65,1008,1000,2,63,1005,63,904,1008,1000,0,63,1005,63,58,4,25,104,0,99,4,0,104,0,99,4,17,104,0,99,0,0,1101,0,31,1019,1101,25,0,1008,1102,35,1,1009,1102,422,1,1029,1102,1,21,1005,1102,1,734,1027,1102,29,1,1000,1101,32,0,1018,1102,28,1,1016,1101,0,38,1015,1101,0,378,1023,1101,30,0,1017,1102,1,381,1022,1101,0,37,1006,1102,1,1,1021,1101,0,24,1011,1102,1,23,1002,1101,0,0,1020,1101,0,20,1007,1101,427,0,1028,1101,26,0,1014,1101,27,0,1010,1101,0,39,1001,1101,34,0,1012,1102,1,36,1013,1101,0,33,1003,1101,804,0,1025,1101,737,0,1026,1102,1,809,1024,1102,1,22,1004,109,9,1201,-7,0,63,1008,63,20,63,1005,63,205,1001,64,1,64,1106,0,207,4,187,1002,64,2,64,109,2,21102,40,1,1,1008,1012,40,63,1005,63,233,4,213,1001,64,1,64,1106,0,233,1002,64,2,64,109,4,1208,-7,25,63,1005,63,255,4,239,1001,64,1,64,1106,0,255,1002,64,2,64,109,-24,1207,10,38,63,1005,63,271,1105,1,277,4,261,1001,64,1,64,1002,64,2,64,109,25,21107,41,40,-3,1005,1013,293,1105,1,299,4,283,1001,64,1,64,1002,64,2,64,109,5,1205,-1,311,1106,0,317,4,305,1001,64,1,64,1002,64,2,64,109,-23,1202,6,1,63,1008,63,22,63,1005,63,339,4,323,1105,1,343,1001,64,1,64,1002,64,2,64,109,1,2101,0,2,63,1008,63,37,63,1005,63,367,1001,64,1,64,1106,0,369,4,349,1002,64,2,64,109,29,2105,1,-5,1106,0,387,4,375,1001,64,1,64,1002,64,2,64,109,-26,2101,0,0,63,1008,63,23,63,1005,63,409,4,393,1106,0,413,1001,64,1,64,1002,64,2,64,109,26,2106,0,0,4,419,1106,0,431,1001,64,1,64,1002,64,2,64,109,-17,21108,42,42,6,1005,1017,453,4,437,1001,64,1,64,1106,0,453,1002,64,2,64,109,7,21101,43,0,-8,1008,1010,44,63,1005,63,477,1001,64,1,64,1105,1,479,4,459,1002,64,2,64,109,-7,1206,10,495,1001,64,1,64,1106,0,497,4,485,1002,64,2,64,109,-5,2108,36,0,63,1005,63,513,1106,0,519,4,503,1001,64,1,64,1002,64,2,64,109,3,2102,1,-5,63,1008,63,22,63,1005,63,541,4,525,1105,1,545,1001,64,1,64,1002,64,2,64,109,3,1207,-6,38,63,1005,63,567,4,551,1001,64,1,64,1105,1,567,1002,64,2,64,109,-15,2107,20,8,63,1005,63,585,4,573,1106,0,589,1001,64,1,64,1002,64,2,64,109,-1,1208,5,36,63,1005,63,609,1001,64,1,64,1106,0,611,4,595,1002,64,2,64,109,30,21101,44,0,-7,1008,1019,44,63,1005,63,633,4,617,1106,0,637,1001,64,1,64,1002,64,2,64,109,-25,1201,0,0,63,1008,63,39,63,1005,63,659,4,643,1105,1,663,1001,64,1,64,1002,64,2,64,109,27,1206,-8,677,4,669,1106,0,681,1001,64,1,64,1002,64,2,64,109,-28,2108,29,0,63,1005,63,703,4,687,1001,64,1,64,1106,0,703,1002,64,2,64,109,5,21107,45,46,7,1005,1012,725,4,709,1001,64,1,64,1106,0,725,1002,64,2,64,109,30,2106,0,-8,1105,1,743,4,731,1001,64,1,64,1002,64,2,64,109,-22,21102,46,1,4,1008,1017,44,63,1005,63,767,1001,64,1,64,1105,1,769,4,749,1002,64,2,64,109,-15,1202,10,1,63,1008,63,23,63,1005,63,793,1001,64,1,64,1106,0,795,4,775,1002,64,2,64,109,19,2105,1,7,4,801,1105,1,813,1001,64,1,64,1002,64,2,64,109,6,1205,-2,827,4,819,1106,0,831,1001,64,1,64,1002,64,2,64,109,-20,2107,22,2,63,1005,63,851,1001,64,1,64,1106,0,853,4,837,1002,64,2,64,109,20,21108,47,44,-8,1005,1015,869,1105,1,875,4,859,1001,64,1,64,1002,64,2,64,109,-22,2102,1,4,63,1008,63,23,63,1005,63,899,1001,64,1,64,1106,0,901,4,881,4,64,99,21101,0,27,1,21102,915,1,0,1106,0,922,21201,1,28703,1,204,1,99,109,3,1207,-2,3,63,1005,63,964,21201,-2,-1,1,21101,0,942,0,1106,0,922,22101,0,1,-1,21201,-2,-3,1,21101,957,0,0,1105,1,922,22201,1,-1,-2,1105,1,968,21201,-2,0,-2,109,-3,2105,1,0]
  6.  
  7. # Testdaten Advent7 - Loop-Modus
  8. #liste_src = [3,26,1001,26,-4,26,3,27,1002,27,2,27,1,27,26,27,4,27,1001,28,-1,28,1005,28,6,99,0,0,5]
  9. #liste_src = [3,52,1001,52,-5,52,3,53,1,52,56,54,1007,54,5,55,1005,55,26,1001,54,-5,54,1105,1,12,1,53,54,53,1008,54,0,55,1001,55,1,55,2,53,55,53,4,53,1001,56,-1,56,1005,56,6,99,0,0,0,0,10]
  10. #liste_src =[3,8,1001,8,10,8,105,1,0,0,21,34,51,64,81,102,183,264,345,426,99999,3,9,102,2,9,9,1001,9,4,9,4,9,99,3,9,101,4,9,9,102,5,9,9,1001,9,2,9,4,9,99,3,9,101,3,9,9,1002,9,5,9,4,9,99,3,9,102,3,9,9,101,3,9,9,1002,9,4,9,4,9,99,3,9,1002,9,3,9,1001,9,5,9,1002,9,5,9,101,3,9,9,4,9,99,3,9,102,2,9,9,4,9,3,9,101,1,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,101,1,9,9,4,9,3,9,101,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,101,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,102,2,9,9,4,9,99,3,9,101,2,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,1002,9,2,9,4,9,3,9,1001,9,1,9,4,9,3,9,1001,9,2,9,4,9,3,9,101,1,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,101,1,9,9,4,9,99,3,9,1002,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,101,1,9,9,4,9,3,9,101,2,9,9,4,9,3,9,101,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,1001,9,1,9,4,9,3,9,1001,9,2,9,4,9,3,9,1002,9,2,9,4,9,99,3,9,1001,9,1,9,4,9,3,9,102,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,101,2,9,9,4,9,3,9,101,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,1001,9,1,9,4,9,3,9,1001,9,1,9,4,9,99,3,9,1002,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,1001,9,2,9,4,9,3,9,101,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,1002,9,2,9,4,9,3,9,1001,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,101,1,9,9,4,9,99]
  11.  
  12. # Input _ Advent11 - Robot
  13. liste_src = [3,8,1005,8,334,1106,0,11,0,0,0,104,1,104,0,3,8,102,-1,8,10,101,1,10,10,4,10,108,0,8,10,4,10,1002,8,1,28,2,1108,5,10,3,8,102,-1,8,10,101,1,10,10,4,10,1008,8,1,10,4,10,1001,8,0,55,1,102,18,10,1,2,5,10,3,8,1002,8,-1,10,1001,10,1,10,4,10,108,1,8,10,4,10,1001,8,0,84,1,106,11,10,2,1008,6,10,1,4,4,10,1006,0,55,3,8,1002,8,-1,10,1001,10,1,10,4,10,108,0,8,10,4,10,102,1,8,121,1,107,9,10,3,8,102,-1,8,10,101,1,10,10,4,10,108,1,8,10,4,10,101,0,8,147,2,1002,4,10,2,104,18,10,1,107,16,10,1,108,8,10,3,8,102,-1,8,10,101,1,10,10,4,10,108,0,8,10,4,10,102,1,8,185,3,8,1002,8,-1,10,1001,10,1,10,4,10,1008,8,0,10,4,10,101,0,8,208,2,1009,16,10,1006,0,7,1006,0,18,1,1105,8,10,3,8,1002,8,-1,10,101,1,10,10,4,10,108,1,8,10,4,10,101,0,8,243,2,1105,20,10,2,106,10,10,1006,0,67,3,8,1002,8,-1,10,101,1,10,10,4,10,108,0,8,10,4,10,1001,8,0,276,2,1103,5,10,2,1104,7,10,1006,0,35,2,1105,3,10,3,8,1002,8,-1,10,101,1,10,10,4,10,1008,8,1,10,4,10,1002,8,1,314,101,1,9,9,1007,9,1097,10,1005,10,15,99,109,656,104,0,104,1,21102,936995824532,1,1,21101,0,351,0,1105,1,455,21102,1,387508445964,1,21102,362,1,0,1106,0,455,3,10,104,0,104,1,3,10,104,0,104,0,3,10,104,0,104,1,3,10,104,0,104,1,3,10,104,0,104,0,3,10,104,0,104,1,21102,1,235244973059,1,21101,409,0,0,1106,0,455,21102,179410541659,1,1,21101,0,420,0,1105,1,455,3,10,104,0,104,0,3,10,104,0,104,0,21101,868402070292,0,1,21102,1,443,0,1106,0,455,21102,1,709584749324,1,21102,454,1,0,1106,0,455,99,109,2,22102,1,-1,1,21101,40,0,2,21102,486,1,3,21101,0,476,0,1106,0,519,109,-2,2105,1,0,0,1,0,0,1,109,2,3,10,204,-1,1001,481,482,497,4,0,1001,481,1,481,108,4,481,10,1006,10,513,1101,0,0,481,109,-2,2106,0,0,0,109,4,2102,1,-1,518,1207,-3,0,10,1006,10,536,21102,0,1,-3,21202,-3,1,1,22102,1,-2,2,21102,1,1,3,21102,555,1,0,1106,0,560,109,-4,2106,0,0,109,5,1207,-3,1,10,1006,10,583,2207,-4,-2,10,1006,10,583,21201,-4,0,-4,1106,0,651,21201,-4,0,1,21201,-3,-1,2,21202,-2,2,3,21102,602,1,0,1106,0,560,22102,1,1,-4,21101,0,1,-1,2207,-4,-2,10,1006,10,621,21102,0,1,-1,22202,-2,-1,-2,2107,0,-3,10,1006,10,643,21201,-1,0,1,21102,643,1,0,106,0,518,21202,-2,-1,-2,22201,-4,-2,-4,109,-5,2106,0,0]
  14.  
  15. import itertools
  16.  
  17. # erstellt Liste mit allen Kombinationsmöglichkeiten des Parameters und stellt sie in eine Liste
  18. def make_combi(numb):
  19. combi2 = []
  20. combi = itertools.permutations(numb, len(numb))
  21. for i in combi:
  22. combi2.append(i)
  23. return combi2
  24.  
  25. # Initialisiert die Liste mit x bis zum Maximalwert
  26. def memory_extend(list_extend_index):
  27. for j in range(list_extend_index - len(liste) + 2):
  28. liste.append(0)
  29.  
  30. # Prüft ob ein Werte über die Grenze der Liste hinausgeht
  31. def memory_check (instruct, werte):
  32. global i
  33. max = 0
  34. for j in range (0,len(werte)):
  35. if (instruct[j] == '0' or instruct[j] == '2') and werte[j] > max: max = werte[j]
  36. if max > len(liste): memory_extend(int(max))
  37.  
  38. def robo_move (kennzei):
  39. global robo_color, robo_dir, ergebnis, x, y
  40. print (x,y, kennzei, robo_color, robo_dir, ergebnis)
  41. if int(str(liste[i])[-1]) in (1, 2, 7, 8): print(i, liste[i:i + 4])
  42. elif int(str(liste[i])[-1]) in (5, 6): print(i, liste[i:i + 3])
  43. elif int(str(liste[i])[-1]) in (3, 4, 9): print(i, liste[i:i + 2])
  44. if kennzei == 0:
  45. if robo_color == ' ':
  46. robo_color = 'Farbe'
  47. grid[x][y] == 0
  48. if [x][y] not in fields:
  49. ergebnis += 1
  50. fields.append([x][y])
  51. elif robo_color == 'Farbe':
  52. robo_color = ' '
  53. if robo_dir == 'O': robo_dir = 'L'
  54. elif robo_dir == 'L': robo_dir = 'U'
  55. elif robo_dir == 'U': robo_dir = 'R'
  56. elif robo_dir == 'R': robo_dir = 'O'
  57. elif kennzei == 1:
  58. if robo_color == ' ':
  59. robo_color = 'Farbe'
  60. grid[x][y] == 1
  61. if [x,y] not in fields:
  62. ergebnis += 1
  63. fields.append([x,y])
  64. elif robo_color == 'Farbe':
  65. robo_color = ' '
  66. if robo_dir == 'O': robo_dir = 'R'
  67. elif robo_dir == 'L': robo_dir = 'O'
  68. elif robo_dir == 'U': robo_dir = 'L'
  69. elif robo_dir == 'R': robo_dir = 'U'
  70. if robo_dir == 'O': y -= 1
  71. if robo_dir == 'L': x -= 1
  72. if robo_dir == 'R': x += 1
  73. if robo_dir == 'U': y += 1
  74.  
  75. # 2 Zahlen addieren lt. Position
  76. # OPCODE 1
  77. def op_add(erg, wert1, wert2):
  78. global i
  79. try:
  80. liste[erg] = wert1 + wert2
  81. except:
  82. memory_extend(liste[erg])
  83. liste[erg] = wert1 + wert2
  84. i += 4
  85.  
  86. # 2 Zahlen multiplizieren lt. Position
  87. # OPCODE 2
  88. def op_mult(erg, wert1, wert2):
  89. global i
  90. try:
  91. liste[erg] = wert1 * wert2
  92. except:
  93. memory_extend(liste[erg])
  94. liste[erg] = wert1 * wert2
  95. i += 4
  96.  
  97. # Eingabe eines Wertes lt. Position
  98. # bei 0 erfolgt Eingabe lt. Position
  99. # bei 1 erfolgt Eingabe direkt für die akt. Position
  100. # bei I1 wird der Code lt. Position geschrieben
  101. # bei I2 wird der Code lt. Position geschrieben
  102. # OPCODE 3
  103. def op_in(inst, code):
  104. global i
  105. global relative_base
  106. global mode, x, y
  107. if inst == '0': # Abfrage für manuelle Eingabe im Positionsmode (alte Logik)
  108. inp = input("Input: ")
  109. liste[liste[i + 1]] = int(inp)
  110. elif inst == '1': # Abfrage für manuelle Eingabe im Direktmode (alte Logik
  111. inp = input("Input: ")
  112. liste[i + 1] = int(inp)
  113. elif inst == '2':
  114. inp = input("Input: ")
  115. liste[liste[i + 1]+relative_base] = int(inp)
  116. elif inst == "I": liste[liste[i + 1]] = code
  117. else: print('Error F! ', inst)
  118. i += 2
  119.  
  120. # Ausgabe bei return eines Wertes aus der Funktion
  121. # bei 0 erfolgt Ausgabe lt. Position
  122. # bei 1 erfolgt Ausgabe direkt für die akt. Position
  123. # OPCODE 4
  124. def op_out(inst):
  125. global i, mode, relative_base, robo_color, robo_dir
  126. if mode == 'LOOP':
  127. if inst == '0':
  128. return (liste[liste[i + 1]])
  129. elif inst == '1':
  130. return (liste[i + 1])
  131. elif inst == '2':
  132. return (liste[liste[i + 1]+relative_base])
  133. elif mode == 'TEST':
  134. if inst == '0': print("Output: ", liste[liste[i + 1]]) # was necessary for Advent5
  135. elif inst == '1': print("Output: ", liste[i + 1])
  136. elif inst == '2': print("Output: ", liste[liste[i + 1]+relative_base])
  137. elif mode == 'ROBOT':
  138. if inst == '0': robo_move(liste[liste[i + 1]])
  139. elif inst == '1': robo_move(liste[i + 1])
  140. elif inst == '2': robo_move(liste[liste[i + 1]+relative_base])
  141. else: print ('Error D! ', inst)
  142. i += 2
  143.  
  144. # Vergleich ob der Wert <> 0 ist
  145. # Parameter1 gibt an ob der Pointer lt. Position (0) oder direkter Wert (1) gesetzt werden soll
  146. # Parameter2 gib an ob die Prüfung <> 0 lt. Position (0) oder direktem Wert (1) erfolgen soll
  147. # OPCODE 5
  148. def op_true(in1, in2): # in2 ist der erste Parameter nach dem Operanden - in1 ist der zweite parameter nach dem Operanden
  149. global i
  150. global relative_base
  151. if in2 == '0':
  152. if liste[liste[i+1]] != 0:
  153. if in1 == '0':
  154. i = liste[liste[i + 2]]
  155. elif in1 == '1':
  156. i = liste[i + 2]
  157. elif in1 == '2':
  158. i = liste[liste[i + 2]+relative_base]
  159. else:
  160. i += 3
  161. elif in2 == '1':
  162. if liste[i + 1] != 0:
  163. if in1 == '0':
  164. i = liste[liste[i + 2]]
  165. elif in1 == '1':
  166. i = liste[i + 2]
  167. elif in1 == '2':
  168. i = liste[liste[i + 2]+ relative_base]
  169. else:
  170. i += 3
  171. elif in2 == '2':
  172. if liste[liste[i+1]+relative_base] != 0:
  173. if in1 == '0':
  174. i = liste[liste[i + 2]]
  175. elif in1 == '1':
  176. i = liste[i + 2]
  177. elif in1 == '2':
  178. i = liste[liste[i + 2]+relative_base]
  179. else:
  180. i += 3
  181.  
  182. # Vergleich ob der Wert = 0 ist
  183. # Parameter1 gibt an ob der Pointer lt. Position (0) oder direkter Wert (1) gesetzt werden soll
  184. # Parameter2 gib an ob die Prüfung = 0 lt. Position (0) oder direktem Wert (1) erfolgen soll
  185. # OPCODE 6
  186. def op_false(in1, in2):
  187. global i
  188. global relative_base
  189. if in2 == '0':
  190. if liste[liste[i+1]] == 0:
  191. if in1 == '0':
  192. i = liste[liste[i + 2]]
  193. elif in1 == '1':
  194. i = liste[i + 2]
  195. elif in1 == '2':
  196. i = liste[liste[i + 2]+relative_base]
  197. else:
  198. i += 3
  199. elif in2 == '1':
  200. if liste[i + 1] == 0:
  201. if in1 == '0':
  202. i = liste[liste[i + 2]]
  203. elif in1 == '1':
  204. i = liste[i + 2]
  205. elif in1 == '2':
  206. i = liste[liste[i + 2] + relative_base]
  207. else:
  208. i += 3
  209. elif in2 == '2':
  210. if liste[liste[i+1]+relative_base] == 0:
  211. if in1 == '0':
  212. i = liste[liste[i + 2]]
  213. elif in1 == '1':
  214. i = liste[i + 2]
  215. elif in1 == '2':
  216. i = liste[liste[i + 2]+relative_base]
  217. else:
  218. i += 3
  219.  
  220. # 2 Werte werden verglichen - wenn < wird 1 ausgegeben - sonst 0
  221. # # Parameter1 gibt an ob der Pointer lt. Position (0) oder direkter Wert (1) gesetzt werden soll
  222. # # Parameter2 gib an ob die Prüfung lt. Position (0) oder direktem Wert (1) erfolgen soll
  223. # OPCODE 7:
  224. def op_less(in0, in1, in2):
  225. global i
  226. global relative_base
  227. if in2 == '0':
  228. v1 = liste[liste[i + 1]]
  229. elif in2 == '1':
  230. v1 = liste[i + 1]
  231. elif in2 == '2':
  232. v1 = liste[liste[i + 1]+relative_base]
  233.  
  234. if in1 == '0':
  235. v2 = liste[liste[i + 2]]
  236. elif in1 == '1':
  237. v2 = liste[i + 2]
  238. elif in1 == '2':
  239. v2 = liste[liste[i + 2]+relative_base]
  240.  
  241. if v1 < v2:
  242. if in0 == '0': liste[liste[i + 3]] = 1
  243. elif in0 == '1': liste[i + 3] = 1
  244. elif in0 == '2':
  245. try:
  246. liste[liste[i + 3] + relative_base] = 1
  247. except:
  248. memory_extend(liste[liste[i + 3] + relative_base])
  249. liste[liste[i + 3] + relative_base] = 1
  250. elif v1 >= v2:
  251. if in0 == '0': liste[liste[i + 3]] = 0
  252. elif in0 == '1': liste[i + 3] = 0
  253. elif in0 == '2':
  254. try:
  255. liste[liste[i + 3] + relative_base] = 0
  256. except:
  257. memory_extend(liste[liste[i + 3] + relative_base])
  258. liste[liste[i + 3] + relative_base] = 0
  259. i += 4
  260.  
  261. # 2 Werte werden verglichen - wenn = wird 1 ausgegeben - sonst 0
  262. # # Parameter1 gibt an ob der Pointer lt. Position (0) oder direkter Wert (1) gesetzt werden soll
  263. # # Parameter2 gib an ob die Prüfung lt. Position (0) oder direktem Wert (1) erfolgen soll
  264. # OPCODE 8
  265. def op_equal(in0, in1, in2): # in2 ist der 1. Parameter nach dem Code, dann in1 und dann in0 wor der Werte gespeichert werden soll
  266. global i
  267. global relative_base
  268. if in2 == '0':
  269. v1 = liste[liste[i + 1]]
  270. elif in2 == '1':
  271. v1 = liste[i + 1]
  272. elif in2 == '2':
  273. v1 = liste[liste[i + 1] + relative_base]
  274.  
  275. if in1 == '0':
  276. v2 = liste[liste[i + 2]]
  277. elif in1 == '1':
  278. v2 = liste[i + 2]
  279. elif in1 == '2':
  280. v2 = liste[liste[i + 2] + relative_base]
  281.  
  282. if v1 == v2:
  283. if in0 == '0': liste[liste[i + 3]] = 1
  284. elif in0 == '1': liste[i + 3] = 1
  285. elif in0 == '2':
  286. try:
  287. liste[liste[i + 3] + relative_base] = 1
  288. except:
  289. memory_extend(liste[liste[i + 3] + relative_base])
  290. liste[liste[i + 3] + relative_base] = 1
  291. elif v1 != v2:
  292. if in0 == '0': liste[liste[i + 3]] = 0
  293. elif in0 == '1': liste[i + 3] = 0
  294. elif in0 == '2':
  295. try:
  296. liste[liste[i + 3] + relative_base] = 0
  297. except:
  298. memory_extend(liste[liste[i + 3] + relative_base])
  299. liste[liste[i + 3] + relative_base] = 0
  300. i += 4
  301.  
  302. # OPCODE 9
  303. def op_relative(in1):
  304. global i
  305. global relative_base
  306. if in1 == '0':
  307. relative_base += liste[liste[i+1]]
  308. elif in1 == '1':
  309. relative_base += liste[i+1]
  310. elif in1 == '2':
  311. relative_base += liste[liste[i+1]+relative_base]
  312. else: print("Error op_relative", in1)
  313. i += 2
  314.  
  315. def val_instruct(in1, in2): # v1 erste Zahl nach operand xx z.B. 01, v2 zweite Zahlen nach 01
  316. global i
  317. global relative_base
  318. if in2 == '0':
  319. v1 = liste[liste[i + 1]]
  320. elif in2 == '1':
  321. v1 = liste[i + 1]
  322. elif in2 == '2':
  323. v1 = liste[liste[i + 1]+relative_base]
  324. else:
  325. print("ErrorA! ", in2)
  326. if in1 == '0':
  327. v2 = liste[liste[i + 2]]
  328. elif in1 == '1':
  329. v2 = liste[i + 2]
  330. elif in1 == '2':
  331. v2 = liste[liste[i + 2]+relative_base]
  332. else:
  333. print("ErrorB! ", in1)
  334. return v1, v2
  335.  
  336.  
  337. # Eigentlichs Herzstück des Int-Computers
  338. # bei optout wird ergebnis der Funktion zurückgegeben
  339. def int_comp(code1,code2):
  340. global i, inp_inst, loop, mode, relative_base, robo_color, robo_dir
  341. while True:
  342. # if int(str(liste[i])[-1]) in (1,2,7,8): print(i, liste[i:i+4])
  343. # elif int(str(liste[i])[-1]) in (5,6): print(i, liste[i:i+3])
  344. # elif int(str(liste[i])[-1]) in (3,4,9): print(i, liste[i:i+2])
  345. if liste[i] == 99:
  346. if mode == 'LOOP':
  347. loop = False
  348. return (code2)
  349. elif mode == 'TEST':
  350. break
  351. elif mode == 'ROBOT':
  352. break
  353. if liste[i] == 1:
  354. op_add(liste[i + 3], liste[liste[i + 1]], liste[liste[i + 2]])
  355. continue
  356. if liste[i] == 2:
  357. if liste[i+1] > len(liste): memory_extend(liste[i+1]+5)
  358. if liste[i+2] > len(liste): memory_extend(liste[i+2]+5)
  359. if liste[i+3] > len(liste): memory_extend(liste[i+3]+5)
  360. op_mult(liste[i + 3], liste[liste[i + 1]], liste[liste[i + 2]])
  361. continue
  362. if liste[i] == 3:
  363. if mode == "ROBOT":
  364. if grid[x][y] == 'B': op_in('I',0)
  365. elif grid[x][y] == ' ': op_in('I',1)
  366. else:
  367. if inp_inst == 0:
  368. inp_inst += 1
  369. op_in('I',code1) # bei der ersten Ansteuerung des Amplifiers wird der Initialwert aus dem 5-stelligen Code genommen
  370. elif inp_inst == 1:
  371. op_in('I',code2) # ab dem 2.Lauf wird immer der aktuelle Out-Wert (=Out-Wert des letzten Amplifier) genommen
  372. else:
  373. op_in('0',0)
  374. continue
  375. if liste[i] == 4:
  376. if mode == 'LOOP':
  377. erg = op_out('0')
  378. i += 2
  379. return (erg)
  380. elif mode == 'TEST':
  381. op_out('0')
  382. elif mode == 'ROBOT':
  383. op_out('0')
  384. continue
  385. if liste[i] == 5:
  386. op_true('0', '0')
  387. continue
  388. if liste[i] == 6:
  389. op_false('0', '0')
  390. continue
  391. if liste[i] == 7:
  392. op_less('0','0','0')
  393. continue
  394. if liste[i] == 8:
  395. op_equal('0','0','0')
  396. continue
  397. if liste[i] == 9:
  398. op_relative('0')
  399. continue
  400. if liste[i] > 4:
  401. instruct = str(liste[i])
  402. while len(instruct) < 5: instruct = '0' + instruct
  403. opcode = instruct[3:]
  404.  
  405. if opcode == '01':
  406. memory_check(instruct[0],[liste[i+3]+relative_base])
  407. value1, value2 = val_instruct(instruct[1], instruct[2]) #v1 erste Zahl nach 01, v2 zweite Zahlen nach 01
  408. if instruct[0] == '0': op_add(liste[i + 3], value1, value2)
  409. elif instruct[0] == '1': op_add(i+3, value1, value2)
  410. elif instruct[0] == '2': op_add(liste[i + 3] + relative_base, value1, value2)
  411. elif opcode == '02':
  412. memory_check(instruct[0], [liste[i + 3]+relative_base])
  413. value1, value2 = val_instruct(instruct[1], instruct[2]) #v1 erste Zahl nach 01, v2 zweite Zahlen nach 01
  414. if instruct[0] == '0': op_mult(liste[i + 3], value1, value2)
  415. elif instruct[0] == '1': op_mult(i+3, value1, value2)
  416. elif instruct[0] == '2': op_mult(liste[i + 3] + relative_base, value1, value2)
  417. elif opcode == '03':
  418. if mode == "ROBOT":
  419. if grid[x][y] == 'B':
  420. op_in('I', 0)
  421. elif grid[x][y] == ' ': op_in('I', 1)
  422. else:
  423. op_in(instruct[2],0)
  424. elif opcode == '04':
  425. if mode == 'LOOP':
  426. erg=op_out(instruct[2])
  427. return (erg)
  428. elif mode == 'TEST':
  429. op_out(instruct[2])
  430. elif mode == 'ROBOT':
  431. op_out(instruct[2])
  432. elif opcode == '05':
  433. op_true(instruct[1],instruct[2])
  434. elif opcode == '06':
  435. op_false(instruct[1],instruct[2])
  436. elif opcode == '07':
  437. op_less(instruct[0],instruct[1],instruct[2])
  438. elif opcode == '08':
  439. memory_check(instruct[2]+instruct[1]+instruct[0], [liste[i + 1], liste[i+2], liste[i+3]])
  440. op_equal(instruct[0],instruct[1],instruct[2])
  441. elif opcode == '09':
  442. memory_check(instruct[2], [liste[i + 1]+relative_base])
  443. op_relative(instruct[2])
  444. else: print ("Error OPCODE ", opcode)
  445.  
  446. # Einschränkung auf einen Testfall
  447. # test = [('9', '8', '7', '6', '5')]
  448. # combi = list(test)
  449. # print (combi)
  450.  
  451. #Advent11 Part1
  452. ergebnis = 0
  453. fields = []
  454. mode = 'ROBOT'
  455. relative_base = 0
  456. liste = liste_src
  457. robo_color = ' '
  458. robo_dir = 'O'
  459. i = 0
  460. x = 50; y = 50
  461.  
  462. gridline = []
  463. for j in range(1000):
  464. gridline.append("B")
  465. grid = []
  466. for j in range(1000):
  467. grid.append(list(gridline))
  468.  
  469.  
  470. int_comp(0, 0)
  471. print ('Ergebnis: ', ergebnis)
  472. print(fields)
  473. print(relative_base)
  474.  
  475. #Advent09 Part1 + Part2
  476. # ergebnis = 0
  477. # mode = 'TEST'
  478. # relative_base = 0
  479. # liste = liste_src
  480. # liste.append(0)
  481. # i = 0
  482. # int_comp(1,0)
  483.  
  484. #Advent 07
  485. # combi = make_combi('56789')
  486. # ergebnis = 0
  487. # mode = 'LOOP'
  488. # for a in combi:
  489. # out = 0
  490. # ind_AbisE = []
  491. # li_AbisE = []
  492. # loop = True
  493. # for b in a: # Initialer Start der Amplifier mit Startwert
  494. # i=0
  495. # inp_inst = 0 # Abfrge wg. Initialisierung der Amplifier
  496. # liste = liste_src
  497. # out=int_comp(int(b),out)
  498. # ind_AbisE.append(i) # Liste mit Indizes der einzelnen Amplifiers
  499. # li_AbisE.append(list(liste)) # Liste mit den aktuellen Werten der einzelnen Amplifiers
  500. # # print ('Amp:', len(ind_AbisE), 'Index:', i, 'Out:', out, 'Liste:', liste)
  501. #
  502. # amp=0
  503. # while loop: # Laufender Betrieb der Amplifier mit Output von vorherigem Amplifier bis Ende mit 99 erreicht bei Amplifier E
  504. # i=ind_AbisE[amp]
  505. # liste=list(li_AbisE[amp])
  506. # out=int_comp(int(a[amp]),out)
  507. # ind_AbisE[amp]=i
  508. # li_AbisE[amp]=list(liste)
  509. # # print('Amp:', amp+1, 'Index:', i, 'Out:', out, 'Liste:', liste)
  510. #
  511. # if loop == False and amp == 4:
  512. # break
  513. # else:
  514. # loop = True
  515. # ind_AbisE[amp] = i
  516. # li_AbisE[amp] = list(liste)
  517. # if amp == 4:
  518. # amp = 0
  519. # else:
  520. # amp += 1
  521. #
  522. # if out > ergebnis:
  523. # ergebnis = out
  524. # ergebnis_combi = a
  525. #
  526. # print (ergebnis)
  527. # print (ergebnis_combi)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement