Rincón Matemático

Disciplinas relacionadas y temas generales => Computación e Informática => Mensaje iniciado por: geómetracat en 13 Diciembre, 2021, 09:34 am

Título: Advent of Code 2021 Problema 13
Publicado por: geómetracat en 13 Diciembre, 2021, 09:34 am
Dejo aquí el enunciado traducido (por Google) de las dos partes de hoy (día 13) y mi solución.
Enlace: https://adventofcode.com/2021/day/13 (https://adventofcode.com/2021/day/13)

Parte 1:


--- Día 13: Origami transparente ---

Llegas a otra parte volcánicamente activa de la cueva. Sería bueno si pudiera hacer algún tipo de imagen térmica para poder saber con anticipación qué cuevas están demasiado calientes para entrar de manera segura.

¡Afortunadamente, el submarino parece estar equipado con una cámara térmica! Cuando lo activa, es recibido con:

Congratulations on your purchase! To activate this infrared thermal imaging
camera system, please enter the code found on page 1 of the manual.

Aparentemente, los Elfos nunca han usado esta función. Para su sorpresa, logra encontrar el manual; a medida que lo abre, la página 1 se cae. ¡Es una hoja grande de papel transparente ! El papel transparente está marcado con puntos aleatorios e incluye instrucciones sobre cómo doblarlo (la entrada del rompecabezas). Por ejemplo:

6,10
0,14
9,10
0,3
10,4
4,11
6,0
6,12
4,1
0,13
10,12
3,4
3,0
8,4
1,10
2,14
8,10
9,0

fold along y=7
fold along x=5

La primera sección es una lista de puntos en el papel transparente. 0,0representa la coordenada superior izquierda. El primer valor, xaumenta hacia la derecha. El segundo valor y, aumenta hacia abajo. Entonces, la coordenada 3,0está a la derecha de 0,0y la coordenada 0,7está debajo 0,0. Las coordenadas de este ejemplo forman el siguiente patrón, donde #hay un punto en el papel y .una posición vacía sin marcar:

...#..#..#.
....#......
...........
#..........
...#....#.#
...........
...........
...........
...........
...........
.#....#.##.
....#......
......#...#
#..........
#.#........

Luego, hay una lista de instrucciones de plegado . Cada instrucción indica una línea en el papel transparente y quiere que doble el papel hacia arriba (para y=...líneas horizontales ) o hacia la izquierda (para x=...líneas verticales ). En este ejemplo, la primera instrucción de plegado es fold along y=7, que designa la línea formada por todas las posiciones donde yestá 7(marcada aquí con -):

...#..#..#.
....#......
...........
#..........
...#....#.#
...........
...........
-----------
...........
...........
.#....#.##.
....#......
......#...#
#..........
#.#........

Debido a que esta es una línea horizontal, doble la mitad inferior hacia arriba . Algunos de los puntos pueden terminar superpuestos una vez que se completa el pliegue, pero los puntos nunca aparecerán exactamente en una línea de pliegue. El resultado de hacer este pliegue se ve así:

#.##..#..#.
#...#......
......#...#
#...#......
.#.#..#.###
...........
...........

Ahora, solo los 17puntos son visibles.

Observe, por ejemplo, los dos puntos en la esquina inferior izquierda antes de que se doble el papel transparente; una vez que se completa el pliegue, esos puntos aparecen en la esquina superior izquierda (en 0,0y 0,1). Debido a que el papel es transparente, el punto justo debajo de ellos en el resultado (en 0,3) permanece visible, como se puede ver a través del papel transparente.

También observe que algunos puntos pueden terminar superpuestos ; en este caso, los puntos se fusionan y se convierten en un solo punto.

La segunda instrucción de plegado es fold along x=5, que indica esta línea:

#.##.|#..#.
#...#|.....
.....|#...#
#...#|.....
.#.#.|#.###
.....|.....
.....|.....

Debido a que esta es una línea vertical, doble a la izquierda :

#####
#...#
#...#
#...#
#####
.....
.....

¡Las instrucciones formaron un cuadrado!

El papel transparente es bastante grande, así que, por ahora, concéntrate en completar el primer pliegue. Después del primer pliegue en el ejemplo anterior, los 17puntos son visibles: los puntos que terminan superpuestos después de que se completa el pliegue cuentan como un solo punto.

¿Cuántos puntos son visibles después de completar solo la primera instrucción de plegado en su papel transparente?




Parte 2:

--- La segunda parte ---

Termina de doblar el papel transparente según las instrucciones. El manual dice que el código siempre tiene ocho letras mayúsculas.

¿Qué código utiliza para activar el sistema de cámara termográfica por infrarrojos?



Mi solución:
Un poco cutre, pero funciona bien.
Código: [Seleccionar]
with open("input13.txt") as f:
    points, folds = [], []
    for line in f.readlines():
        if line[0] in '1234567890':
            points.append((int(line.split(',')[0]), int(line.split(',')[1])))
        elif line[:4] == 'fold':
            folds.append((line[11], int(line[13:])))

def plot(points):
    ncols = max([point[0] for point in points])+1
    nrows = max([point[1] for point in points])+1
    for i in range(nrows):
        print(''.join(['#' if (j,i) in points else '.' for j in range(ncols)]))
   
def do_fold(points, fold):
    new_points = []
    if fold[0] == 'x':
        for point in points:
            new_points.append(point) if point[0] < fold[1] else new_points.append((-(point[0]-fold[1])+fold[1], point[1]))
    if fold[0] == 'y':
        for point in points:
            new_points.append(point) if point[1] < fold[1] else new_points.append((point[0], -(point[1]-fold[1])+fold[1]))
    return list(set(new_points))

def iter_folds(points, folds):
    for fold in folds:
        points = do_fold(points, fold)
    return points

#Part 1
print(len(do_fold(points, folds[0])))

#Part 2
final_points = iter_folds(points, folds)
plot(final_points)