#!/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())