beacons = []
sensors = []
CoveredPoints = {}
maxcoord = 4000000

def loop(vectors):
    for j in range(len(vectors)):
        for i in range(len(vectors)):
            if j != i:
                if vectors[j][0] in range (vectors[i][0], vectors[i][1]) or vectors[i][0] in range (vectors[j][0], vectors[j][1]):
                    tempSt = min(vectors[j][0],vectors[i][0])
                    tempEn = max(vectors[j][1],vectors[i][1])
                    vectors.append((tempSt, tempEn))
                    vectors.pop(max(i, j))
                    vectors.pop(min(i, j))
                    return False, vectors
    return True, vectors

def loop2(vectors):
    if len(vectors) > 2:
        for i in range(len(vectors) - 1):
            if vectors[i][1] == vectors[i+1][0] or vectors[i][1] + 1== vectors[i+1][0]:
                vectors.append((vectors[i][0], vectors[i+1][1]))
                vectors.pop(i+1)
                vectors.pop(i)
                vectors = sorted(vectors)
                return False, vectors
    elif len(vectors) == 2:
        if vectors[0][1] == vectors[1][0] or vectors[0][1] + 1== vectors[1][0]:
            vectors = [(vectors[0][0], vectors[1][1])]
            return True, vectors
    return True, vectors

with open('input15.txt','r') as f:
    inp = f.read().splitlines(keepends=False)

for line in inp:
    tempA, tempB = line.split(': closest beacon is at x=')
    tempA = tempA.replace('Sensor at x=', '')
    tempA = tempA.split(', y=')
    sensors.append(tuple(map(int, tempA)))
    tempB = tempB.split(', y=')
    beacons.append(tuple(map(int, tempB)))



for i in range(len(sensors)):
    print('checking sensor', i, 'out of', len(sensors) - 1)
    (sensX, sensY) = sensors[i]
    (beacX, beacY) = beacons[i]
    distance = (max(sensX, beacX) - min(sensX, beacX)) + (max(sensY, beacY) - min(sensY, beacY))
    for j in range(distance + 1):
        CoveredPoints.setdefault((sensY-j), [])
        CoveredPoints.setdefault((sensY+j), [])
        CoveredPoints[sensY-j].append((sensX - (distance - j), sensX + (distance - j)))
        CoveredPoints[sensY+j].append((sensX - (distance - j), sensX + (distance - j)))


tempA = []

for vc in CoveredPoints:
    done = False
    vectors = CoveredPoints[vc].copy()
    while not done:
        done, vectors = loop(vectors)
    done = False
    vectors = sorted(vectors)
    while not done:
        done, vectors = loop2(vectors)
    CoveredPoints[vc] = vectors

for i in range(maxcoord + 1):
    line = CoveredPoints[i]
    if len(line) > 1:
        coordX = line[0][1] + 1
        coordY = i
        frequency = coordX * 4000000 + coordY

print('Beacon found y =',coordY,'x =',coordX,'frequency =', frequency)