#!/usr/bin/env python3 import math print("#hashcode2016") X = 0 # Nb rows Y = 0 # Nb columns D = 0 # Nb drones T = 0 # Deadline M = 0 # Maximum load P = 0 # Nb products W = 0 # Nb warehouses C = 0 # Nb customers t = 0 # Turn Dp = []; # Positions of drones # (x, y) Di = []; # Items of drones # {product number: qt} Dd = []; # Turn avaibility of drone # int Da = []; # Avaibles drones # int Pw = []; # Weight of products # int Wp = []; # Positions of warehouses # (x, y) Wi = []; # Items of warehouses # {product number: qt} Cp = []; # Positions of customers # (x, y) Ci = []; # Needs of customers # {product number: qt} Out = '' # Drones commands # Debug assert(len(Dp) == len(Di) == len(Dd) == len(Da) == D) assert(len(Pw) == P) assert(len(Wp) == len(Wi) == W) assert(len(Cp) == len(Ci) == C) #def droneInfos(d): # print("- Drone", d, "carries", ", ".join([p + ": " + q + "×" + Dw[p] for def showGrid(): for y in range(Y): for x in range(X): if (x, y) in Wp: print("W", end="") if (x, y) in Cp: print("C", end="") else: print("·", end="") # Utilities def distance(A, B): return math.ceil(sqrt(pow((B[0] - A[0], 2) + pow(B[1] - A[1], 2)))) def weight(d): return sum([Pw[i] for i in Di[d]]) # Actions def load(d, w, p, q): # drone number, warehouse, product, qt assert(d in Da) if (Dp[d] != Wp[w]): Dd[d] += distance(Dp[d], Wp[w]) Wi[w][p] += -q Di[d][p] += +q assert(Wp[w][p] >= 0) assert(weight(d) <= M) assert(Dd[d] <= T); print("Drone", d, "loads", q, "of", p, "from warehouse", w, "→", Dd[d]) def unload(d, w, p, q): # drone number, warehouse, product, qt assert(d in Da) if (Dp[d] != Wp[w]): Dd[d] += distance(Dp[d], Wp[w]) Wi[w][p] += +q Di[d][p] += -q assert(Dd[d] <= T); print("Drone", d, "unloads", q, "of", p, "from warehouse", w, "→", Dd[d]) def deliver(d, c, p, q): # drone number, customer, product, qt assert(d in Da) if (Dp[d] != Cp[c]): Dd[d] += distance(Dp[d], Cp[c]) Ci[w][p] += +q Di[d][p] += -q Dd[d] += 1 assert(Dd[d] <= T); print("Drone", d, "delivers", q, "of", p, "to client", w, "→", Dd[d]) def wait(d, w=1): assert(d in Da) Dd[d] += w print("Drone", d, "waits", w, "turn" + ('s' if w >= 2 else ''), "→", Dd[d]) # Control def newTurn(): t += 1 print("--- Turn", t) for d in Da: wait(d) assert(len(Da) == 0) for d in range(D): if Dd[d] <= t: Da.push(d) print("Drones", ", ".join(Da), "(", len(Da), ")", "are avaible") def end(): print("--- End!") # IA