1
0
Fork 0
advent2017/7/7p1.py

98 lines
2.3 KiB
Python
Executable File

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import copy
import json
#inputs = ["example.txt", "input.txt"]
#inputs = ["example.txt"]
inputs = ["input.txt"]
#inputs = ["n4z5Mtvk"]
def countlol(oix):
total = 0
total += oix.weight
for z in oix.children:
total += countlol(z)
return total
class program(object):
def __init__(self, name, weight, children = []):
self.name = name
self.weight = int(weight.replace('(', '').replace(')', ''))
self.children = children
def toJSON(self):
return json.dumps(self, default=lambda o: o.__dict__,
sort_keys=True, indent=4)
def __repr__(self):
return str(self.__dict__)
def search(programs, name):
for idx, val in enumerate(programs):
if val.name == name:
return idx
def solve(filename):
programs = []
tree = []
# read all items first
with open(filename, "r") as fp:
for line in fp:
val = line.strip().split(" ")
programs.append(program(val[0], val[1]))
# create tree
with open(filename, "r") as fp:
for line in fp:
val = line.strip().split(" ")
if len(val) > 2:
childs = []
for idx in range(3, len(val)):
name = val[idx].replace(',', '')
pidx = search(programs, name)
childs.append(copy.deepcopy(programs[pidx]))
del programs[pidx]
tree.append(program(val[0], val[1], childs))
indexes = {}
delete = []
#print(tree)
for idx, val in enumerate(tree):
indexes[val.name] = idx
for idx, val in enumerate(tree):
for cidx, child in enumerate(val.children):
if child.name in indexes:
tree[idx].children[cidx] = copy.deepcopy(tree[indexes[child.name]])
delete.append(indexes[child.name])
#del indexes[child.name]
#print(len(tree))
delete.sort(reverse=True)
for idx in delete:
del tree[idx]
#print(tree[0].toJSON())
#print(len(tree))
for c in tree[0].children:
for c2 in c.children:
print(c2.name, countlol(c2))
print()
return programs
for puzzle in inputs:
print(puzzle, solve(puzzle))