#!/usr/bin/env python # Remove all instances of #1# to use the test rulebook # Remove all instances of #2# and #3# to see Part 1 interactively # Remove all instances of #2# and #4# to see Part 2 interactively rule_book = {} with open("/home/login/bin/advent17/input21.txt") as f: for line in f: key,value = tuple(line.split(" => ")) rule_book[key] = value[:-1] #1#rule_book = {"../.#": "##./#../...", ".#./..#/###": "#..#/..../..../#..#"} my_list = [".#.","..#","###"] my_iterated_list_p1 = [".#.","..#","###"] def make_key(my_list): my_key = '/'.join(my_list) return my_key def make_list(my_key): my_list = my_key.split("/") return my_list def rotated(my_list): my_new_list = [] num_of_cols = len(my_list[0]) num_of_rows = len(my_list) for j in range(num_of_cols): my_new_list.append([]) for i in range(num_of_rows): my_new_list[j].append(my_list[i][num_of_cols-1-j]) for k in range(num_of_cols): my_new_list[k] = ''.join(my_new_list[k]) return my_new_list def flipped(my_list): my_new_list = [] num_of_rows = len(my_list) for i in range(num_of_rows): my_new_list.append(my_list[num_of_rows-1-i]) return my_new_list def loose_matched(my_key): global rule_book my_test_key = my_key for i in [None]*2: for j in [None]*4: if my_test_key in rule_book: return rule_book[my_test_key] my_test_key = make_key(rotated(make_list(my_test_key))) my_test_key = make_key(flipped(make_list(my_test_key))) def split(my_list): my_group = [] my_size = len(my_list) if my_size%2 == 0: num_of_rows = num_of_cols = my_size//2 if num_of_rows == 1: return my_list for i in range(num_of_rows): my_group.append([]) for j in range(num_of_cols): my_group[i].append([]) for k in range(2): my_group[i][j].append(my_list[2*i+k][2*j:2*(j+1)]) else: #my_size is divisible by 3 num_of_rows = num_of_cols = my_size//3 if num_of_rows == 1: return my_list for i in range(num_of_rows): my_group.append([]) for j in range(num_of_cols): my_group[i].append([]) for k in range(3): my_group[i][j].append(my_list[3*i+k][3*j:3*(j+1)]) return my_group def joined(my_group): my_list = [] if len(my_group[0][0])==1: # singleton my_list = my_group else: my_row = "" my_group_size = len(my_group) my_sublist_size = len(my_group[0][0]) num_of_rows = num_of_cols = my_group_size for i in range(num_of_rows): for k in range(my_sublist_size): my_row = "" for j in range(num_of_cols): my_row += my_group[i][j][k] my_list.append(my_row) return my_list def mapped_group(function, my_group): my_new_group = [] if len(my_group[0][0])==1: # singleton my_new_group = function(my_group) else: my_size = len(my_group) num_of_rows = num_of_cols = my_size for i in range(num_of_rows): my_new_group.append([]) for j in range(num_of_cols): my_new_group[i].append(function(my_group[i][j])) return my_new_group def my_enhancement_function(my_list): my_key = make_key(my_list) my_enhanced_key = loose_matched(my_key) my_enhanced_list = make_list(my_enhanced_key) return my_enhanced_list def enhanced(my_list): my_group = split(my_list) my_enhanced_group = mapped_group(my_enhancement_function, my_group) return joined(my_enhanced_group) #2#def print_list(my_list): #2# print("") #2# for line in my_list: #2# print(line) #2# print("") #2#def print_group(my_group): #2# print("") #2# for row_of_lists in my_group: #2# for list_item in row_of_lists: #2# print_list(list_item) for i in [None]*5: my_iterated_list_p1 = enhanced(my_iterated_list_p1) #3# print_list(my_iterated_list_p1) #3# input() number_of_on_pixels = make_key(my_iterated_list_p1).count("#") print("Part 1: " + str(number_of_on_pixels)) my_iterated_list_p2 = my_iterated_list_p1 for i in [None]*13: my_iterated_list_p2 = enhanced(my_iterated_list_p2) #3# print_list(my_iterated_list_p1) #3# input() number_of_on_pixels = make_key(my_iterated_list_p2).count("#") print("Part 2: " + str(number_of_on_pixels))