1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
#!/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(coords):
if coords in x3:
return
x3[coords] = False
if coords[1]+1 < linelen*3:
if (coords[0], coords[1]+1) not in x3:
fillstack.append((coords[0], coords[1]+1))
if coords[1]-1 >= 0:
if (coords[0], coords[1]-1) not in x3:
fillstack.append((coords[0], coords[1]-1))
if coords[0]+1 < numlines*3:
if (coords[0]+1, coords[1]) not in x3:
fillstack.append((coords[0]+1, coords[1]))
if coords[0]-1 >= 0:
if (coords[0]-1, coords[1]) not in x3:
fillstack.append((coords[0]-1, coords[1]))
while len(fillstack) > 0:
fill(fillstack.pop())
def visx3():
for line in range(numlines*3):
for column in range(linelen*3):
if (line, column) not in x3:
print(".", end="")
else:
if x3[(line), column] == True:
print("x", end="")
else:
print("@", end="")
print()
count = 0
for line in range(numlines):
for column in range(linelen):
if (line*3+1, column*3+1) not in x3:
count += 1
print(count)
|