# -*- coding: utf-8 -*- """HashCode2022_张杰.ipynb Automatically generated by Colaboratory. Original file is located at https://colab.research.google.com/drive/1PiwWB2bonQgoAGp6woFuJhFi2qq0_aj7 """ from google.colab import drive drive.mount('/content/drive') from math import sqrt import matplotlib.pyplot as plt import numpy as np import os import math File_Directory = 'drive/MyDrive/polyhash/DataSet/' File_Name = 'a_an_example.in.txt' File_Path = File_Directory+File_Name DataSet = [line.strip().split() for line in open(File_Path, "r")] Score:int = 0 def is_number(s): try: float(s) return True except ValueError: pass try: import unicodedata unicodedata.numeric(s) return True except (TypeError,ValueError): pass return False def convertToFloat(DataSet): for i in range(len(DataSet)): for j in range(len(DataSet[i])): if is_number(DataSet[i][j]): DataSet[i][j] = float(DataSet[i][j]) return DataSet # convert data-set to float DataSet = convertToFloat(DataSet) def caculateDistance(a: list, b: tuple): d = sqrt((a[0] - b[0])**2 + (a[1] - b[1])**2) return d def readLine(m = 0, n = 2, offset = 1): global DataSet lenth = int(DataSet[m][n]) line = [] for i in range(lenth): line.append(DataSet[i + offset]) return line class Person: def __init__(self, infomationLine): self.name, self.score, self.weightOfGift, self.x_position, self.y_position = infomationLine def getPosition(self): return (self.x_position, self.y_position) def getScore(self): global Score Score += self.score class People: info = [] def __init__(self): global DataSet line = readLine(m = 0, n = 3, offset = 1 + int(DataSet[0][2])) for i in line: self.info.append(Person(i)) def visualization(self): x = [] y = [] for i in self.info: x.append(i.x_position) y.append(i.y_position) plt.plot(x, y, 'o') plt.show() class Santa: position = [0.0,0.0] speed = [0.0,0.0] weightOfCarrots:int = 0 weightOfGift:int = 0 def __init__(self): global DataSet self.timeLimit = int(DataSet[0][0]) self.deliveryDistanceLimit = int(DataSet[0][1]) self.speedLimitTable = readLine() def getPosition(self): return self.position def getWeight(self): return self.weightOfCarrots + self.weightOfGift def nowSpeedLimit(self): w = self.getWeight() assert w >= 0 if w <= self.speedLimitTable[0][0]: return self.speedLimitTable[0][1] elif w > self.speedLimitTable[0][0] and w <= self.speedLimitTable[1][0]: return self.speedLimitTable[1][1] elif w > self.speedLimitTable[1][0] and w <= self.speedLimitTable[2][0]: return self.speedLimitTable[2][1] elif w > self.speedLimitTable[2][0] and w <= self.speedLimitTable[3][0]: return self.speedLimitTable[3][1] else: return 0 # DONE 此速度限制speedLimit为限制表不是当前限制,我们下一步要定义nowspeedLimit def isAllowedBySpeedLimit(self, s): return s <= self.nowSpeedLimit() def consumeCarrot(self): assert self.weightOfCarrots >= 1 self.weightOfCarrots -= 1 def AccUp(self, s): assert self.isAllowedBySpeedLimit(s) self.speed[1] += s self.consumeCarrot() def AccDown(self, s): assert self.isAllowedBySpeedLimit(s) self.speed[1] -= s self.consumeCarrot() def AccRight(self, s): assert self.isAllowedBySpeedLimit(s) self.speed[0] += s self.consumeCarrot() def AccLeft(self, s): assert self.isAllowedBySpeedLimit(s) self.speed[0] -= s self.consumeCarrot() def LoadCarrots(self, w): self.weightOfCarrots += w def LoadGift(self, w): self.weightOfGift += w def DiliveryGift(self,p: Person): assert caculateDistance(self.getPosition(), p.getPosition()) <= self.deliveryDistanceLimit self.weightOfGift -= p.weightOfGift assert self.weightOfGift >= 0 p.getScore() def Float(self, t:int = 1): self.position[0] += self.speed[0] * t self.position[1] += self.speed[1] * t self.timeLimit -= t def getSituation(self): print("Now position is:",self.position) print("Now speed is:",self.speed) print("Now timeLimit is:",self.timeLimit) print("Now weightOfGift is:",self.weightOfGift) print("Now weightOfCarrots is:",self.weightOfCarrots) def kidoneWay(self,x:int,p:Person): v = self.nowSpeedLimit() if isinstance(x/v,int) and x > 0: t = x/v self.AccUp(v) print("AccUp:",v) self.Float(t) print("Float:",t) self.AccDown(v) print("AccLeft:",v) self.Float() print("Float:",1) self.DiliveryGift(p) print("Delivert gift to",p.name) t = x/v self.AccDown(v) print("AccDown:",v) self.Float(t) print("Float:",t) self.AccUp(v) print("AccUp:",v) self.Float() print("Float:",1) elif isinstance(x/v,int) and x < 0: t = abs(x)/v self.AccDown(v) print("AccDown:",v) self.Float(t) print("Float:",t) self.AccUp(v) print("AccUp:",v) self.Float() print("Float:",1) self.DiliveryGift(p) print("Delivert gift to",p.name) t = abs(x)/v self.AccUp(v) print("AccUp:",v) self.Float(t) print("Float:",t) self.AccDown(v) print("AccDown:",v) self.Float() print("Float:",1) elif x < v and x > 0: v = x self.AccUp(v) print("AccUp:",v) self.Float() print("Float:",1) self.AccDown(v) print("AccDown:",v) self.Float() print("Float:",1) self.DiliveryGift(p) print("Delivert gift to",p.name) v = x self.AccDown(v) print("AccDown:",v) self.Float() print("Float:",1) self.AccUp(v) print("AccUp:",v) self.Float() print("Float:",1) elif abs(x) < v and x < 0: v = abs(x) self.AccDown(v) print("AccDown:",v) self.Float() print("Float:",1) self.AccUp(v) print("AccUp:",v) self.Float() print("Float:",1) self.DiliveryGift(p) print("Delivert gift to",p.name) v = x self.AccUp(v) print("AccUp:",v) self.Float() print("Float:",1) self.AccDown(v) print("AccDown:",v) self.Float() print("Float:",1) elif x > v and x > 0: t = x//v v1 = v - (x - t*v) self.AccUp(v) print("AccUp:",v) self.Float(t) print("Float:",t) self.AccDown(v1) print("AccDown:",v1) self.Float() print("Float:",1) self.AccDown(v - v1) print("AccDown:",v - v1) self.Float() print("Float:",1) self.DiliveryGift(p) print("Delivert gift to",p.name) t = x//v v1 = v - (x - t*v) self.AccDown(v) print("AccDown:",v) self.Float(t) print("Float:",t) self.AccUp(v1) print("AccUp:",v1) self.Float() print("Float:",1) self.AccUp(v - v1) print("AccUp:",v - v1) self.Float() print("Float:",1) elif abs(x) > v and x < 0: t = abs(x)//v v1 = v - (abs(x) - t*v) self.AccDown(v) print("AccDown:",v) self.Float(t) print("Float:",t) self.AccUp(v1) print("AccUp:",v1) self.Float() print("Float:",1) self.AccUp(v - v1) print("AccUp:",v - v1) self.Float() print("Float:",1) self.DiliveryGift(p) print("Delivert gift to",p.name) t = abs(x)//v v1 = v - (abs(x) - t*v) self.AccUp(v) print("AccUp:",v) self.Float(t) print("Float:",t) self.AccDown(v1) print("AccDown:",v1) self.Float() print("Float:",1) self.AccDown(v - v1) print("AccDown:",v - v1) self.Float() print("Float:",1) def oneWay(self, p:Person): self.LoadCarrots(12) print("LoarCarrots:12") self.LoadGift(p.weightOfGift) print("LoarGift:",p.weightOfGift) v = self.nowSpeedLimit() if isinstance(p.x_position/v,int) and p.x_position > 0: t = p.x_position/v self.AccRight(v) print("AccRight:",v) self.Float(t) print("Float:",t) self.AccLeft(v) print("AccLeft:",v) self.Float() print("Float:",1) self.kidoneWay(p.y_position,p) t = p.x_position/v self.AccLeft(v) print("AccLeft:",v) self.Float(t) print("Float:",t) self.AccRight(v) print("AccRight:",v) self.Float() print("Float:",1) elif isinstance(p.x_position/v,int) and p.x_position < 0: t = abs(p.x_position)/v self.AccLeft(v) print("AccLeft:",v) self.Float(t) print("Float:",t) self.AccRight(v) print("AccRight:",v) self.Float() print("Float:",1) self.kidoneWay(p.y_position,p) t = abs(p.x_position)/v self.AccRight(v) print("AccRight:",v) self.Float(t) print("Float:",t) self.AccLeft(v) print("AccLeft:",v) self.Float() print("Float:",1) elif p.x_position < v and p.x_position > 0: v = p.x_position self.AccRight(v) print("AccRight:",v) self.Float() print("Float:",1) self.AccLeft(v) print("AccLeft:",v) self.Float() print("Float:",1) self.kidoneWay(p.y_position,p) v = p.x_position self.AccLeft(v) print("AccLeft:",v) self.Float() print("Float:",1) self.AccRight(v) print("AccRight:",v) self.Float() print("Float:",1) elif abs(p.x_position) < v and p.x_position < 0: v = abs(p.x_position) self.AccLeft(v) print("AccLeft:",v) self.Float() print("Float:",1) self.AccRight(v) print("AccRight:",v) self.Float() print("Float:",1) self.kidoneWay(p.y_position,p) v = p.x_position self.AccRight(v) print("AccRight:",v) self.Float() print("Float:",1) self.AccLeft(v) print("AccLeft:",v) self.Float() print("Float:",1) elif p.x_position > v and p.x_position > 0: t = p.x_position//v v1 = v - (p.x_position - t*v) self.AccRight(v) print("AccRight:",v) self.Float(t) print("Float:",t) self.AccLeft(v1) print("AccLeft:",v1) self.Float() print("Float:",1) self.AccLeft(v - v1) print("AccLeft:",v - v1) self.Float() print("Float:",1) self.kidoneWay(p.y_position,p) t = p.x_position//v v1 = v - (p.x_position - t*v) self.AccLeft(v) print("AccLeft:",v) self.Float(t) print("Float:",t) self.AccRight(v1) print("AccRight:",v1) self.Float() print("Float:",1) self.AccRight(v - v1) print("AccRight:",v - v1) self.Float() print("Float:",1) elif abs(p.x_position) > v and p.x_position < 0: t = abs(p.x_position)//v v1 = v - (abs(p.x_position) - t*v) self.AccLeft(v) print("AccLeft:",v) self.Float(t) print("Float:",t) self.AccRight(v1) print("AccRight:",v1) self.Float() print("Float:",1) self.AccRight(v - v1) print("AccRight:",v - v1) self.Float() print("Float:",1) self.kidoneWay(p.y_position,p) t = abs(p.x_position)//v v1 = v - (abs(p.x_position) - t*v) self.AccRight(v) print("AccRight:",v) self.Float(t) print("Float:",t) self.AccLeft(v1) print("AccLeft:",v1) self.Float() print("Float:",1) self.AccLeft(v - v1) print("AccLeft:",v - v1) self.Float() print("Float:",1) else: self.kidoneWay(p.y_position,p) s = Santa() pp = People() s.oneWay(pp.info[2]) pp.visualization() s.LoadGift(10) pp.info[2].getPosition()