Skip to content

Commit 29aed11

Browse files
committed
more sols
1 parent da4ff09 commit 29aed11

File tree

8 files changed

+661
-15
lines changed

8 files changed

+661
-15
lines changed

README.md

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
![Stars: 500](https://img.shields.io/badge/Stars-500⭐-blue)
44
![Rust: 250](https://img.shields.io/badge/Rust-250-cyan?logo=Rust)
5-
![Python: 123](https://img.shields.io/badge/Python-123-cyan?logo=Python)
5+
![Python: 122](https://img.shields.io/badge/Python-122-cyan?logo=Python)
66

77
<img src="./scripts/assets/christmas_ferris_2015_2024.png" alt="Christmas Ferris" width="164" />
88

@@ -26,28 +26,28 @@ Puzzle | Stars |
2626
[Day 10: Hoof It](https://adventofcode.com/2024/day/10) | ⭐⭐ | [![Rust](./scripts/assets/rust.png)](src/year2024/day10/day10.rs) [![Go](./scripts/assets/go.png)](src/year2024/day10/day10.go)
2727
[Day 11: Plutonian Pebbles](https://adventofcode.com/2024/day/11) | ⭐⭐ | [![Rust](./scripts/assets/rust.png)](src/year2024/day11/day11.rs) [![Go](./scripts/assets/go.png)](src/year2024/day11/day11.go)
2828
[Day 12: Garden Groups](https://adventofcode.com/2024/day/12) | ⭐⭐ | [![Rust](./scripts/assets/rust.png)](src/year2024/day12/day12.rs) [![Go](./scripts/assets/go.png)](src/year2024/day12/day12.go)
29-
[Day 13: Claw Contraption](https://adventofcode.com/2024/day/13) | ⭐⭐ | [![Rust](./scripts/assets/rust.png)](src/year2024/day13/day13.rs) [![Rust](./scripts/assets/rust.png)](src/year2024/day13_z3/day13_z3.rs) [![Python](./scripts/assets/python.png)](src/year2024/day13_z3/day13.py) [![Go](./scripts/assets/go.png)](src/year2024/day13/day13.go)
29+
[Day 13: Claw Contraption](https://adventofcode.com/2024/day/13) | ⭐⭐ | [![Rust](./scripts/assets/rust.png)](src/year2024/day13/day13.rs) [![Rust](./scripts/assets/rust.png)](src/year2024/day13_z3/day13_z3.rs) [![Python](./scripts/assets/python.png)](src/year2024/day13_z3/day13_z3.py) [![Go](./scripts/assets/go.png)](src/year2024/day13/day13.go)
3030
[Day 14: Restroom Redoubt](https://adventofcode.com/2024/day/14) | ⭐⭐ | [![Rust](./scripts/assets/rust.png)](src/year2024/day14/day14.rs) [![Python](./scripts/assets/python.png)](src/year2024/day14/day14.py) [![Go](./scripts/assets/go.png)](src/year2024/day14/day14.go) [🎁](src/year2024/day14/README.md)
3131
[Day 15: Warehouse Woes](https://adventofcode.com/2024/day/15) | ⭐⭐ | [![Rust](./scripts/assets/rust.png)](src/year2024/day15/day15.rs) [![Go](./scripts/assets/go.png)](src/year2024/day15/day15.go) [🎁](src/year2024/day15/README.md)
3232
[Day 16: Reindeer Maze](https://adventofcode.com/2024/day/16) | ⭐⭐ | [![Rust](./scripts/assets/rust.png)](src/year2024/day16/day16.rs) [🎁](src/year2024/day16/README.md)
3333
[Day 17: Chronospatial Computer](https://adventofcode.com/2024/day/17) | ⭐⭐ | [![Rust](./scripts/assets/rust.png)](src/year2024/day17/day17.rs)
3434
[Day 18: RAM Run](https://adventofcode.com/2024/day/18) | ⭐⭐ | [![Rust](./scripts/assets/rust.png)](src/year2024/day18/day18.rs) [![C++](./scripts/assets/cpp.png)](src/year2024/day18/day18.cpp) [![Go](./scripts/assets/go.png)](src/year2024/day18/day18.go)
35-
[Day 19: Linen Layout](https://adventofcode.com/2024/day/19) | ⭐⭐ | [![Rust](./scripts/assets/rust.png)](src/year2024/day19/day19.rs)
35+
[Day 19: Linen Layout](https://adventofcode.com/2024/day/19) | ⭐⭐ | [![Rust](./scripts/assets/rust.png)](src/year2024/day19/day19.rs) [![Python](./scripts/assets/python.png)](src/year2024/day19/day19.py) [![Go](./scripts/assets/go.png)](src/year2024/day19/day19.go)
3636
[Day 20: Race Condition](https://adventofcode.com/2024/day/20) | ⭐⭐ | [![Rust](./scripts/assets/rust.png)](src/year2024/day20/day20.rs)
3737
[Day 21: Keypad Conundrum](https://adventofcode.com/2024/day/21) | ⭐⭐ | [![Rust](./scripts/assets/rust.png)](src/year2024/day21/day21.rs)
38-
[Day 22: Monkey Market](https://adventofcode.com/2024/day/22) | ⭐⭐ | [![Rust](./scripts/assets/rust.png)](src/year2024/day22/day22.rs)
38+
[Day 22: Monkey Market](https://adventofcode.com/2024/day/22) | ⭐⭐ | [![Rust](./scripts/assets/rust.png)](src/year2024/day22/day22.rs) [![Go](./scripts/assets/go.png)](src/year2024/day22/day22.go)
3939
[Day 23: LAN Party](https://adventofcode.com/2024/day/23) | ⭐⭐ | [![Rust](./scripts/assets/rust.png)](src/year2024/day23/day23.rs) [![Python](./scripts/assets/python.png)](src/year2024/day23/day23.py)
40-
[Day 24: Crossed Wires](https://adventofcode.com/2024/day/24) | ⭐⭐ | [![Rust](./scripts/assets/rust.png)](src/year2024/day24/day24.rs)
40+
[Day 24: Crossed Wires](https://adventofcode.com/2024/day/24) | ⭐⭐ | [![Rust](./scripts/assets/rust.png)](src/year2024/day24/day24.rs) [![Go](./scripts/assets/go.png)](src/year2024/day24/day24.go)
4141
[Day 25: Code Chronicle](https://adventofcode.com/2024/day/25) | ⭐⭐ | [![Rust](./scripts/assets/rust.png)](src/year2024/day25/day25.rs) [![Python](./scripts/assets/python.png)](src/year2024/day25/day25.py) [![Go](./scripts/assets/go.png)](src/year2024/day25/day25.go)
4242

4343
## All years
4444

4545
Calendar | Solutions | Stars | Rust | Python | 🎁
4646
-------- | --------- | ----- | ---- | ------ | --
47-
[Advent of Code 2024](https://adventofcode.com/2024) | [Solutions](src/year2024/README.md) | 50⭐ | 25 | 10 | 3
48-
[Advent of Code 2023](https://adventofcode.com/2023) | [Solutions](src/year2023/README.md) | 50⭐ | 25 | 11 | 2
47+
[Advent of Code 2024](https://adventofcode.com/2024) | [Solutions](src/year2024/README.md) | 50⭐ | 25 | 11 | 3
48+
[Advent of Code 2023](https://adventofcode.com/2023) | [Solutions](src/year2023/README.md) | 50⭐ | 25 | 10 | 2
4949
[Advent of Code 2022](https://adventofcode.com/2022) | [Solutions](src/year2022/README.md) | 50⭐ | 25 | 18 | 1
50-
[Advent of Code 2021](https://adventofcode.com/2021) | [Solutions](src/year2021/README.md) | 50⭐ | 25 | 12 |
50+
[Advent of Code 2021](https://adventofcode.com/2021) | [Solutions](src/year2021/README.md) | 50⭐ | 25 | 11 |
5151
[Advent of Code 2020](https://adventofcode.com/2020) | [Solutions](src/year2020/README.md) | 50⭐ | 25 | 23 |
5252
[Advent of Code 2019](https://adventofcode.com/2019) | [Solutions](src/year2019/README.md) | 50⭐ | 25 | 23 | 2
5353
[Advent of Code 2018](https://adventofcode.com/2018) | [Solutions](src/year2018/README.md) | 50⭐ | 25 | 4 | 1

scripts/answers.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -610,10 +610,13 @@ def parse(self, year, _day):
610610
bonus = defaultdict(list)
611611

612612
for year, day, stars, title, sols in puzzles:
613-
if any(f.suffix == ".rs" for f in sols):
613+
614+
if any(f.suffix == ".rs" and f.parent.name == f.stem for f in sols):
614615
rust[year] += 1
615-
if any(f.suffix == ".py" for f in sols):
616+
617+
if any(f.suffix == ".py" and f.parent.name == f.stem for f in sols):
616618
python[year] += 1
619+
617620
all_stars[year] += stars
618621

619622
if sols:

src/year2024/README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
![AoC2024](https://img.shields.io/badge/Advent_of_Code-2024-8A2BE2)
44
![Stars: 50](https://img.shields.io/badge/Stars-50⭐-blue)
55
![Rust: 26](https://img.shields.io/badge/Rust-26-cyan?logo=Rust)
6-
![Python: 10](https://img.shields.io/badge/Python-10-cyan?logo=Python)
6+
![Python: 11](https://img.shields.io/badge/Python-11-cyan?logo=Python)
77

88
## 2024 ([Calendar](https://adventofcode.com/2024)) ([Solutions](./)) : 50⭐
99

@@ -21,16 +21,16 @@ Puzzle | Stars |
2121
[Day 10: Hoof It](https://adventofcode.com/2024/day/10) | ⭐⭐ | [![Rust](../../scripts/assets/rust.png)](day10/day10.rs) [![Go](../../scripts/assets/go.png)](day10/day10.go)
2222
[Day 11: Plutonian Pebbles](https://adventofcode.com/2024/day/11) | ⭐⭐ | [![Rust](../../scripts/assets/rust.png)](day11/day11.rs) [![Go](../../scripts/assets/go.png)](day11/day11.go)
2323
[Day 12: Garden Groups](https://adventofcode.com/2024/day/12) | ⭐⭐ | [![Rust](../../scripts/assets/rust.png)](day12/day12.rs) [![Go](../../scripts/assets/go.png)](day12/day12.go)
24-
[Day 13: Claw Contraption](https://adventofcode.com/2024/day/13) | ⭐⭐ | [![Rust](../../scripts/assets/rust.png)](day13/day13.rs) [![Rust](../../scripts/assets/rust.png)](day13_z3/day13_z3.rs) [![Python](../../scripts/assets/python.png)](day13_z3/day13.py) [![Go](../../scripts/assets/go.png)](day13/day13.go)
24+
[Day 13: Claw Contraption](https://adventofcode.com/2024/day/13) | ⭐⭐ | [![Rust](../../scripts/assets/rust.png)](day13/day13.rs) [![Rust](../../scripts/assets/rust.png)](day13_z3/day13_z3.rs) [![Python](../../scripts/assets/python.png)](day13_z3/day13_z3.py) [![Go](../../scripts/assets/go.png)](day13/day13.go)
2525
[Day 14: Restroom Redoubt](https://adventofcode.com/2024/day/14) | ⭐⭐ | [![Rust](../../scripts/assets/rust.png)](day14/day14.rs) [![Python](../../scripts/assets/python.png)](day14/day14.py) [![Go](../../scripts/assets/go.png)](day14/day14.go) [🎁](day14/README.md)
2626
[Day 15: Warehouse Woes](https://adventofcode.com/2024/day/15) | ⭐⭐ | [![Rust](../../scripts/assets/rust.png)](day15/day15.rs) [![Go](../../scripts/assets/go.png)](day15/day15.go) [🎁](day15/README.md)
2727
[Day 16: Reindeer Maze](https://adventofcode.com/2024/day/16) | ⭐⭐ | [![Rust](../../scripts/assets/rust.png)](day16/day16.rs) [🎁](day16/README.md)
2828
[Day 17: Chronospatial Computer](https://adventofcode.com/2024/day/17) | ⭐⭐ | [![Rust](../../scripts/assets/rust.png)](day17/day17.rs)
2929
[Day 18: RAM Run](https://adventofcode.com/2024/day/18) | ⭐⭐ | [![Rust](../../scripts/assets/rust.png)](day18/day18.rs) [![C++](../../scripts/assets/cpp.png)](day18/day18.cpp) [![Go](../../scripts/assets/go.png)](day18/day18.go)
30-
[Day 19: Linen Layout](https://adventofcode.com/2024/day/19) | ⭐⭐ | [![Rust](../../scripts/assets/rust.png)](day19/day19.rs)
30+
[Day 19: Linen Layout](https://adventofcode.com/2024/day/19) | ⭐⭐ | [![Rust](../../scripts/assets/rust.png)](day19/day19.rs) [![Python](../../scripts/assets/python.png)](day19/day19.py) [![Go](../../scripts/assets/go.png)](day19/day19.go)
3131
[Day 20: Race Condition](https://adventofcode.com/2024/day/20) | ⭐⭐ | [![Rust](../../scripts/assets/rust.png)](day20/day20.rs)
3232
[Day 21: Keypad Conundrum](https://adventofcode.com/2024/day/21) | ⭐⭐ | [![Rust](../../scripts/assets/rust.png)](day21/day21.rs)
33-
[Day 22: Monkey Market](https://adventofcode.com/2024/day/22) | ⭐⭐ | [![Rust](../../scripts/assets/rust.png)](day22/day22.rs)
33+
[Day 22: Monkey Market](https://adventofcode.com/2024/day/22) | ⭐⭐ | [![Rust](../../scripts/assets/rust.png)](day22/day22.rs) [![Go](../../scripts/assets/go.png)](day22/day22.go)
3434
[Day 23: LAN Party](https://adventofcode.com/2024/day/23) | ⭐⭐ | [![Rust](../../scripts/assets/rust.png)](day23/day23.rs) [![Python](../../scripts/assets/python.png)](day23/day23.py)
35-
[Day 24: Crossed Wires](https://adventofcode.com/2024/day/24) | ⭐⭐ | [![Rust](../../scripts/assets/rust.png)](day24/day24.rs)
35+
[Day 24: Crossed Wires](https://adventofcode.com/2024/day/24) | ⭐⭐ | [![Rust](../../scripts/assets/rust.png)](day24/day24.rs) [![Go](../../scripts/assets/go.png)](day24/day24.go)
3636
[Day 25: Code Chronicle](https://adventofcode.com/2024/day/25) | ⭐⭐ | [![Rust](../../scripts/assets/rust.png)](day25/day25.rs) [![Python](../../scripts/assets/python.png)](day25/day25.py) [![Go](../../scripts/assets/go.png)](day25/day25.go)
File renamed without changes.

src/year2024/day19/day19.go

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
// [Day 19: Linen Layout](https://adventofcode.com/2024/day/19)
2+
3+
package main
4+
5+
import (
6+
"fmt"
7+
"log"
8+
"os"
9+
"strings"
10+
"time"
11+
)
12+
13+
// puzzle holds the patterns and the designs to evaluate.
14+
type puzzle struct {
15+
patterns []string
16+
designs []string
17+
}
18+
19+
// newPuzzle parses the input where the first section (comma-separated
20+
// patterns) and the second section (designs, one per line) are separated
21+
// by a blank line.
22+
func newPuzzle(data string) *puzzle {
23+
parts := strings.SplitN(data, "\n\n", 2)
24+
var patterns []string
25+
var designs []string
26+
if len(parts) >= 1 {
27+
patterns = strings.Split(strings.TrimSpace(parts[0]), ", ")
28+
}
29+
if len(parts) == 2 {
30+
for _, l := range strings.Split(strings.TrimSpace(parts[1]), "\n") {
31+
l = strings.TrimSpace(l)
32+
if l != "" {
33+
designs = append(designs, l)
34+
}
35+
}
36+
}
37+
return &puzzle{patterns: patterns, designs: designs}
38+
}
39+
40+
// countDesignWays returns the number of ways the given design string can be
41+
// composed by concatenating patterns from the puzzle. The count uses dynamic
42+
// programming and is returned as uint64 to match potential growth.
43+
func (p *puzzle) countDesignWays(design string) uint64 {
44+
n := len(design)
45+
dp := make([]uint64, n+1)
46+
dp[0] = 1
47+
48+
for i := 1; i <= n; i++ {
49+
for _, pattern := range p.patterns {
50+
m := len(pattern)
51+
if i >= m && design[i-m:i] == pattern {
52+
dp[i] += dp[i-m]
53+
}
54+
}
55+
}
56+
57+
return dp[n]
58+
}
59+
60+
// part1 counts how many designs have at least one valid decomposition.
61+
func (p *puzzle) part1() int {
62+
cnt := 0
63+
for _, d := range p.designs {
64+
if p.countDesignWays(d) != 0 {
65+
cnt++
66+
}
67+
}
68+
return cnt
69+
}
70+
71+
// part2 returns the total number of decompositions across all designs.
72+
func (p *puzzle) part2() uint64 {
73+
var sum uint64
74+
for _, d := range p.designs {
75+
sum += p.countDesignWays(d)
76+
}
77+
return sum
78+
}
79+
80+
// solve is the package-level solver used by main and tests.
81+
func solve(data []byte) (int, uint64) {
82+
p := newPuzzle(string(data))
83+
return p.part1(), p.part2()
84+
}
85+
86+
func main() {
87+
filename := "input.txt"
88+
elapsed := false
89+
90+
for i := 1; i < len(os.Args); i++ {
91+
arg := os.Args[i]
92+
if arg == "--elapsed" {
93+
elapsed = true
94+
} else if !strings.HasPrefix(arg, "-") {
95+
filename = arg
96+
}
97+
}
98+
99+
data, err := os.ReadFile(filename)
100+
if err != nil {
101+
log.Fatal(err)
102+
}
103+
104+
if elapsed {
105+
start := time.Now()
106+
r1, r2 := solve(data)
107+
duration := time.Since(start)
108+
109+
fmt.Println(r1)
110+
fmt.Println(r2)
111+
fmt.Printf("elapsed: %f ms\n", duration.Seconds()*1000.0)
112+
} else {
113+
r1, r2 := solve(data)
114+
fmt.Println(r1)
115+
fmt.Println(r2)
116+
}
117+
}

src/year2024/day19/day19.py

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
#!/usr/bin/env python3
2+
# [Day 19: Linen Layout](https://adventofcode.com/2024/day/19)
3+
4+
import argparse
5+
import atexit
6+
import time
7+
from pathlib import Path
8+
from typing import Tuple
9+
10+
11+
def parse_input(data: str) -> Tuple[list[str], list[str]]:
12+
parts = data.strip().split("\n\n", 1)
13+
patterns = []
14+
designs = []
15+
if parts:
16+
patterns = [p.strip() for p in parts[0].split(", ") if p.strip()]
17+
if len(parts) == 2:
18+
designs = [line.strip() for line in parts[1].splitlines() if line.strip()]
19+
return patterns, designs
20+
21+
22+
def count_design_ways(patterns: list[str], design: str) -> int:
23+
"""Count the number of ways `design` can be formed by concatenating patterns.
24+
25+
Uses dynamic programming: dp[i] is number of ways to build design[:i].
26+
"""
27+
n = len(design)
28+
dp = [0] * (n + 1)
29+
dp[0] = 1
30+
for i in range(1, n + 1):
31+
for pat in patterns:
32+
m = len(pat)
33+
if i >= m and design[i - m : i] == pat:
34+
dp[i] += dp[i - m]
35+
return dp[n]
36+
37+
38+
def part1(patterns: list[str], designs: list[str]) -> int:
39+
return sum(1 for d in designs if count_design_ways(patterns, d) != 0)
40+
41+
42+
def part2(patterns: list[str], designs: list[str]) -> int:
43+
return sum(count_design_ways(patterns, d) for d in designs)
44+
45+
46+
def solve(data: str) -> None:
47+
patterns, designs = parse_input(data)
48+
print(part1(patterns, designs))
49+
print(part2(patterns, designs))
50+
51+
52+
def main() -> None:
53+
parser = argparse.ArgumentParser()
54+
parser.add_argument("--elapsed", action="store_true")
55+
parser.add_argument("input", nargs="?", type=Path, default="input.txt")
56+
args = parser.parse_args()
57+
58+
data = args.input.read_text()
59+
60+
if args.elapsed:
61+
start_time_ns = time.time_ns()
62+
atexit.register(lambda: print(f"elapsed: {(time.time_ns() - start_time_ns) / 1_000_000}ms"))
63+
64+
solve(data)
65+
66+
67+
if __name__ == "__main__":
68+
main()

0 commit comments

Comments
 (0)