day 7, fetch.py fetching script WIP

This commit is contained in:
Xevion
2019-08-04 22:38:08 -05:00
parent 2cad385b9e
commit 8ed98b062a
5 changed files with 259 additions and 0 deletions

101
2018/day-7/input Normal file
View File

@@ -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.

117
2018/day-7/python/main.py Normal file
View File

@@ -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)

0
2018/day-8/input Normal file
View File

View File

41
fetch.py Normal file
View File

@@ -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)