Sean McLemon | Advent of Code

Home | Czech | Blog | GitHub | Advent Of Code | Notes


2016-12-08 - Two-Factor Authentication

(original .ipynb)
def rotate_column(c, by, grid):
    prev_column = [line[c] for line in grid]
    rows = len(grid)
    
    for r, col in enumerate(prev_column):
        grid[(r+by)%rows][c] = col

        
def rotate_row(r, by, grid):
    prev_row = [c for c in grid[r]]
    cols = len(prev_row)
    for c, col in enumerate(prev_row):
        grid[r][(c+by)%cols] = prev_row[c]
    
        
def rect(width, height, grid):
    for r in range(height):
        for c in range(width):
            grid[r][c] = "#"     

            
def parse_and_execute(line, grid):
    if line[:4] == "rect":
        _, size = line[4:].split(" ")
        width, height = size.split("x")
        rect(int(width), int(height), grid)
        return True
    
    elif line[:10] == "rotate row":
        r, by = line[13:].split(" by ")
        rotate_row(int(r), int(by), grid)
        return True
        
    elif line[:10] == "rotate col":
        c, by = line[16:].split(" by ")
        rotate_column(int(c), int(by), grid)
        return True
        
    return False
puzzle_input_str = open("puzzle_input/day8.txt").read()

test_input_str = """rect 3x2
rotate column x=1 by 1
rotate row y=0 by 4
rotate column x=1 by 1"""

rows = 6
cols = 50


def execute_draw_instructions(instructions):
    grid = []
    for line in range(rows):
        grid.append([" "] * cols)        
    
    for l, line in enumerate(instructions):
        if not parse_and_execute(line, grid):
            raise Exception(f"weird input at line {l}: {line}")
    
    return grid


def part_one(input_str):
    grid = execute_draw_instructions(input_str.split("\n"))
    return sum(
        sum(1 for c in row if c == "#")
        for row in grid
    )
 
    
assert 6 == part_one(test_input_str)
    
print("part one:", part_one(puzzle_input_str))
part one: 106
def part_two(input_str):
    grid = execute_draw_instructions(input_str.split("\n"))
    
    for row in grid:
        yield "".join(row)
        
print("part two:\n\n" + "\n".join(part_two(puzzle_input_str)))
part two:

 ##  #### #    #### #     ##  #   #####  ##   ### 
#  # #    #    #    #    #  # #   ##    #  # #    
#    ###  #    ###  #    #  #  # # ###  #    #    
#    #    #    #    #    #  #   #  #    #     ##  
#  # #    #    #    #    #  #   #  #    #  #    # 
 ##  #    #### #### ####  ##    #  #     ##  ###