checker.py 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. #!/usr/bin/env python3
  2. from collections import Counter
  3. from math import sqrt, ceil
  4. import sys
  5. # from heapq import heappush, heappop
  6. FILE_IN = sys.argv[1]
  7. FILE_OUT = sys.argv[2]
  8. SCORE = 0
  9. lines = open(FILE_IN).read().splitlines()
  10. R, C, nb_drones, T, max_payload = map(int, lines[0].split())
  11. nb_types = int(lines[1])
  12. weights = map(int, lines[2].split())
  13. nb_warehouses = int(lines[3])
  14. coords_w = [None] * nb_warehouses
  15. stocks = [None] * nb_warehouses
  16. for w in range(nb_warehouses):
  17. coords_w[w] = list(map(int, lines[4 + 2 * w].split()))
  18. stocks[w] = list(map(int, lines[4 + 2 * w + 1].split()))
  19. nb_orders = int(lines[4 + 2 * nb_warehouses])
  20. coords_o = [None] * nb_orders
  21. request = [None] * nb_orders
  22. for o in range(nb_orders):
  23. coords_o[o] = list(map(int, lines[4 + 2 * nb_warehouses + 1 + 3 * o].split()))
  24. request[o] = Counter(map(int, lines[4 + 2 * nb_warehouses + 1 + 3 * o + 2].split()))
  25. # All drones start at 0
  26. coords_d = [coords_w[0]] * nb_drones
  27. time_d = [-1] * nb_drones
  28. load_d = [Counter() for _ in range(nb_drones)]
  29. delivery_times = {}
  30. def dist(c1, c2):
  31. return sqrt(pow(c1[0] - c2[0], 2) + pow(c1[1] - c2[1], 2))
  32. def load(drone_id):
  33. return sum(nb * weights[product_type] for product_type, nb in enumerate(load_d[drone_id]))
  34. with open(FILE_OUT) as f:
  35. next(f)
  36. for line in f:
  37. if 'W' in line or 'U' in line:
  38. pass
  39. else:
  40. drone_id, command, place_id, product_type, quantity = map(lambda x: int(x) if x not in 'DL' else x, line.split())
  41. if command == 'L':
  42. time_d[drone_id] += ceil(dist(coords_d[drone_id], coords_w[place_id]))
  43. # TODO verify there is sufficient stock in warehouse
  44. coords_d[drone_id] = coords_w[place_id]
  45. load_d[drone_id][product_type] += quantity
  46. # TODO verify max_payload
  47. time_d[drone_id] += 1
  48. # print('Drone %d loads from warehouse %d at turn %d' % (drone_id, place_id, time_d[drone_id]))
  49. else:
  50. time_d[drone_id] += ceil(dist(coords_d[drone_id], coords_o[place_id]))
  51. coords_d[drone_id] = coords_o[place_id]
  52. # TODO verify order is respected
  53. load_d[drone_id][product_type] -= quantity
  54. request[place_id][product_type] -= quantity
  55. time_d[drone_id] += 1
  56. current_time = time_d[drone_id]
  57. delivery_times.setdefault(place_id, []).append(current_time)
  58. if all(quantity == 0 for quantity in request[place_id].values()):
  59. # print('Order %d is satisfied by drone %d at turn %d' % (place_id, drone_id, time_d[drone_id]))
  60. SCORE += ceil((T - max(delivery_times[place_id])) * 100 / T)
  61. print(FILE_OUT + "_" + str(SCORE))