156 lines
3.9 KiB
Python
156 lines
3.9 KiB
Python
#!/bin/python3
|
|
import sys,re
|
|
from pprint import pprint
|
|
from functools import reduce
|
|
from operator import xor
|
|
|
|
input_f = 'input'
|
|
|
|
def list2int(x):
|
|
return list(map(int, x))
|
|
|
|
def toACSII(x):
|
|
for idx,i in enumerate(x):
|
|
x[idx] = ord(i)
|
|
return x
|
|
|
|
def XOR(x):
|
|
return reduce(xor, map(int, t))
|
|
|
|
part = 1
|
|
#########################################
|
|
# #
|
|
# Part 1 #
|
|
# #
|
|
#########################################
|
|
|
|
if part == 0:
|
|
|
|
size = 256
|
|
lengths = []
|
|
skip = 0
|
|
numbers = []
|
|
pos = 0
|
|
for i in range(0,size):
|
|
numbers.append(i)
|
|
|
|
with open(input_f) as file:
|
|
for line in file:
|
|
lengths = list2int(line.rsplit()[0].split(','))
|
|
|
|
for ldx, length in enumerate(lengths):
|
|
sub = [numbers[(pos + i) % len(numbers)] for i in range(length)]
|
|
rev = sub[::-1]
|
|
|
|
for i in range(length):
|
|
numbers[(pos + i) % len(numbers)] = rev[i]
|
|
|
|
pos += (length+skip)
|
|
pos = pos % len(numbers)
|
|
skip += 1
|
|
print(numbers[0]*numbers[1])
|
|
|
|
#########################################
|
|
# #
|
|
# Part 2 #
|
|
# #
|
|
#########################################
|
|
|
|
grid = []
|
|
|
|
if part == 1:
|
|
|
|
size = 256
|
|
lengths = []
|
|
skip = 0
|
|
original_numbers = []
|
|
pos = 0
|
|
total = 0
|
|
|
|
for i in range(0,size):
|
|
original_numbers.append(i)
|
|
|
|
with open(input_f) as file:
|
|
for line in file:
|
|
lengths = list(line.rsplit()[0].split()[0])
|
|
#print(lengths)
|
|
|
|
original_lengths = lengths
|
|
for x in range(0,128):
|
|
numbers = original_numbers[:]
|
|
lengths = []
|
|
skip = 0
|
|
pos = 0
|
|
lengths = original_lengths + ['-'] + list(str(x))
|
|
#print(lengths)
|
|
#lengths = ['A','o','C',' ','2','0','1','7']
|
|
|
|
lengths = toACSII(lengths) + [17, 31, 73, 47, 23]
|
|
#print('ACSII',lengths)
|
|
|
|
|
|
for i in range(0,64):
|
|
for ldx, length in enumerate(lengths):
|
|
sub = [numbers[(pos + i) % len(numbers)] for i in range(length)]
|
|
rev = sub[::-1]
|
|
|
|
for i in range(length):
|
|
numbers[(pos + i) % len(numbers)] = rev[i]
|
|
|
|
pos += (length+skip)
|
|
pos = pos % len(numbers)
|
|
skip += 1
|
|
dense = []
|
|
for j in range(0,16):
|
|
t = numbers[j*16:(j*16)+16]
|
|
dense.append(XOR(t))
|
|
#print(dense)
|
|
|
|
hexi = ''
|
|
|
|
for i in dense:
|
|
hexi += format(i, '02x')
|
|
|
|
#print(hexi)
|
|
binary = ''
|
|
for i in hexi:
|
|
binary += bin(int(i,16))[2:].zfill(4)
|
|
grid.append(list(binary))
|
|
|
|
#for i in hexi:
|
|
# print(' '.join(bin(ord(char))[2:] for char in i))
|
|
|
|
#print(binary)
|
|
total += binary.count('1')
|
|
print('Part 1:',total)
|
|
#input()
|
|
|
|
for i in range (0,8):
|
|
for j in range(0,8):
|
|
print(grid[i][j],end='')
|
|
print()
|
|
|
|
def count_blobs(grid):
|
|
rows,cols = len(grid), len(grid[0])
|
|
visited = [[False for _ in range(cols)] for _ in range(rows)]
|
|
directions = [(0,1),(0,-1),(1,0),(-1,0)]
|
|
|
|
def is_valid(x,y):
|
|
return 0 <= x < rows and 0 <= y < cols and not visited[x][y] and grid[x][y] == '1'
|
|
|
|
def dfs(x, y):
|
|
visited[x][y] = True
|
|
for dx, dy in directions:
|
|
nx, ny = x + dx, y + dy
|
|
if is_valid(nx, ny):
|
|
dfs(nx, ny)
|
|
|
|
blob_count = 0
|
|
for i in range(rows):
|
|
for j in range(cols):
|
|
if grid[i][j] == '1' and not visited[i][j]:
|
|
blob_count += 1
|
|
dfs(i, j)
|
|
return blob_count
|
|
|
|
print(count_blobs(grid)) |