diff options
Diffstat (limited to 'prog/aoc/23/10/}')
-rw-r--r-- | prog/aoc/23/10/} | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/prog/aoc/23/10/} b/prog/aoc/23/10/} new file mode 100644 index 0000000..96ac727 --- /dev/null +++ b/prog/aoc/23/10/} @@ -0,0 +1,92 @@ +#!/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()) |