# dziarnowskij/aoc_2025 architecture

> Architecture diagram of the GitHub repository dziarnowskij/aoc_2025, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-26). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/dziarnowskij/aoc_2025
- Repository: https://github.com/dziarnowskij/aoc_2025

## Overview

This repository is a collection of independent Advent of Code puzzle solvers, not a single application pipeline. The principal workflow is to run a day-and-part script, which reads puzzle input, applies that challenge’s rules, and prints a result. The README describes distinct challenges spanning dial counting, pattern and range analysis, grid removal, calculations, simulations, geometry, graph paths, machine states, and shape fitting. Sampled code confirms several algorithms and use of geometry helpers; links for unsampled solutions are limited to their documented challenge roles.

Main entry points: [`day_01/part_1.py`](https://github.com/dziarnowskij/aoc_2025/blob/master/day_01/part_1.py) (Dial stops), [`day_01/part_2.py`](https://github.com/dziarnowskij/aoc_2025/blob/master/day_01/part_2.py) (Dial crossings), [`day_02/part_1.py`](https://github.com/dziarnowskij/aoc_2025/blob/master/day_02/part_1.py) (Repeated IDs), [`day_02/part_2.py`](https://github.com/dziarnowskij/aoc_2025/blob/master/day_02/part_2.py) (Pattern IDs)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_numbers["Numbers and text"]
  node_d1p1["Dial stops<br/>[part_1.py]"]
  node_d1p2["Dial crossings<br/>[part_2.py]"]
  node_d2p1["Repeated IDs<br/>[part_1.py]"]
  node_d2p2["Pattern IDs<br/>[part_2.py]"]
  node_d3p1["Two batteries<br/>[part_1.py]"]
  node_d3p2["Twelve batteries<br/>[part_2.py]"]
  node_d5p1["Fresh ingredients<br/>[part_1.py]"]
  node_d5p2["Fresh ID ranges<br/>[part_2.py]"]
  node_d6p1["Worksheet arithmetic<br/>[part_1.py]"]
  node_d6p2["Vertical arithmetic<br/>[part_2.py]"]
end

subgraph group_grids["Grids and simulation"]
  node_d4p1["Accessible rolls<br/>[part_1.py]"]
  node_d4p2["Roll removal<br/>[part_2.py]"]
  node_d7p1["Beam splits<br/>[part_1.py]"]
  node_d7p2["Beam timelines<br/>[part_2.py]"]
end

subgraph group_geometry["Geometry and circuits"]
  node_d8p1["Point circuits<br/>[part_1.py]"]
  node_d8p2["Circuit connections<br/>[part_2.py]"]
  node_d9p1["Rectangle area<br/>[part_1.py]"]
  node_d9p2["Enclosed rectangles<br/>[part_2.py]"]
  node_d10p1["Light switches<br/>[part_1.py]"]
  node_d10p2["Joltage controls<br/>[part_2.py]"]
end

subgraph group_packing["Networks and packing"]
  node_d11p1["Reactor paths<br/>[part_1.py]"]
  node_d11p2["Required paths<br/>[part_2.py]"]
  node_d12p1["Farm shapes<br/>[part_1.py]"]
end

subgraph group_internal["Shared utilities"]
  node_geometry2d["2D geometry<br/>[geometry.py]"]
  node_geometry3d["3D geometry<br/>[geometry3D.py]"]
end

node_user(("Solver user"))
node_input["Puzzle input"]
node_result["Printed answer"]

node_user -->|"runs"| node_d1p1
node_user -->|"runs"| node_d1p2
node_user -->|"runs"| node_d2p1
node_user -->|"runs"| node_d2p2
node_user -->|"runs"| node_d3p1
node_user -->|"runs"| node_d3p2
node_user -->|"runs"| node_d4p1
node_user -->|"runs"| node_d4p2
node_user -->|"runs"| node_d5p1
node_user -->|"runs"| node_d5p2
node_user -->|"runs"| node_d6p1
node_user -->|"runs"| node_d6p2
node_user -->|"runs"| node_d7p1
node_user -->|"runs"| node_d7p2
node_user -->|"runs"| node_d8p1
node_user -->|"runs"| node_d8p2
node_user -->|"runs"| node_d9p1
node_user -->|"runs"| node_d9p2
node_user -->|"runs"| node_d10p1
node_user -->|"runs"| node_d10p2
node_user -->|"runs"| node_d11p1
node_user -->|"runs"| node_d11p2
node_user -->|"runs"| node_d12p1
node_input -->|"reads"| node_d1p1
node_input -->|"reads"| node_d1p2
node_input -->|"reads"| node_d2p1
node_input -->|"reads"| node_d2p2
node_input -->|"reads"| node_d3p1
node_input -->|"reads"| node_d3p2
node_input -->|"reads"| node_d4p1
node_input -->|"reads"| node_d4p2
node_input -->|"reads"| node_d5p1
node_input -->|"reads"| node_d5p2
node_input -->|"reads"| node_d6p1
node_input -->|"reads"| node_d6p2
node_input -->|"reads"| node_d7p1
node_input -->|"reads"| node_d7p2
node_input -->|"reads"| node_d8p1
node_input -->|"reads"| node_d8p2
node_input -->|"reads"| node_d9p1
node_input -->|"reads"| node_d9p2
node_input -->|"reads"| node_d10p1
node_input -->|"reads"| node_d10p2
node_input -->|"reads"| node_d11p1
node_input -->|"reads"| node_d11p2
node_input -->|"reads"| node_d12p1
node_d1p1 -->|"prints"| node_result
node_d1p2 -->|"prints"| node_result

click node_d1p1 "https://github.com/dziarnowskij/aoc_2025/blob/master/day_01/part_1.py"
click node_d1p2 "https://github.com/dziarnowskij/aoc_2025/blob/master/day_01/part_2.py"
click node_d2p1 "https://github.com/dziarnowskij/aoc_2025/blob/master/day_02/part_1.py"
click node_d2p2 "https://github.com/dziarnowskij/aoc_2025/blob/master/day_02/part_2.py"
click node_d3p1 "https://github.com/dziarnowskij/aoc_2025/blob/master/day_03/part_1.py"
click node_d3p2 "https://github.com/dziarnowskij/aoc_2025/blob/master/day_03/part_2.py"
click node_d4p1 "https://github.com/dziarnowskij/aoc_2025/blob/master/day_04/part_1.py"
click node_d4p2 "https://github.com/dziarnowskij/aoc_2025/blob/master/day_04/part_2.py"
click node_d5p1 "https://github.com/dziarnowskij/aoc_2025/blob/master/day_05/part_1.py"
click node_d5p2 "https://github.com/dziarnowskij/aoc_2025/blob/master/day_05/part_2.py"
click node_d6p1 "https://github.com/dziarnowskij/aoc_2025/blob/master/day_06/part_1.py"
click node_d6p2 "https://github.com/dziarnowskij/aoc_2025/blob/master/day_06/part_2.py"
click node_d7p1 "https://github.com/dziarnowskij/aoc_2025/blob/master/day_07/part_1.py"
click node_d7p2 "https://github.com/dziarnowskij/aoc_2025/blob/master/day_07/part_2.py"
click node_d8p1 "https://github.com/dziarnowskij/aoc_2025/blob/master/day_08/part_1.py"
click node_d8p2 "https://github.com/dziarnowskij/aoc_2025/blob/master/day_08/part_2.py"
click node_d9p1 "https://github.com/dziarnowskij/aoc_2025/blob/master/day_09/part_1.py"
click node_d9p2 "https://github.com/dziarnowskij/aoc_2025/blob/master/day_09/part_2.py"
click node_d10p1 "https://github.com/dziarnowskij/aoc_2025/blob/master/day_10/part_1.py"
click node_d10p2 "https://github.com/dziarnowskij/aoc_2025/blob/master/day_10/part_2.py"
click node_d11p1 "https://github.com/dziarnowskij/aoc_2025/blob/master/day_11/part_1.py"
click node_d11p2 "https://github.com/dziarnowskij/aoc_2025/blob/master/day_11/part_2.py"
click node_d12p1 "https://github.com/dziarnowskij/aoc_2025/blob/master/day_12/part_1.py"
click node_geometry2d "https://github.com/dziarnowskij/aoc_2025/blob/master/utils/geometry.py"
click node_geometry3d "https://github.com/dziarnowskij/aoc_2025/blob/master/utils/geometry3D.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_d1p1,node_d1p2,node_d2p1,node_d2p2,node_d3p1,node_d3p2,node_d5p1,node_d5p2,node_d6p1,node_d6p2,node_user toneBlue
class node_d4p1,node_d4p2,node_d7p1,node_d7p2 toneAmber
class node_d8p1,node_d8p2,node_d9p1,node_d9p2,node_d10p1,node_d10p2 toneMint
class node_d11p1,node_d11p2,node_d12p1 toneRose
class node_geometry2d,node_geometry3d,node_input,node_result toneIndigo
```

## Components

### Numbers and text

- [Dial stops](https://github.com/dziarnowskij/aoc_2025/blob/master/day_01/part_1.py): `day_01/part_1.py`
- [Dial crossings](https://github.com/dziarnowskij/aoc_2025/blob/master/day_01/part_2.py): `day_01/part_2.py`
- [Repeated IDs](https://github.com/dziarnowskij/aoc_2025/blob/master/day_02/part_1.py): `day_02/part_1.py`
- [Pattern IDs](https://github.com/dziarnowskij/aoc_2025/blob/master/day_02/part_2.py): `day_02/part_2.py`
- [Two batteries](https://github.com/dziarnowskij/aoc_2025/blob/master/day_03/part_1.py): `day_03/part_1.py`
- [Twelve batteries](https://github.com/dziarnowskij/aoc_2025/blob/master/day_03/part_2.py): `day_03/part_2.py`
- [Fresh ingredients](https://github.com/dziarnowskij/aoc_2025/blob/master/day_05/part_1.py): `day_05/part_1.py`
- [Fresh ID ranges](https://github.com/dziarnowskij/aoc_2025/blob/master/day_05/part_2.py): `day_05/part_2.py`
- [Worksheet arithmetic](https://github.com/dziarnowskij/aoc_2025/blob/master/day_06/part_1.py): `day_06/part_1.py`
- [Vertical arithmetic](https://github.com/dziarnowskij/aoc_2025/blob/master/day_06/part_2.py): `day_06/part_2.py`

### Grids and simulation

- [Accessible rolls](https://github.com/dziarnowskij/aoc_2025/blob/master/day_04/part_1.py): `day_04/part_1.py`
- [Roll removal](https://github.com/dziarnowskij/aoc_2025/blob/master/day_04/part_2.py): `day_04/part_2.py`
- [Beam splits](https://github.com/dziarnowskij/aoc_2025/blob/master/day_07/part_1.py): `day_07/part_1.py`
- [Beam timelines](https://github.com/dziarnowskij/aoc_2025/blob/master/day_07/part_2.py): `day_07/part_2.py`

### Geometry and circuits

- [Point circuits](https://github.com/dziarnowskij/aoc_2025/blob/master/day_08/part_1.py): `day_08/part_1.py`
- [Circuit connections](https://github.com/dziarnowskij/aoc_2025/blob/master/day_08/part_2.py): `day_08/part_2.py`
- [Rectangle area](https://github.com/dziarnowskij/aoc_2025/blob/master/day_09/part_1.py): `day_09/part_1.py`
- [Enclosed rectangles](https://github.com/dziarnowskij/aoc_2025/blob/master/day_09/part_2.py): `day_09/part_2.py`
- [Light switches](https://github.com/dziarnowskij/aoc_2025/blob/master/day_10/part_1.py): `day_10/part_1.py`
- [Joltage controls](https://github.com/dziarnowskij/aoc_2025/blob/master/day_10/part_2.py): `day_10/part_2.py`

### Networks and packing

- [Reactor paths](https://github.com/dziarnowskij/aoc_2025/blob/master/day_11/part_1.py): `day_11/part_1.py`
- [Required paths](https://github.com/dziarnowskij/aoc_2025/blob/master/day_11/part_2.py): `day_11/part_2.py`
- [Farm shapes](https://github.com/dziarnowskij/aoc_2025/blob/master/day_12/part_1.py): `day_12/part_1.py`

### Shared utilities

- [2D geometry](https://github.com/dziarnowskij/aoc_2025/blob/master/utils/geometry.py): `utils/geometry.py`
- [3D geometry](https://github.com/dziarnowskij/aoc_2025/blob/master/utils/geometry3D.py): `utils/geometry3D.py`

### Other components

- **Solver user**
- **Puzzle input**
- **Printed answer**

## Connections

- Solver user → Dial stops: runs
- Solver user → Dial crossings: runs
- Solver user → Repeated IDs: runs
- Solver user → Pattern IDs: runs
- Solver user → Two batteries: runs
- Solver user → Twelve batteries: runs
- Solver user → Accessible rolls: runs
- Solver user → Roll removal: runs
- Solver user → Fresh ingredients: runs
- Solver user → Fresh ID ranges: runs
- Solver user → Worksheet arithmetic: runs
- Solver user → Vertical arithmetic: runs
- Solver user → Beam splits: runs
- Solver user → Beam timelines: runs
- Solver user → Point circuits: runs
- Solver user → Circuit connections: runs
- Solver user → Rectangle area: runs
- Solver user → Enclosed rectangles: runs
- Solver user → Light switches: runs
- Solver user → Joltage controls: runs
- Solver user → Reactor paths: runs
- Solver user → Required paths: runs
- Solver user → Farm shapes: runs
- Puzzle input → Dial stops: reads
- Puzzle input → Dial crossings: reads
- Puzzle input → Repeated IDs: reads
- Puzzle input → Pattern IDs: reads
- Puzzle input → Two batteries: reads
- Puzzle input → Twelve batteries: reads
- Puzzle input → Accessible rolls: reads
- Puzzle input → Roll removal: reads
- Puzzle input → Fresh ingredients: reads
- Puzzle input → Fresh ID ranges: reads
- Puzzle input → Worksheet arithmetic: reads
- Puzzle input → Vertical arithmetic: reads
- Puzzle input → Beam splits: reads
- Puzzle input → Beam timelines: reads
- Puzzle input → Point circuits: reads
- Puzzle input → Circuit connections: reads
- Puzzle input → Rectangle area: reads
- Puzzle input → Enclosed rectangles: reads
- Puzzle input → Light switches: reads
- Puzzle input → Joltage controls: reads
- Puzzle input → Reactor paths: reads
- Puzzle input → Required paths: reads
- Puzzle input → Farm shapes: reads
- Dial stops → Printed answer: prints
- Dial crossings → Printed answer: prints
