Post

Resolviendo Advent of Code 2015, Día 1: Not Quite Lisp

Desde que descubrí Advent of Code, me he propuesto resolver todos sus acertijos para cada año. En esta serie de blogs, no solo proporcionaré las soluciones, sino también breves explicaciones con su código. Comenzando con el evento Advent of Code 2015, empecemos con Day 1: Not Quite Lisp.

Manejando la entrada

Para simplificar la implementación de ambas partes, crearemos una función llamada read_input que lea el archivo de entrada y lo convierta en una estructura de datos conveniente. Dado que la solución de entrada para este día solo consta de una única línea de caracteres, la función read_input se verá así:

1
2
3
4
5
6
def read_input(file):
    s = []
    with open(file) as f:
        for c in f.read():
            s.append(c)
    return s

Parte 1

Nuestro input del acertijo consistirá en una cadena de paréntesis. Un paréntesis de apertura, (, significa que Santa debe subir un piso, mientras que un paréntesis de cierre, ), indica que debe bajar un piso. Para determinar el piso al que las instrucciones llevan a Santa, sigue estos sencillos pasos: itera sobre la cadena de paréntesis y suma 1 a una variable si el carácter actual es (. Y resta 1 al encontrar un ). . He creado un diccionario que mapea (, ) a 1 y -1 respectivamente. Por lo tanto, la solución de la primera parte es:

1
2
3
4
5
6
7
def solve(input):
    instruction = {'(': 1, ')': -1}
    sum = 0
    pos = 0
    for i, c in enumerate(input):
        sum += instruction[c]
    return sum

Parte 2

Dadas las mismas instrucciones, ahora tenemos la tarea de encontrar la posición del carácter que hace que Santa entre al sótano por primera vez. Para lograr esto, crearemos una nueva variable llamada pos (para posición). Ten en cuenta que cuando la posición del piso se convierte en -1, debemos sumar el índice i a pos. Al hacerlo, es sencillo combinar la solución para ambas partes. La solución de la segunda parte es:

1
2
3
4
5
6
7
8
9
def solve(input):
    instruction = {'(': 1, ')': -1}
    sum = 0
    pos = 0
    for i, c in enumerate(input):
        sum += instruction[c]
        if sum == -1 and pos == 0:
            pos = i + 1
    return sum, pos

Finalmente, puedes encontrar el código fuente completo aquí. Espero que te sea de utilidad y no dudes en comentar tus sugerencias.

This post is licensed under CC BY 4.0 by the author.