Advertisement
EditorRUS

My god

Jul 16th, 2015
292
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.78 KB | None | 0 0
  1. from copy import deepcopy, copy
  2. from time import perf_counter
  3.  
  4. generator_size = 5 #X*2-1 x X*2-1
  5. LWH = generator_size*2-1
  6. gs = generator_size - 1
  7.  
  8. start_variant = 0
  9. possible_variants = 2**(gs*gs*generator_size)
  10. best_variant = 0
  11.  
  12. real_map = []
  13. group_map = []
  14.  
  15. dmodcoords = [ [1, 1, -1], [1, -1, 1], [1, -1, -1], [-1, 1, 1], [-1, 1, -1], [-1, -1, 1], [-1, -1, -1]]
  16.  
  17. def generate_maps():
  18. map_x = []
  19. map_y = []
  20. for x in range(LWH):
  21. map_x.append(0)
  22. for y in range(LWH):
  23. map_y.append(deepcopy(map_x))
  24. for z in range(LWH):
  25. real_map.append(deepcopy(map_y))
  26. group_map.append(deepcopy(map_y))
  27.  
  28. def odd_mirroring():
  29. for z in range(generator_size):
  30. for y in range(generator_size):
  31. for x in range(generator_size):
  32. for mods in dmodcoords:
  33. value = real_map[z][y][x]
  34. lx = gs - x
  35. ly = gs - y
  36. lz = gs - z
  37. nx = gs - lx * mods[2]
  38. ny = gs - ly * mods[1]
  39. nz = gs - lz * mods[0]
  40. real_map[nz][ny][nx] = value
  41.  
  42. def purge_maps():
  43. for z in range(LWH):
  44. for y in range(LWH):
  45. for x in range(LWH):
  46. real_map[z][y][x] = 0
  47. group_map[z][y][x] = 0
  48.  
  49. sx = gs**0
  50. sy = gs**1
  51. sz = gs**2
  52. half_map = gs
  53.  
  54. def generate_the_cross():
  55. for x in range(LWH):
  56. real_map[half_map][half_map][x] = 1
  57. for y in range(LWH):
  58. real_map[half_map][y][half_map] = 1
  59. for z in range(LWH):
  60. real_map[z][half_map][half_map] = 1
  61.  
  62. def generate_variant(variant):
  63. for z in range(generator_size):
  64. for y in range(generator_size-1):
  65. for x in range(generator_size-1):
  66. value = min(variant & 2**(sx*x+sy*y+sz*z), 1)
  67. real_map[z][y][x] = value
  68.  
  69. odd_mirroring()
  70.  
  71. def show_map():
  72. for z in range(LWH):
  73. print(str(z+1) + ':', end='\n')
  74. for y in range(LWH):
  75. for x in range(LWH):
  76. print(real_map[z][y][x], end=' ')
  77. print()
  78. print(end='\n\n')
  79.  
  80. def show_virtual_map():
  81. for z in range(LWH):
  82. print(str(z+1) + ':', end='\n')
  83. for y in range(LWH):
  84. for x in range(LWH):
  85. print(group_map[z][y][x], end=' ')
  86. print()
  87. print(end='\n\n')
  88.  
  89. def count_blocks():
  90. amount = 0
  91. for z in range(LWH):
  92. for y in range(LWH):
  93. for x in range(LWH):
  94. if (real_map[z][y][x]):
  95. amount += 1
  96. return amount
  97.  
  98. def bound_check(x, y, z):
  99. return (0<=x<LWH) and (0<=y<LWH) and (0<=z<LWH)
  100.  
  101. def make_group_map():
  102. group_id = 1
  103. dcoords = [ [1, 0, 0], [0, 1, 0], [-1, 0, 0], [0, -1, 0], [0, 0, 1], [0, 0, -1] ]
  104. whitelist = []
  105. blacklist = []
  106. coordinate = [0, 0, 0]
  107. new_coord = [0, 0, 0]
  108. local_whitelist = []
  109.  
  110. for z in range(LWH):
  111. for y in range(LWH):
  112. for x in range(LWH):
  113. if (real_map[z][y][x]):
  114. coordinate[0] = x
  115. coordinate[1] = y
  116. coordinate[2] = z
  117. whitelist.append(copy(coordinate))
  118. while(len(whitelist)):
  119. sx = whitelist[0][0]
  120. sy = whitelist[0][1]
  121. sz = whitelist[0][2]
  122. coordinate[0] = sx
  123. coordinate[1] = sy
  124. coordinate[2] = sz
  125. local_whitelist.append(copy(coordinate))
  126. group_map[sz][sy][sx] = group_id
  127. whitelist.remove(coordinate)
  128. while(True):
  129. lsx = local_whitelist[0][0]
  130. lsy = local_whitelist[0][1]
  131. lsz = local_whitelist[0][2]
  132. coordinate[0] = lsx
  133. coordinate[1] = lsy
  134. coordinate[2] = lsz
  135. for dp in dcoords:
  136. nx = lsx + dp[0]
  137. ny = lsy + dp[1]
  138. nz = lsz + dp[2]
  139. new_coord[0] = nx
  140. new_coord[1] = ny
  141. new_coord[2] = nz
  142. if (not bound_check(nx, ny, nz)): continue
  143. if (real_map[nz][ny][nx]):
  144. if (new_coord not in blacklist):
  145. if (not group_map[nz][ny][nx]):
  146. local_whitelist.append(copy(new_coord))
  147. group_map[nz][ny][nx] = group_id
  148. whitelist.remove(new_coord)
  149. blacklist.append(copy(new_coord))
  150. local_whitelist.remove(coordinate)
  151. blacklist.append(copy(coordinate))
  152. if (not len(local_whitelist)):
  153. break
  154. group_id += 1
  155.  
  156. def count_groups():
  157. groups_found = 0
  158. current_group_id = 0
  159. groups_info = []
  160. group_id = 0
  161. length = 0
  162. width = 0
  163. height = 0
  164. size_sum = 0
  165. minx = LWH+1
  166. miny = LWH+1
  167. minz = LWH+1
  168. maxx = 0
  169. maxy = 0
  170. maxz = 0
  171.  
  172. blank = [0, minx, miny, minz, maxx, maxy, maxz]
  173. first = perf_counter()
  174. for z in range(LWH):
  175. for y in range(LWH):
  176. for x in range(LWH):
  177. groups_found = max(groups_found, group_map[z][y][x])
  178.  
  179. second = perf_counter()
  180. for group_id in range(groups_found+1):
  181. groups_info.append(deepcopy(blank))
  182.  
  183. third = perf_counter()
  184. for z in range(LWH):
  185. for y in range(LWH):
  186. for x in range(LWH):
  187. if (group_map[z][y][x]):
  188. group_id = group_map[z][y][x]-1
  189. groups_info[group_id][1] = min(groups_info[group_id][1], x)
  190. groups_info[group_id][2] = min(groups_info[group_id][2], y)
  191. groups_info[group_id][3] = min(groups_info[group_id][3], z)
  192. groups_info[group_id][4] = max(groups_info[group_id][4], x)
  193. groups_info[group_id][5] = max(groups_info[group_id][5], y)
  194. groups_info[group_id][6] = max(groups_info[group_id][6], z)
  195. fourth = perf_counter()
  196. for current_group_id in range(1, groups_found+1):
  197. length = groups_info[current_group_id-1][4] - groups_info[current_group_id-1][1]
  198. width = groups_info[current_group_id-1][5] - groups_info[current_group_id-1][2]
  199. height = groups_info[current_group_id-1][6] - groups_info[current_group_id-1][3]
  200.  
  201. size_sum = length + width + height
  202. groups_info[current_group_id-1][0] = size_sum
  203. fivth = perf_counter()
  204. second -= first
  205. third -= second
  206. fourth -= third
  207. fivth -= fourth
  208. print (second, third, fourth, fivth, sep = ' : ')
  209. return groups_info
  210.  
  211. def count_power():
  212. #Build group-map
  213. make_group_map()
  214.  
  215. total_blocks = count_blocks()
  216. groups_info = count_groups()
  217. sum_power = 0
  218. for group_sum in groups_info:
  219. sum_power += (group_sum[0]/3)**1.7
  220. block_power = 25 * total_blocks
  221. full_power = 2000000 / (1 + 1.00696**(-sum_power/3)) - 1000000 + block_power
  222. return full_power
  223.  
  224. generate_maps()
  225. generate_the_cross()
  226. best_power = 0
  227.  
  228. first = perf_counter()
  229. generate_variant(1034013)
  230. dt = perf_counter() - first
  231. print('Generate Variant: ', dt)
  232. first = perf_counter()
  233. make_group_map()
  234. dt = perf_counter() - first
  235. print('Make group map: ', dt)
  236. first = perf_counter()
  237. count_blocks()
  238. dt = perf_counter() - first
  239. print('Count blocks: ', dt)
  240. first = perf_counter()
  241. x = count_groups()
  242. dt = perf_counter() - first
  243. print('Count groups: ', dt)
  244. """
  245. for variant in range(possible_variants):
  246. generate_variant(variant)
  247. variant_power = count_power()
  248. if (best_power < variant_power):
  249. best_power = variant_power
  250. best_variant = variant
  251. print(best_variant, best_power, sep=' -- ')
  252. purge_maps()"""
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement