eval() is slow and not safe to use against not previously checked input.
This commit is contained in:
@@ -2,6 +2,25 @@
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
|
|
||||||
|
def parse(line):
|
||||||
|
if ',' not in line:
|
||||||
|
return int(line)
|
||||||
|
line = line[1:-1]
|
||||||
|
level = 0
|
||||||
|
split_idx = 0
|
||||||
|
for i, c in enumerate(line):
|
||||||
|
if '[' == c:
|
||||||
|
level += 1
|
||||||
|
elif ']' == c:
|
||||||
|
level -= 1
|
||||||
|
elif 0 == level and ',' == c:
|
||||||
|
split_idx = i
|
||||||
|
break
|
||||||
|
left = parse(line[:split_idx])
|
||||||
|
right = parse(line[split_idx + 1:])
|
||||||
|
return (left, right)
|
||||||
|
|
||||||
|
|
||||||
def explode_to_left(n, l):
|
def explode_to_left(n, l):
|
||||||
(left, right) = n
|
(left, right) = n
|
||||||
res = True
|
res = True
|
||||||
@@ -104,11 +123,10 @@ def part_1(input):
|
|||||||
n = None
|
n = None
|
||||||
for line in input:
|
for line in input:
|
||||||
line = line.rstrip()
|
line = line.rstrip()
|
||||||
nn = eval(line.replace('[', '(').replace(']', ')'))
|
|
||||||
if not n:
|
if not n:
|
||||||
n = nn
|
n = parse(line)
|
||||||
continue
|
continue
|
||||||
n = (n, nn)
|
n = (n, parse(line))
|
||||||
res = True
|
res = True
|
||||||
while res:
|
while res:
|
||||||
while res:
|
while res:
|
||||||
@@ -122,7 +140,8 @@ def part_2(input):
|
|||||||
result = 0
|
result = 0
|
||||||
nbrs = set()
|
nbrs = set()
|
||||||
for line in input:
|
for line in input:
|
||||||
nbrs.add(eval(line.rstrip().replace('[', '(').replace(']', ')')))
|
line = line.rstrip()
|
||||||
|
nbrs.add(parse(line))
|
||||||
for n1 in nbrs:
|
for n1 in nbrs:
|
||||||
for n2 in nbrs:
|
for n2 in nbrs:
|
||||||
if n1 == n2:
|
if n1 == n2:
|
||||||
|
|||||||
Reference in New Issue
Block a user