summaryrefslogblamecommitdiffstats
path: root/prog/aoc/23/10/}
blob: 96ac7277d1435acc59aea31657434c6fb9768bc8 (plain) (tree)



























































































                                                                                                       
#!/usr/bin/python3
from mmap import mmap
from sys import argv
file = open(argv[1], "r+b")
b = mmap(file.fileno(), 0)
linelen = b.find(b'\n')+1
numlines = len(b)/linelen
S = b.find(b'S')
def korak(idx, camefrom):
	if chr(b[idx]) in ['S', "-", "J", "7"]:
		if idx%linelen != 0:
			if chr(b[idx-1]) in ["-", "L", "F", "S"]:
				if camefrom != idx-1:
					return idx-1
	if chr(b[idx]) in ['S', "-", "F", "L"]:
		if idx%linelen != -2%linelen:
			if chr(b[idx+1]) in ["-", "J", "7", "S"]:
				if camefrom != idx+1:
					return idx+1
	if chr(b[idx]) in ['S', "|", "F", "7"]:
		if idx//linelen != linelen-1:
			if chr(b[idx+linelen]) in ["|", "L", "J", "S"]:
				if camefrom != idx+linelen:
					return idx+linelen
	if chr(b[idx]) in ['S', "|", "J", "L"]:
		if idx//linelen != 0:
			if chr(b[idx-linelen]) in ["|", "F", "7", "S"]:
				if camefrom != idx-linelen:
					return idx-linelen
pos = S
prev = -1
numsteps = 0
tiles = []
while numsteps == 0 or pos != S:
	pos, prev = korak(pos, prev), pos
	# print("korak iz ", prev//linelen, ", ", prev%linelen, "na ", pos//linelen, ", ", pos%linelen)
	tiles.append(pos)
	numsteps += 1
print(numsteps//2)
print(tiles)
larger = max(tiles[0], tiles[-2])
smaller = min(tiles[0], tiles[-2])
print(smaller, larger, S)
schar = None
if larger-smaller == 2:
	schar = "-"
if larger-smaller == 2*linelen:
	schar = "|"
if smaller+linelen+1 == larger:
	if smaller == S-1:
		schar = "7"
	else:
		schar = "L"
if smaller+linelen-1 == larger:
	if smaller == S+1:
		schar = "F"
	else:
		schar = "J"
x3 = {}
def postavi(pos):
	line = pos//linelen
	column = pos%linelen
	x3[(line*3+1, column*3+1)] = True
	znak = chr(b[pos])
	if pos == S:
		znak = schar
	match znak:
		case "-":
			x3[(line*3+1, column*3+1+1)] = True
			x3[(line*3+1, column*3+1-1)] = True
		case "|":
			x3[(line*3+1+1, column*3+1)] = True
			x3[(line*3+1-1, column*3+1)] = True
		case "L":
			x3[(line*3+1-1, column*3+1)] = True
			x3[(line*3+1, column*3+1+1)] = True
		case "J":
			x3[(line*3+1-1, column*3+1)] = True
			x3[(line*3+1, column*3+1-1)] = True
		case "7":
			x3[(line*3+1+1, column*3+1)] = True
			x3[(line*3+1, column*3+1-1)] = True
		case "F":
			x3[(line*3+1+1, column*3+1)] = True
			x3[(line*3+1, column*3+1+1)] = True
for tile in tiles:
	postavi(tile)
fillstack = [(0, linelen-1)]
def fill():
	
while len(fillstack) > 0:
	fill(a.pop())