diff --git a/cli/seat.py b/cli/seat.py index ae43903..bd6fde3 100644 --- a/cli/seat.py +++ b/cli/seat.py @@ -5,55 +5,87 @@ from random import choice import sys import json -def load(): - with open('seats.txt','r',encoding="utf-8") as f: - seats = json.load(f) - return seats +class Seat(): + def __init__(self, seats=[]): + if len(seats) == 0: + self.seats = self.load() + self.requirements = self.load_requirements() + else: + self.seats = seats + self.requirements = self.load_requirements() -def save(seats): - with open('seats.txt','w',encoding="utf-8") as n: - n.write(str(seats)) + def load(self): + with open('seats.txt', 'r', encoding="utf-8") as f: + seats = json.load(f) + return seats + + def load_requirements(self): + req = dict() + with open('requirements.txt', 'w', encoding="utf-8") as req_f: + for user in self.query(): + if user['steps'].strip() != "": + req[str(user['no'])] = (user['no'], user['direction'], int(user['steps'])) + req_f.write("{0} {1} {2}\n".format(user['no'], user['direction'], int(user['steps']))) + return req -def query(): - client = MongoClient('127.0.0.1', 27017) - db = client['210-seats'] - collection = db['users'] + def save(self): + with open('seats.txt','w',encoding="utf-8") as n: + n.write(str(self.seats)) - data = collection.find().sort("no", ) - for user in data: - yield user + def query(self): + client = MongoClient('127.0.0.1', 27017) + db = client['210-seats'] + collection = db['users'] -def apply_requirements(seats, requirements): - funcs = {"f": shiftUp,"b": shiftDown, "l": shiftLeft, "r": shiftRight, "fr": shiftRightUp, "br": shiftRightDown, "fl": shiftLeftUp, "bl": shiftLeftDown} # f: forward, b: backward, l:left, r: right - name = {"f": "Forward","b": "Backward", "l": "Left", "r": "Right", "fr": "Right Forward", "br": "Right Backward", "fl": "Left Forward", "bl": "Left Backward"} - order = sorted([int(n) for n in requirements.keys()]) - luckier = choice(order) - print("Luckier: " + str(luckier) + "\n") - order = order[order.index(luckier):] + order[:order.index(luckier)] + data = collection.find().sort("no", ) + for user in data: + yield user - for req in order: - no, direction, steps = requirements[str(req)] - row,col = find(seats, no) - if col != None and row != None: - if direction in funcs.keys(): - funcs[direction](row, col, steps, seats) - print(no, name[direction], steps) - printArr(seats) - print() - return seats + def find(self, no, raw=False): + if raw: + modifier = 0 + else: + modifier = 1 # start from 0 -> start from 1 -def find(seats, no, raw=False): - if raw: - modifier = 0 - else: - modifier = 1 # start from 0 -> start from 1 + for y in range(len(self.seats)): + if no in self.seats[y]: + col = self.seats[y].index(no) + row = y + return (row + modifier, col + modifier) + return (None,None) + + def switch(self, one, two): + # one: the first person; two: the second person + pos_one = self.find(one, True) + pos_two = self.find(two, True) + self.seats[pos_one[0]][pos_one[1]], self.seats[pos_two[0]][pos_two[1]] = self.seats[pos_two[0]][pos_two[1]], self.seats[pos_one[0]][pos_one[1]] + + # logging switch + with open('switch.txt','a',encoding='utf-8') as log: + log.write("{} {}\n".format(str(one), str(two))) + + return ((one, pos_two), (two, pos_one)) # return the result + + def apply_requirements(self): + funcs = {"f": shiftUp, "b": shiftDown, "l": shiftLeft, "r": shiftRight, "fr": shiftRightUp, "br": shiftRightDown, "fl": shiftLeftUp, "bl": shiftLeftDown} # f: forward, b: backward, l:left, r: right + name = {"f": "Forward", "b": "Backward", "l": "Left", "r": "Right", "fr": "Right Forward", "br": "Right Backward", "fl": "Left Forward", "bl": "Left Backward"} + + order = sorted([int(n) for n in self.requirements.keys()]) + luckier = choice(order) + print("Luckier: " + str(luckier) + "\n") + order = order[order.index(luckier):] + order[:order.index(luckier)] + + for req in order: + no, direction, steps = self.requirements[str(req)] + row, col = self.find(no) + if col != None and row != None: + if direction in funcs.keys(): + funcs[direction](row, col, steps, self.seats) + print(no, name[direction], steps) + printArr(self.seats) + print() + return seats - for y in range(len(seats)): - if no in seats[y]: - col = seats[y].index(no) - row = y - return (row + modifier, col + modifier) - return (None,None) help_msg = '''Please provide mode! generate - generate a random seat @@ -70,61 +102,42 @@ if __name__ == "__main__": else: mode = sys.argv[1] if mode == "generate": - seats = generateSeats() - printArr(seats) - save(seats) + seats = Seat(generateSeats()) + printArr(seats.seats) + seats.save() print("Done!") elif mode == "run" or mode == "debug": - seats = load() + seats = Seat() print("Original:") - printArr(seats) - - # load requirements - requirements = dict() - with open('requirements.txt', 'w', encoding="utf-8") as req_f: - for user in query(): - if user['steps'].strip() != "": - requirements[str(user['no'])] = (user['no'], user['direction'], int(user['steps'])) - req_f.write("{0} {1} {2}\n".format(user['no'], user['direction'], int(user['steps']))) + printArr(seats.seats) - apply_requirements(seats, requirements) + seats.apply_requirements() print("Result:") - printArr(seats) + printArr(seats.seats) # save if mode == "run": - with open('seats.txt','w',encoding="utf-8") as n: - n.write(str(seats)) + seats.save() print("Done!") elif mode == "switch": - seats = load() + seats = Seat() one = int(sys.argv[2]) two = int(sys.argv[3]) - pos_one = find(seats, one, True) - pos_two = find(seats, two, True) - seats[pos_one[0]][pos_one[1]], seats[pos_two[0]][pos_two[1]] = seats[pos_two[0]][pos_two[1]], seats[pos_one[0]][pos_one[1]] + result = seats.switch(one, two) + for i in result: + print("{} postion {}".format(i[0], i[1])) - printArr(seats) - save(seats) - - # logging switch - log = open('switch.txt','a',encoding='utf-8') - log.write("{} {}\n".format(str(one), str(two))) - log.close() + printArr(seats.seats) + seats.save() elif mode == "export": - requirements = dict() - with open('requirements.txt', 'w', encoding="utf-8") as req_f: - for user in query(): - if user['steps'].strip() != "": - requirements[str(user['no'])] = (user['no'], user['direction'], int(user['steps'])) - req_f.write("{0} {1} {2}\n".format(user['no'], user['direction'], int(user['steps']))) - - print(requirements) + seats = Seat() + print(seats.requirements) elif mode == "print": - printArr(load()) + seats = Seat() + printArr(seats.seats) else: print(help_msg) - sys.exit(1) + sys.exit(1) \ No newline at end of file