days six and seven
This commit is contained in:
parent
a15dcf85cf
commit
f707aa0220
26
day06/day06.py
Normal file
26
day06/day06.py
Normal file
@ -0,0 +1,26 @@
|
||||
import re
|
||||
import argparse
|
||||
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("filename", help="the file from which to take data")
|
||||
args = parser.parse_args()
|
||||
|
||||
with open(args.filename, "r") as f: contents = f.read()
|
||||
|
||||
buffer = contents[:4]
|
||||
for (i, s) in enumerate(contents[3:]):
|
||||
buffer = buffer[1:] + s
|
||||
|
||||
print(buffer)
|
||||
if len(set(buffer)) == 4:
|
||||
print(i+4)
|
||||
break
|
||||
|
||||
buffer = contents[:14]
|
||||
for (i, s) in enumerate(contents[13:]):
|
||||
buffer = buffer[1:] + s
|
||||
|
||||
print(buffer)
|
||||
if len(set(buffer)) == 14:
|
||||
print(i+14)
|
||||
break
|
81
day07/day07.py
Normal file
81
day07/day07.py
Normal file
@ -0,0 +1,81 @@
|
||||
import re
|
||||
import argparse
|
||||
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("filename", help="the file from which to take data")
|
||||
args = parser.parse_args()
|
||||
|
||||
with open(args.filename, "r") as f: contents = f.read()
|
||||
|
||||
root = {"/": {}}
|
||||
pwd = ["/"]
|
||||
|
||||
for command in contents.split("$"):
|
||||
command = command.strip()
|
||||
current_directory = root
|
||||
for directory in pwd:
|
||||
current_directory = current_directory[directory]
|
||||
|
||||
if command.startswith("cd"):
|
||||
if "cd /" in command:
|
||||
pwd = ["/"]
|
||||
elif ".." in command:
|
||||
pwd.pop()
|
||||
else:
|
||||
pwd.append(command.split()[1])
|
||||
print("moved. now our location is {}", pwd)
|
||||
if command.startswith("ls"):
|
||||
for line in command.split("\n"):
|
||||
if line == "ls":
|
||||
continue
|
||||
else:
|
||||
line = line.split()
|
||||
if line[0] == "dir":
|
||||
if line[1] not in current_directory:
|
||||
current_directory[line[1]] = {}
|
||||
else:
|
||||
current_directory[line[1]] = int(line[0])
|
||||
# add to the directory listing
|
||||
pass
|
||||
print("a command: {}".format(command))
|
||||
|
||||
def size_of_listing(path):
|
||||
it = root
|
||||
for i in path: it = it[i]
|
||||
if isinstance(it, dict):
|
||||
s = 0
|
||||
for k, v in it.items():
|
||||
s += size_of_listing(path + [k])
|
||||
return s
|
||||
return it
|
||||
|
||||
def all_of_it(path, d):
|
||||
for k, v in d.items():
|
||||
if isinstance(v, dict):
|
||||
yield from all_of_it(path + [k], v)
|
||||
yield path + [k], size_of_listing(path + [k])
|
||||
|
||||
total_space = 70000000
|
||||
total_needed = 30000000
|
||||
space_used = size_of_listing(["/"])
|
||||
free_space = total_space-space_used
|
||||
required = total_needed - free_space
|
||||
|
||||
s=0
|
||||
for path, size in sorted(list(all_of_it(["/"], root["/"])), key=lambda x: x[1]):
|
||||
print("{} with size {}".format(path, size))
|
||||
if size < 100000:
|
||||
s += size
|
||||
print("total less than 100,000 is {}".format(s))
|
||||
for path, size in filter(
|
||||
lambda x: x[1] > required,
|
||||
sorted(
|
||||
list(
|
||||
all_of_it(["/"], root["/"])
|
||||
),
|
||||
key=lambda x: x[1]
|
||||
)
|
||||
):
|
||||
print("{} with size {}".format(path, size))
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user