-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcode_only.py
More file actions
executable file
·107 lines (93 loc) · 2.35 KB
/
code_only.py
File metadata and controls
executable file
·107 lines (93 loc) · 2.35 KB
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
#! /usr/bin/env python3
import random
from bs4 import BeautifulSoup
# Hi judges!
#
# If you're just looking to skim
# read, the basic idea here is
# that the comments in this file
# encode a maze that contains an
# HTML document with the
# competition output in the title.
# The program loads its own source
# code, solves the maze using a
# DFS and stores any non-maze
# characters it encounters in a
# buffer. The buffer is then
# parsed with Beautiful Soup, and
# the title extracted and printed.
#
# Thanks for a great PyConline!
message = []
def is_wall(x, y, maze):
return maze[y][x] != ' '
def is_end(cell, maze):
# Checks if cell is bottom-
# right-most cell (i.e. the
# end!)
x, y = cell
max_x = len(maze[0])
max_y = len(maze)
return ((x+2 == max_x) and
(y+2 == max_y))
def dfs(maze, visit_fn):
# Run a DFS over the maze,
# starting in the top-left
# cell.
fringe = [(1, 1)]
seen = set()
while len(fringe) > 0:
c = fringe.pop()
x, y = c
if c in seen:
continue
seen.add(c)
visit_fn(c, maze)
if is_end(c, maze):
return
ns = neighbours(c, maze)
for n in ns:
fringe.append(n)
def write_cell(cell, maze):
# Add the cell to the buffer
# if it's not blank.
x, y = cell
if maze[y][x] not in ' █':
message.append(maze[y][x])
def neighbours(cell, maze):
# Neighbours are expanded in a
# clockwise fashion. We don't
# need to worry about range-
# checking the indices as the
# maze already contains a one
# character safety border on
# all sides.
x, y = cell
if maze[y-1][x] == ' ':
yield (x, y-2)
if maze[y][x+1] == ' ':
yield (x+2, y)
if maze[y+1][x] == ' ':
yield (x, y+2)
if maze[y][x-1] == ' ':
yield (x-2, y)
# Read in program source code
f = open('rube_codeberg.py', 'r')
maze = f.readlines()
f.close()
# Extract maze
for i, line in enumerate(maze):
maze[i] = line.split('#')[-1]
maze[i] = list(maze[i])
# Solve maze
dfs(maze, write_cell)
# Filter out decorative characters
# and parse resulting HTML.
message = (''.join(message)
.replace('.', ' ')
.replace('"', '')
.replace('^', '')
.rstrip())
soup = BeautifulSoup(message,
'html.parser')
print(soup.title.string)