Ver Fonte

Solve 2022 day 5 part 1

Jonatan Gezelius há 3 anos atrás
pai
commit
c8ee5a571f
3 ficheiros alterados com 613 adições e 0 exclusões
  1. 92 0
      2022/05/a.py
  2. 9 0
      2022/05/example.txt
  3. 512 0
      2022/05/infile.txt

+ 92 - 0
2022/05/a.py

@@ -0,0 +1,92 @@
+import os, argparse, re
+
+def solve_task(lines):
+    # Extract the initial stacks and instructions from the input
+    (stacks, raw_instructions) = load_stacks(lines)
+
+    #print(f"Stacks: {stacks}\n")
+    #print(f"Instructions: {raw_instructions}")
+    #display_stacks(stacks)
+
+    # Parse the instructions into a list of tuples
+    packed_instructions = pack_instructions(raw_instructions)
+    #print(f"Packed: {packed_instructions}")
+
+    # Perform all instructions
+    for instruction in packed_instructions:
+        perform_instruction(stacks, instruction)
+        #display_stacks(stacks)
+
+    # Get the answer by getting the uppermost (last) element of
+    # each stack. This way has side effects, but we won't need
+    # to preserve the stacks past this line.
+    print("Final answer: " + ''.join([s.pop() for s in stacks]))
+
+def display_stacks(stacks):
+    print("Current stacks:")
+    for stack in stacks:
+        print(''.join(stack))
+
+def perform_instruction(stacks, instruction):
+    quantity = int(instruction[0])
+    source = int(instruction[1]) - 1
+    destination = int(instruction[2]) - 1
+
+    # Since lists are mutable, we can manipulate the supplied lists
+    # instead of returning new ones
+    for _ in range(quantity):
+        stacks[destination].append(stacks[source].pop())
+
+def pack_instructions(instr):
+    # Return a list of instruction-tuples
+    return [get_instruction_tuple(i) for i in instr]
+    
+def get_instruction_tuple(intr_line):
+    # Returns a tuple with three values (quantity, source, destination)
+    m = re.match("move (\d+) from (\d+) to (\d+)", intr_line)
+    return (m.group(1), m.group(2), m.group(3))
+
+def load_stacks(lines):
+    number_of_piles = (len(lines[0])+1)//4
+    piles = [[] for x in range(number_of_piles)]
+    instructions_start_line = 0
+    for linum in range(len(lines)):
+        line = lines[linum]
+        for col in range(len(line)):
+            c = line[col]
+            if col % 4 != 1 or c == ' ':
+                continue
+            if c == '1':
+                instructions_start_line = linum+2
+                break
+            pile = col // 4
+            piles[pile].insert(0, c)
+
+        if instructions_start_line != 0:
+            break
+    return (piles, lines[instructions_start_line:])
+
+
+def read_lines(filename):
+    lines = []
+    with open(filename) as infile:
+        for raw_line in infile:
+            line = raw_line.replace('\n', '')
+            line = line.replace('\r', '')
+            #line = raw_line.rstrip() # Usefull to keep space in this task
+            lines.append(line)
+    return lines
+
+def parse_arguments():
+    parser = argparse.ArgumentParser(description="Script that solves the case",epilog="Have a nice day!")
+    parser.add_argument('filename', nargs='?', default="example.txt", help='Input file')
+    args = parser.parse_args()
+    return args
+
+def main():
+    args = parse_arguments()
+    lines = read_lines(args.filename)
+    solve_task(lines)
+
+if __name__ == "__main__":
+    main()

+ 9 - 0
2022/05/example.txt

@@ -0,0 +1,9 @@
+    [D]    
+[N] [C]    
+[Z] [M] [P]
+ 1   2   3 
+
+move 1 from 2 to 1
+move 3 from 1 to 3
+move 2 from 2 to 1
+move 1 from 1 to 2

+ 512 - 0
2022/05/infile.txt

@@ -0,0 +1,512 @@
+    [V] [G]             [H]        
+[Z] [H] [Z]         [T] [S]        
+[P] [D] [F]         [B] [V] [Q]    
+[B] [M] [V] [N]     [F] [D] [N]    
+[Q] [Q] [D] [F]     [Z] [Z] [P] [M]
+[M] [Z] [R] [D] [Q] [V] [T] [F] [R]
+[D] [L] [H] [G] [F] [Q] [M] [G] [W]
+[N] [C] [Q] [H] [N] [D] [Q] [M] [B]
+ 1   2   3   4   5   6   7   8   9 
+
+move 3 from 2 to 5
+move 2 from 9 to 6
+move 4 from 7 to 1
+move 7 from 3 to 4
+move 2 from 9 to 8
+move 8 from 8 to 6
+move 1 from 7 to 4
+move 8 from 6 to 4
+move 4 from 5 to 7
+move 3 from 4 to 9
+move 2 from 6 to 3
+move 11 from 4 to 1
+move 1 from 3 to 4
+move 2 from 3 to 1
+move 1 from 7 to 6
+move 14 from 1 to 6
+move 7 from 4 to 3
+move 2 from 5 to 9
+move 5 from 6 to 4
+move 9 from 6 to 1
+move 3 from 4 to 8
+move 1 from 7 to 6
+move 3 from 4 to 1
+move 7 from 3 to 8
+move 5 from 9 to 5
+move 4 from 1 to 4
+move 3 from 7 to 2
+move 5 from 6 to 2
+move 3 from 4 to 1
+move 7 from 8 to 5
+move 3 from 6 to 8
+move 11 from 2 to 1
+move 1 from 4 to 3
+move 1 from 3 to 9
+move 2 from 2 to 9
+move 8 from 5 to 4
+move 1 from 1 to 7
+move 1 from 9 to 5
+move 8 from 4 to 1
+move 1 from 6 to 8
+move 2 from 9 to 1
+move 4 from 5 to 3
+move 2 from 7 to 3
+move 40 from 1 to 2
+move 24 from 2 to 9
+move 1 from 5 to 6
+move 11 from 2 to 3
+move 9 from 3 to 5
+move 12 from 9 to 4
+move 6 from 5 to 7
+move 4 from 7 to 4
+move 2 from 5 to 1
+move 2 from 1 to 9
+move 1 from 6 to 8
+move 9 from 4 to 8
+move 6 from 4 to 9
+move 17 from 9 to 6
+move 1 from 4 to 6
+move 17 from 6 to 5
+move 1 from 1 to 4
+move 2 from 7 to 9
+move 1 from 6 to 7
+move 2 from 2 to 9
+move 2 from 7 to 2
+move 6 from 3 to 8
+move 3 from 5 to 9
+move 1 from 4 to 9
+move 2 from 3 to 7
+move 4 from 5 to 6
+move 1 from 7 to 4
+move 1 from 4 to 2
+move 1 from 7 to 5
+move 9 from 8 to 1
+move 1 from 1 to 2
+move 2 from 9 to 3
+move 7 from 2 to 7
+move 1 from 9 to 5
+move 12 from 8 to 7
+move 3 from 1 to 9
+move 2 from 6 to 4
+move 9 from 9 to 3
+move 1 from 6 to 7
+move 1 from 9 to 5
+move 1 from 6 to 1
+move 9 from 7 to 1
+move 7 from 1 to 8
+move 4 from 3 to 9
+move 5 from 7 to 1
+move 3 from 9 to 1
+move 4 from 7 to 2
+move 12 from 1 to 5
+move 2 from 9 to 4
+move 7 from 8 to 2
+move 7 from 5 to 7
+move 4 from 3 to 4
+move 1 from 8 to 1
+move 2 from 2 to 1
+move 2 from 3 to 1
+move 3 from 2 to 7
+move 13 from 5 to 4
+move 1 from 8 to 3
+move 1 from 3 to 8
+move 1 from 3 to 5
+move 1 from 8 to 7
+move 17 from 4 to 8
+move 5 from 2 to 6
+move 2 from 1 to 6
+move 5 from 6 to 3
+move 9 from 7 to 1
+move 4 from 4 to 3
+move 1 from 6 to 2
+move 4 from 7 to 4
+move 1 from 6 to 5
+move 2 from 3 to 2
+move 15 from 1 to 4
+move 6 from 5 to 4
+move 4 from 3 to 5
+move 4 from 5 to 2
+move 2 from 2 to 4
+move 11 from 8 to 1
+move 2 from 8 to 3
+move 5 from 3 to 7
+move 4 from 2 to 8
+move 2 from 2 to 9
+move 4 from 7 to 8
+move 11 from 4 to 6
+move 2 from 5 to 4
+move 3 from 6 to 9
+move 4 from 1 to 4
+move 15 from 4 to 9
+move 1 from 7 to 3
+move 2 from 1 to 2
+move 6 from 4 to 5
+move 11 from 8 to 2
+move 16 from 9 to 4
+move 2 from 9 to 1
+move 4 from 2 to 3
+move 8 from 4 to 9
+move 1 from 8 to 7
+move 5 from 4 to 7
+move 6 from 7 to 3
+move 10 from 9 to 5
+move 5 from 3 to 1
+move 1 from 1 to 4
+move 5 from 1 to 9
+move 5 from 1 to 7
+move 5 from 4 to 1
+move 4 from 1 to 6
+move 3 from 1 to 9
+move 10 from 5 to 9
+move 2 from 7 to 1
+move 5 from 3 to 6
+move 4 from 5 to 7
+move 4 from 2 to 6
+move 2 from 5 to 6
+move 5 from 2 to 7
+move 18 from 6 to 1
+move 5 from 9 to 2
+move 7 from 9 to 6
+move 16 from 1 to 7
+move 4 from 6 to 1
+move 1 from 2 to 6
+move 2 from 2 to 6
+move 1 from 2 to 4
+move 4 from 9 to 3
+move 1 from 2 to 8
+move 5 from 7 to 5
+move 2 from 9 to 3
+move 1 from 5 to 9
+move 7 from 3 to 4
+move 1 from 9 to 7
+move 8 from 1 to 9
+move 1 from 8 to 9
+move 3 from 6 to 9
+move 17 from 7 to 5
+move 3 from 4 to 8
+move 3 from 4 to 2
+move 3 from 8 to 3
+move 3 from 3 to 7
+move 7 from 9 to 3
+move 6 from 5 to 9
+move 4 from 9 to 3
+move 10 from 7 to 2
+move 15 from 5 to 2
+move 4 from 6 to 3
+move 1 from 3 to 2
+move 23 from 2 to 5
+move 2 from 4 to 6
+move 2 from 6 to 7
+move 1 from 7 to 2
+move 1 from 6 to 9
+move 5 from 9 to 8
+move 3 from 8 to 7
+move 5 from 2 to 6
+move 2 from 2 to 3
+move 2 from 6 to 3
+move 3 from 6 to 2
+move 3 from 6 to 8
+move 10 from 5 to 9
+move 2 from 7 to 5
+move 1 from 5 to 8
+move 13 from 9 to 5
+move 6 from 5 to 6
+move 1 from 6 to 1
+move 1 from 7 to 3
+move 1 from 7 to 3
+move 13 from 5 to 6
+move 3 from 3 to 5
+move 1 from 2 to 1
+move 4 from 8 to 9
+move 2 from 2 to 6
+move 2 from 5 to 3
+move 2 from 3 to 6
+move 5 from 6 to 4
+move 9 from 5 to 9
+move 10 from 6 to 9
+move 1 from 1 to 7
+move 3 from 3 to 9
+move 1 from 8 to 1
+move 3 from 6 to 3
+move 1 from 7 to 6
+move 1 from 8 to 7
+move 2 from 6 to 1
+move 2 from 6 to 4
+move 3 from 4 to 6
+move 2 from 1 to 4
+move 10 from 9 to 6
+move 6 from 4 to 9
+move 17 from 9 to 1
+move 4 from 9 to 5
+move 19 from 1 to 7
+move 4 from 5 to 6
+move 1 from 9 to 3
+move 5 from 3 to 4
+move 5 from 4 to 8
+move 17 from 6 to 9
+move 17 from 9 to 2
+move 1 from 6 to 1
+move 1 from 1 to 2
+move 1 from 8 to 3
+move 2 from 3 to 2
+move 5 from 7 to 1
+move 1 from 7 to 3
+move 5 from 2 to 9
+move 4 from 8 to 2
+move 2 from 7 to 8
+move 3 from 9 to 3
+move 7 from 3 to 9
+move 2 from 8 to 7
+move 8 from 2 to 9
+move 5 from 9 to 6
+move 4 from 3 to 9
+move 11 from 2 to 3
+move 2 from 6 to 5
+move 1 from 9 to 4
+move 10 from 7 to 3
+move 3 from 1 to 8
+move 2 from 6 to 7
+move 15 from 3 to 8
+move 2 from 3 to 2
+move 2 from 1 to 3
+move 14 from 9 to 6
+move 1 from 4 to 9
+move 14 from 6 to 3
+move 5 from 7 to 2
+move 2 from 9 to 2
+move 1 from 5 to 3
+move 1 from 5 to 8
+move 12 from 3 to 7
+move 13 from 7 to 8
+move 1 from 6 to 7
+move 5 from 2 to 6
+move 1 from 6 to 2
+move 1 from 7 to 6
+move 4 from 6 to 8
+move 31 from 8 to 7
+move 15 from 7 to 8
+move 7 from 7 to 5
+move 4 from 2 to 3
+move 1 from 6 to 2
+move 3 from 5 to 8
+move 9 from 7 to 4
+move 2 from 2 to 9
+move 4 from 5 to 6
+move 13 from 3 to 9
+move 3 from 3 to 5
+move 13 from 9 to 1
+move 1 from 3 to 2
+move 2 from 6 to 5
+move 1 from 3 to 4
+move 2 from 6 to 5
+move 1 from 9 to 1
+move 6 from 8 to 9
+move 5 from 5 to 2
+move 2 from 9 to 8
+move 2 from 1 to 6
+move 1 from 9 to 4
+move 12 from 8 to 4
+move 2 from 6 to 9
+move 11 from 4 to 3
+move 9 from 4 to 2
+move 4 from 9 to 7
+move 2 from 5 to 6
+move 8 from 3 to 4
+move 2 from 3 to 9
+move 2 from 8 to 9
+move 4 from 4 to 9
+move 2 from 6 to 7
+move 1 from 3 to 7
+move 2 from 9 to 1
+move 5 from 4 to 2
+move 9 from 1 to 8
+move 1 from 4 to 9
+move 4 from 9 to 3
+move 1 from 3 to 6
+move 4 from 8 to 7
+move 1 from 3 to 6
+move 4 from 1 to 7
+move 1 from 3 to 8
+move 1 from 1 to 8
+move 2 from 6 to 7
+move 2 from 9 to 1
+move 1 from 4 to 5
+move 1 from 1 to 5
+move 11 from 8 to 4
+move 12 from 2 to 8
+move 1 from 9 to 8
+move 2 from 4 to 5
+move 1 from 1 to 8
+move 5 from 2 to 1
+move 1 from 3 to 2
+move 9 from 7 to 3
+move 6 from 7 to 5
+move 1 from 3 to 4
+move 1 from 5 to 1
+move 4 from 2 to 5
+move 4 from 4 to 1
+move 2 from 7 to 3
+move 3 from 4 to 1
+move 6 from 3 to 7
+move 9 from 8 to 7
+move 3 from 8 to 7
+move 11 from 5 to 9
+move 2 from 4 to 8
+move 5 from 8 to 7
+move 1 from 9 to 8
+move 12 from 9 to 5
+move 1 from 4 to 5
+move 5 from 1 to 8
+move 6 from 8 to 3
+move 1 from 3 to 8
+move 3 from 7 to 9
+move 4 from 7 to 6
+move 3 from 1 to 3
+move 3 from 1 to 6
+move 1 from 8 to 1
+move 7 from 6 to 2
+move 3 from 1 to 8
+move 7 from 3 to 4
+move 3 from 4 to 1
+move 1 from 4 to 2
+move 3 from 1 to 2
+move 1 from 7 to 6
+move 1 from 8 to 5
+move 9 from 5 to 3
+move 1 from 6 to 9
+move 11 from 3 to 6
+move 1 from 4 to 1
+move 1 from 3 to 4
+move 8 from 6 to 9
+move 1 from 3 to 1
+move 1 from 9 to 1
+move 2 from 6 to 2
+move 5 from 5 to 7
+move 5 from 9 to 3
+move 2 from 8 to 5
+move 1 from 1 to 2
+move 1 from 9 to 1
+move 15 from 7 to 4
+move 1 from 1 to 6
+move 1 from 6 to 9
+move 3 from 9 to 3
+move 1 from 3 to 5
+move 5 from 5 to 3
+move 9 from 2 to 9
+move 5 from 4 to 1
+move 1 from 6 to 7
+move 7 from 9 to 3
+move 1 from 4 to 7
+move 1 from 9 to 6
+move 1 from 6 to 5
+move 2 from 1 to 4
+move 3 from 9 to 3
+move 1 from 5 to 6
+move 7 from 4 to 3
+move 1 from 9 to 3
+move 16 from 3 to 1
+move 9 from 1 to 3
+move 5 from 4 to 2
+move 1 from 6 to 9
+move 12 from 1 to 9
+move 3 from 2 to 9
+move 5 from 7 to 3
+move 2 from 4 to 8
+move 2 from 7 to 2
+move 12 from 3 to 5
+move 6 from 2 to 9
+move 12 from 3 to 1
+move 2 from 8 to 6
+move 1 from 6 to 1
+move 6 from 5 to 8
+move 5 from 3 to 2
+move 2 from 5 to 8
+move 8 from 1 to 8
+move 13 from 9 to 7
+move 4 from 7 to 5
+move 4 from 1 to 4
+move 8 from 5 to 6
+move 1 from 1 to 6
+move 4 from 7 to 3
+move 1 from 3 to 1
+move 1 from 1 to 9
+move 4 from 9 to 5
+move 3 from 3 to 7
+move 12 from 8 to 7
+move 2 from 4 to 3
+move 2 from 6 to 9
+move 4 from 8 to 2
+move 2 from 3 to 9
+move 2 from 4 to 7
+move 3 from 5 to 7
+move 2 from 9 to 7
+move 3 from 6 to 1
+move 4 from 6 to 7
+move 1 from 5 to 4
+move 1 from 9 to 3
+move 12 from 2 to 5
+move 4 from 9 to 7
+move 11 from 5 to 1
+move 1 from 6 to 5
+move 1 from 1 to 4
+move 10 from 1 to 2
+move 2 from 5 to 1
+move 1 from 3 to 5
+move 7 from 2 to 5
+move 8 from 7 to 8
+move 2 from 2 to 8
+move 3 from 9 to 4
+move 5 from 4 to 3
+move 1 from 5 to 7
+move 3 from 7 to 1
+move 3 from 5 to 8
+move 1 from 2 to 5
+move 12 from 7 to 6
+move 4 from 1 to 3
+move 2 from 5 to 6
+move 7 from 3 to 7
+move 14 from 6 to 4
+move 1 from 5 to 6
+move 3 from 1 to 3
+move 4 from 3 to 2
+move 2 from 5 to 8
+move 11 from 7 to 4
+move 7 from 4 to 5
+move 1 from 3 to 4
+move 1 from 5 to 6
+move 14 from 8 to 7
+move 11 from 7 to 3
+move 2 from 2 to 6
+move 1 from 2 to 3
+move 5 from 5 to 4
+move 4 from 6 to 4
+move 8 from 7 to 8
+move 3 from 7 to 3
+move 1 from 2 to 1
+move 5 from 8 to 2
+move 4 from 4 to 3
+move 1 from 2 to 9
+move 1 from 1 to 9
+move 3 from 2 to 1
+move 1 from 5 to 4
+move 3 from 8 to 1
+move 1 from 7 to 4
+move 4 from 3 to 9
+move 1 from 8 to 7
+move 2 from 9 to 1
+move 6 from 3 to 4
+move 28 from 4 to 7
+move 15 from 7 to 8
+move 3 from 3 to 8
+move 1 from 2 to 9
+move 2 from 3 to 2
+move 7 from 1 to 4
+move 10 from 4 to 5
+move 10 from 5 to 6
+move 3 from 8 to 2
+move 1 from 1 to 7
+move 1 from 4 to 7
+move 1 from 9 to 6
+move 9 from 6 to 7
+move 1 from 2 to 4
+move 1 from 9 to 5