From 8ed98b062a54493ac26be9bd9bdb665a631f77f2 Mon Sep 17 00:00:00 2001 From: Xevion Date: Sun, 4 Aug 2019 22:38:08 -0500 Subject: [PATCH] day 7, fetch.py fetching script WIP --- 2018/day-7/input | 101 ++++++++++++++++++++++++++++++++ 2018/day-7/python/main.py | 117 ++++++++++++++++++++++++++++++++++++++ 2018/day-8/input | 0 2018/day-8/python/main.py | 0 fetch.py | 41 +++++++++++++ 5 files changed, 259 insertions(+) create mode 100644 2018/day-7/input create mode 100644 2018/day-7/python/main.py create mode 100644 2018/day-8/input create mode 100644 2018/day-8/python/main.py create mode 100644 fetch.py diff --git a/2018/day-7/input b/2018/day-7/input new file mode 100644 index 0000000..35b8351 --- /dev/null +++ b/2018/day-7/input @@ -0,0 +1,101 @@ +Step F must be finished before step Q can begin. +Step A must be finished before step K can begin. +Step K must be finished before step R can begin. +Step D must be finished before step X can begin. +Step L must be finished before step T can begin. +Step V must be finished before step W can begin. +Step J must be finished before step N can begin. +Step B must be finished before step W can begin. +Step X must be finished before step C can begin. +Step W must be finished before step I can begin. +Step Q must be finished before step P can begin. +Step E must be finished before step M can begin. +Step C must be finished before step N can begin. +Step U must be finished before step O can begin. +Step O must be finished before step R can begin. +Step N must be finished before step Z can begin. +Step R must be finished before step I can begin. +Step G must be finished before step H can begin. +Step T must be finished before step H can begin. +Step M must be finished before step P can begin. +Step Y must be finished before step I can begin. +Step S must be finished before step Z can begin. +Step I must be finished before step H can begin. +Step H must be finished before step P can begin. +Step P must be finished before step Z can begin. +Step Y must be finished before step P can begin. +Step A must be finished before step O can begin. +Step V must be finished before step O can begin. +Step G must be finished before step Y can begin. +Step K must be finished before step B can begin. +Step I must be finished before step P can begin. +Step D must be finished before step L can begin. +Step A must be finished before step P can begin. +Step O must be finished before step T can begin. +Step F must be finished before step C can begin. +Step M must be finished before step S can begin. +Step V must be finished before step Q can begin. +Step G must be finished before step I can begin. +Step O must be finished before step I can begin. +Step N must be finished before step I can begin. +Step E must be finished before step O can begin. +Step N must be finished before step S can begin. +Step J must be finished before step H can begin. +Step C must be finished before step P can begin. +Step E must be finished before step N can begin. +Step T must be finished before step P can begin. +Step A must be finished before step G can begin. +Step A must be finished before step V can begin. +Step C must be finished before step H can begin. +Step A must be finished before step Y can begin. +Step E must be finished before step U can begin. +Step T must be finished before step Y can begin. +Step Q must be finished before step S can begin. +Step Y must be finished before step S can begin. +Step E must be finished before step P can begin. +Step N must be finished before step T can begin. +Step T must be finished before step M can begin. +Step Q must be finished before step M can begin. +Step H must be finished before step Z can begin. +Step D must be finished before step Y can begin. +Step J must be finished before step R can begin. +Step U must be finished before step R can begin. +Step K must be finished before step N can begin. +Step A must be finished before step W can begin. +Step A must be finished before step H can begin. +Step X must be finished before step G can begin. +Step V must be finished before step J can begin. +Step W must be finished before step C can begin. +Step I must be finished before step Z can begin. +Step V must be finished before step H can begin. +Step R must be finished before step H can begin. +Step U must be finished before step N can begin. +Step O must be finished before step Z can begin. +Step X must be finished before step S can begin. +Step E must be finished before step G can begin. +Step W must be finished before step U can begin. +Step U must be finished before step G can begin. +Step D must be finished before step Z can begin. +Step E must be finished before step R can begin. +Step L must be finished before step B can begin. +Step B must be finished before step R can begin. +Step G must be finished before step T can begin. +Step F must be finished before step K can begin. +Step R must be finished before step S can begin. +Step J must be finished before step Z can begin. +Step Q must be finished before step U can begin. +Step X must be finished before step O can begin. +Step F must be finished before step I can begin. +Step W must be finished before step R can begin. +Step W must be finished before step Y can begin. +Step M must be finished before step Y can begin. +Step S must be finished before step I can begin. +Step F must be finished before step O can begin. +Step C must be finished before step Y can begin. +Step N must be finished before step G can begin. +Step O must be finished before step S can begin. +Step Q must be finished before step O can begin. +Step K must be finished before step T can begin. +Step X must be finished before step Z can begin. +Step L must be finished before step N can begin. +Step S must be finished before step P can begin. \ No newline at end of file diff --git a/2018/day-7/python/main.py b/2018/day-7/python/main.py new file mode 100644 index 0000000..1af5579 --- /dev/null +++ b/2018/day-7/python/main.py @@ -0,0 +1,117 @@ +import os, sys, time, re, collections, string + +# Input file reading +path = os.path.join(sys.path[0], '..', 'input') +data = open(path, 'r').read().split('\n') +# data = """Step C must be finished before step A can begin. +# Step C must be finished before step F can begin. +# Step A must be finished before step B can begin. +# Step A must be finished before step D can begin. +# Step B must be finished before step E can begin. +# Step D must be finished before step E can begin. +# Step F must be finished before step E can begin.""".split('\n') + +# Constants and Setup +regexpattern = r"Step (\w) must be finished before step (\w) can begin." +def parse(item):match = re.match(regexpattern, item);return [match[1], match[2]] +data = list(map(parse, data)) +reqs = collections.defaultdict(list) +for before, after in data: + reqs[before] + reqs[after].append(before) +data = list(map(list, reqs.items())) + +COL_JOINER, COL_SECOND, COL_WORKER, COL_RESULT = ' ', 10, 8 , 26 + +class Factory(object): + def __init__(self, workers, data): + self.worker_count, self.data = workers, data + self.workers = [0 for _ in range(self.worker_count)] + self.working_jobs = [''] * self.worker_count + self.result = "" + self.duration = 0 + self._table = [] + header = [' Second'.center(COL_SECOND)] + header.extend([f'Worker {i+1}'.center(COL_WORKER) for i in range(self.worker_count)]) + header.append('Result'.ljust(COL_RESULT)) + self._table.append(COL_JOINER.join(header)) + self.loop() + + # returns the duration score value for a given step (char) + def get_duration(self, char): + return 60 + ( string.ascii_uppercase.find(char.upper()) + 1 ) + + @property + def active(self): + return len(self.data) > 0 or any([worker > 0 for worker in self.workers]) + + # Mainloop which is the driver code. + def loop(self): + # self.report([self.duration, self.result, self.working_jobs]) + self.tick() + while self.active: + self.report() + self.duration += 1 + self.tick() + self.report() + + @property + def available_jobs(self, all=False): + possible = [] + for i in range(len(self.data)): + # if no requirements left, make it a possible + if len(self.data[i][1]) == 0: + possibility = (i, self.data[i][0]) + if possibility[1] not in self.working_jobs: + possible.append( possibility ) + # sort alphabetical + possible.sort(key=lambda item : item[1]) + # [(INDEX, CHARACTER), (INDEX2, CHARACTER2)] + return possible + + # Removes char from all item values (does not remove key itself) + def cleanse(self, char): + def clean(item): + return item[0], [i for i in item[1] if i != char] + self.data = list(map(clean, self.data)) + + # dispatches a job and adds a duration to the worker + def dispatch(self, id): + choices = self.available_jobs + if len(choices) == 0: + return + else: + choice = choices.pop(0) + self.data.pop(choice[0]) + self.workers[id] = self.get_duration(choice[1]) + self.working_jobs[id] = str(choice[1]) + + def report(self): + second, result, jobs = list([self.duration, self.result, self.working_jobs]) + row = [str(second).center(COL_SECOND)] + for job in jobs: + row.append(('.' if job == '' else job).center(COL_WORKER)) + row.append(result.ljust(COL_RESULT)) + self._table.append(COL_JOINER.join(row)) + + @property + def table(self): + return '\n'.join(self._table) + + # Ticks a single second. Dispatches jobs to workers + def tick(self): + for i in range(len(self.workers)): + if self.workers[i] > 0: + self.workers[i] -= 1 + # Was working, is no longer. + if self.workers[i] == 0: + self.result += self.working_jobs[i] + self.cleanse(self.working_jobs[i]) + # I have no idea why, but settings self.working_jobs[i] = '' DOES NOT WORK. + self.working_jobs = ['' if index == i else item for index, item in enumerate(self.working_jobs)] + if self.workers[i] == 0: + self.dispatch(i) + +f = Factory(5, data) +print(f.table) +print(f.result, f.duration) \ No newline at end of file diff --git a/2018/day-8/input b/2018/day-8/input new file mode 100644 index 0000000..e69de29 diff --git a/2018/day-8/python/main.py b/2018/day-8/python/main.py new file mode 100644 index 0000000..e69de29 diff --git a/fetch.py b/fetch.py new file mode 100644 index 0000000..cb8f9ac --- /dev/null +++ b/fetch.py @@ -0,0 +1,41 @@ +import os, sys, requests, argparse + +parser = argparse.ArgumentParser( + description = 'Downloads the puzzle input from adventofcode.com, specified by Year and Day' +) +parser.add_argument('year', metavar=int, type=int, help='the year for the puzzle') +parser.add_argument('day', metavar=int, type=int, help='the day for the puzzle') +parser.add_argument('--log', default=sys.stdout, type=argparse.FileType('w'), help='log output') +args = parser.parse_args() + +year, day = args.year, args.day + +baseURL = lambda year, day : f'https://adventofcode.com/{year}/day/{day}/input' +baseFOLDER = lambda year, day : os.path.join(sys.path[0], f'{year}', f'day-{day}') +inputFile = 'input' + +languages = { + 'python' : ['main.py'] +} + + +url = baseURL(year, day) +folders = [baseFOLDER(year, day)] +files = [] + +for lang in languages.keys(): + folders.append( os.path.join(baseFOLDER(year, day), lang) ) + for file in languages[lang]: + files.append(os.path.join( baseFOLDER(year, day), lang, file )) + +for folder in folders: + if not os.path.exists(folder): + args.log.write(folder) + +for file in files: + if not os.path.exists(file): + args.log.write(file) + print(file) + +print(folders) +print(files) \ No newline at end of file