Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from typing import Text, List, Dict, Iterable
- from collections import Counter
- class Layers(object):
- def __init__(self, width: int, height: int, data: List[int]):
- self.layers = []
- self.width = width
- self.height = height
- self.parse_encoded_data(data)
- def parse_encoded_data(self, data: List[int]):
- lines = [data[i:i+self.width] for i in range(0, len(data), self.width)]
- assert len(lines) % self.height == 0
- [self.layers.append(lines[i:i+self.height]) for i in range(0, len(lines), self.height)]
- def generate_histograms(self) -> Iterable[Dict[int, int]]:
- """Get a histogram of pixel values per layer."""
- for layer in self.layers:
- yield Counter([x for y in layer for x in y])
- def find_part_1(self):
- least_zeros = min(self.generate_histograms(), key=lambda x: x.get(0, 0))
- return least_zeros.get(1) * least_zeros.get(2)
- def decode_image(self):
- if not self.layers:
- return
- final_image = self.layers[0]
- for layer in self.layers[1:]:
- final_image = [[a if a != 2 else b for a, b in zip(x, y)] for x, y in zip(final_image, layer)]
- return final_image
- def main():
- pixels = open("day8.data").readlines()[0].strip()
- layers = Layers(25, 6, [int(x) for x in pixels])
- print(layers.find_part_1())
- for x in layers.decode_image():
- print("".join(["X" if y else " " for y in x]))
- if __name__ == '__main__':
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement