summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xprog/aoc/23/10/1.py123
-rw-r--r--prog/aoc/23/10/in.txt5
-rw-r--r--prog/aoc/23/10/}92
3 files changed, 220 insertions, 0 deletions
diff --git a/prog/aoc/23/10/1.py b/prog/aoc/23/10/1.py
new file mode 100755
index 0000000..a2e48e2
--- /dev/null
+++ b/prog/aoc/23/10/1.py
@@ -0,0 +1,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)
diff --git a/prog/aoc/23/10/in.txt b/prog/aoc/23/10/in.txt
new file mode 100644
index 0000000..3aea4dd
--- /dev/null
+++ b/prog/aoc/23/10/in.txt
@@ -0,0 +1,5 @@
+7-F7-
+.FJ|7
+SJLL7
+|F--J
+LJ.LJ
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())