mirror of
https://github.com/Xevion/advent-of-code.git
synced 2025-12-06 01:14:18 -06:00
day 7, fetch.py fetching script WIP
This commit is contained in:
101
2018/day-7/input
Normal file
101
2018/day-7/input
Normal 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
117
2018/day-7/python/main.py
Normal 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
0
2018/day-8/input
Normal file
0
2018/day-8/python/main.py
Normal file
0
2018/day-8/python/main.py
Normal file
41
fetch.py
Normal file
41
fetch.py
Normal 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)
|
||||||
Reference in New Issue
Block a user