Skip to content

Commit e47b73b

Browse files
committed
Add old python solutions
1 parent 9f07a2c commit e47b73b

File tree

17 files changed

+268
-31
lines changed

17 files changed

+268
-31
lines changed

.gitignore

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,3 +30,11 @@ build/
3030

3131
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
3232
hs_err_pid*
33+
34+
# Python
35+
aoc2015/aoc2015-python/src/main/python/__pycache__/
36+
aoc2015/aoc2015-python/src/test/python/__pycache__/
37+
aoc2015/aoc2015-python/src/test/resources/.coverage
38+
39+
# Python test results
40+
aoc2015/aoc2015-python/src/main/resources/de/havox_design/aoc2015/day19/day19result_part2.txt

.gitmodules

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
[submodule "advent-of-code-utils"]
22
path = advent-of-code-utils
33
url = git@github.com:Gentleman1983/advent-of-code-utils.git
4+
branch = 2025.0.1
45
[submodule "advent-of-code"]
56
path = advent-of-code
67
url = git@github.com:Gentleman1983/advent-of-code.git
8+
branch = aoc2015

README.md

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -20,34 +20,34 @@ To run all solutions, simply run `./gradlew run`. If you want to run the solutio
2020

2121
## Current status:
2222

23-
| Day | Part 1 | Part 2 |
24-
|---------|-----------------------------|---------------------------------|
25-
| 1 |![Java](img/java.png) |![Java](img/java.png) |
26-
| 2 |![Java](img/java.png) |![Java](img/java.png) |
27-
| 3 |![Java](img/java.png) |![Java](img/java.png) |
28-
| 4 |![Java](img/java.png) |![Java](img/java.png) |
29-
| 5 |![Java](img/java.png) |![Java](img/java.png) |
30-
| 6 |![Java](img/java.png) |![Java](img/java.png) |
31-
| 7 |![Kotlin](img/kotlin.png) |![Kotlin](img/kotlin.png) |
32-
| 8 |![Java](img/java.png) |![Java](img/java.png) |
33-
| 9 |![Java](img/java.png) |![Java](img/java.png) |
34-
| 10 |![Java](img/java.png) |![Java](img/java.png) |
35-
| 11 |![Java](img/java.png) |![Java](img/java.png) |
36-
| 12 |![Java](img/java.png) |![Java](img/java.png) |
37-
| 13 |![Kotlin](img/kotlin.png) |![Kotlin](img/kotlin.png) |
38-
| 14 |![Java](img/java.png) |![Java](img/java.png) |
39-
| 15 |![Java](img/java.png) |![Java](img/java.png) |
40-
| 16 |![Kotlin](img/kotlin.png) |![Kotlin](img/kotlin.png) |
41-
| 17 |![Java](img/java.png) |![Java](img/java.png) |
42-
| 18 |![Kotlin](img/kotlin.png) |![Kotlin](img/kotlin.png) |
43-
| 19 |![Kotlin](img/kotlin.png) |![Java](img/java.png) |
44-
| 20 |![Java](img/java.png) |![Java](img/java.png) |
45-
| 21 |![Java](img/java.png) |![Java](img/java.png) |
46-
| 22 |![Java](img/java.png) |![Java](img/java.png) |
47-
| 23 |![Java](img/java.png) |![Java](img/java.png) |
48-
| 24 |![Java](img/java.png) |![Java](img/java.png) |
49-
| 25 |![Java](img/java.png) |![Java](img/java.png) |
50-
| **SUM** | **25 ⭐** | **25 ⭐** |
23+
| Day | Part 1 | Part 2 |
24+
|---------|-----------------------------|----------------------------------------------------|
25+
| 1 |![Java](img/java.png) |![Java](img/java.png) |
26+
| 2 |![Java](img/java.png) |![Java](img/java.png) |
27+
| 3 |![Java](img/java.png) |![Java](img/java.png) |
28+
| 4 |![Java](img/java.png) |![Java](img/java.png) |
29+
| 5 |![Java](img/java.png) |![Java](img/java.png) |
30+
| 6 |![Java](img/java.png) |![Java](img/java.png) |
31+
| 7 |![Kotlin](img/kotlin.png) |![Kotlin](img/kotlin.png) |
32+
| 8 |![Java](img/java.png) |![Java](img/java.png) |
33+
| 9 |![Java](img/java.png) |![Java](img/java.png) |
34+
| 10 |![Java](img/java.png) |![Java](img/java.png) |
35+
| 11 |![Java](img/java.png) |![Java](img/java.png) |
36+
| 12 |![Java](img/java.png) |![Java](img/java.png) |
37+
| 13 |![Kotlin](img/kotlin.png) |![Kotlin](img/kotlin.png) |
38+
| 14 |![Java](img/java.png) |![Java](img/java.png) |
39+
| 15 |![Java](img/java.png) |![Java](img/java.png) |
40+
| 16 |![Kotlin](img/kotlin.png) |![Kotlin](img/kotlin.png) |
41+
| 17 |![Java](img/java.png) |![Java](img/java.png) |
42+
| 18 |![Kotlin](img/kotlin.png) |![Kotlin](img/kotlin.png) |
43+
| 19 |![Kotlin](img/kotlin.png) |![Java](img/java.png), ![Python](img/python.png) |
44+
| 20 |![Java](img/java.png) |![Java](img/java.png) |
45+
| 21 |![Java](img/java.png) |![Java](img/java.png) |
46+
| 22 |![Java](img/java.png) |![Java](img/java.png) |
47+
| 23 |![Java](img/java.png) |![Java](img/java.png) |
48+
| 24 |![Java](img/java.png) |![Java](img/java.png) |
49+
| 25 |![Java](img/java.png) |![Java](img/java.png) |
50+
| **SUM** | **25 ⭐** | **25 ⭐** |
5151

5252
Total: 50 ⭐
5353

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
import com.pswidersk.gradle.python.PythonPluginExtension
2+
import com.pswidersk.gradle.python.VenvTask
3+
import org.sonarqube.gradle.SonarExtension
4+
5+
plugins {
6+
alias(libs.plugins.python.plugin)
7+
}
8+
9+
dependencies {
10+
}
11+
12+
tasks.named<Jar>("jar") {
13+
manifest {
14+
attributes["Implementation-Title"] = project.name
15+
attributes["Implementation-Version"] = project.version
16+
}
17+
}
18+
19+
tasks.withType<Test> {
20+
useJUnitPlatform {
21+
includeEngines("scalatest")
22+
}
23+
}
24+
25+
configure<PythonPluginExtension> {
26+
pythonVersion = "3.12"
27+
condaVersion = "25.9.1-0"
28+
installDir = file(rootProject.layout.buildDirectory.file("python"))
29+
}
30+
31+
configure<SonarExtension> {
32+
properties {
33+
property("sonar.python.version", "3.12")
34+
property("sonar.python.coverage.reportPaths", "build/reports/pytest-cov/coverage.xml")
35+
}
36+
}
37+
38+
sourceSets {
39+
main {
40+
java {
41+
srcDir(project.file("src/main/python"))
42+
}
43+
}
44+
test {
45+
java {
46+
srcDir(project.file("src/test/python"))
47+
}
48+
}
49+
}
50+
51+
afterEvaluate {
52+
val pipTask = tasks.register<VenvTask>("pipInstall") {
53+
group = "python"
54+
description = "Prepare Python runtime."
55+
56+
venvExec = "pip"
57+
args = listOf("install", "--isolated", "-r", "requirements.txt")
58+
}
59+
60+
val solveDay19Pt2Task = tasks.register<VenvTask>("solveDay19Part2") {
61+
group = "python"
62+
description = "Solves the 2nd part of AoC 2015 Day 19."
63+
64+
workingDir = project.file("src/main/resources")
65+
args = listOf(project.file("src/main/python/solveDay19Part2.py").toString())
66+
dependsOn(pipTask)
67+
}
68+
69+
val testSolveDay19Part2Task = tasks.register<VenvTask>("testSolveDay19Part2") {
70+
group = "python"
71+
description = "Tests the 2nd part of AoC 2015 Day 19."
72+
73+
venvExec = "pytest"
74+
workingDir = project.file("src/test/resources")
75+
args = listOf(
76+
"--cov-report", "term",
77+
"--cov-report", "html:${project.layout.buildDirectory.file("reports/pytest-cov").get().asFile.canonicalPath}",
78+
"--cov-report", "xml:${project.layout.buildDirectory.file("reports/pytest-cov/coverage.xml").get().asFile.canonicalPath}",
79+
"--cov-report", "json:${project.layout.buildDirectory.file("reports/pytest-cov/coverage.json").get().asFile.canonicalPath}",
80+
"--cov-report", "lcov:${project.layout.buildDirectory.file("reports/pytest-cov/coverage.lcov").get().asFile.canonicalPath}",
81+
"--cov=solveDay19Part2",
82+
project.file("src/test/python/testSolveDay19Part2.py").toString()
83+
)
84+
environment = mapOf(
85+
Pair("PYTHONPATH", project.file("src/main/python").getCanonicalPath())
86+
)
87+
dependsOn(pipTask)
88+
}
89+
90+
tasks.named<JavaCompile>("compileJava") {
91+
dependsOn(solveDay19Pt2Task)
92+
}
93+
94+
tasks.check {
95+
dependsOn(testSolveDay19Part2Task)
96+
}
97+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
pytest
2+
pytest-cov
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
from random import shuffle
2+
3+
def solve():
4+
reps = [("Al", "ThF"), ("Al", "ThRnFAr"), ("B", "BCa"), ("B", "TiB"), ("B", "TiRnFAr"), ("Ca", "CaCa"), ("Ca", "PB"), ("Ca", "PRnFAr"), ("Ca", "SiRnFYFAr"), ("Ca", "SiRnMgAr"), ("Ca", "SiTh"), ("F", "CaF"), ("F", "PMg"), ("F", "SiAl"), ("H", "CRnAlAr"), ("H", "CRnFYFYFAr"), ("H", "CRnFYMgAr"), ("H", "CRnMgYFAr"), ("H", "HCa"), ("H", "NRnFYFAr"), ("H", "NRnMgAr"), ("H", "NTh"), ("H", "OB"), ("H", "ORnFAr"), ("Mg", "BF"), ("Mg", "TiMg"), ("N", "CRnFAr"), ("N", "HSi"), ("O", "CRnFYFAr"), ("O", "CRnMgAr"), ("O", "HP"), ("O", "NRnFAr"), ("O", "OTi"), ("P", "CaP"), ("P", "PTi"), ("P", "SiRnFAr"), ("Si", "CaSi"), ("Th", "ThCa"), ("Ti", "BP"), ("Ti", "TiTi"), ("e", "HF"), ("e", "NAl"), ("e", "OMg")]
5+
6+
mol = "ORnPBPMgArCaCaCaSiThCaCaSiThCaCaPBSiRnFArRnFArCaCaSiThCaCaSiThCaCaCaCaCaCaSiRnFYFArSiRnMgArCaSiRnPTiTiBFYPBFArSiRnCaSiRnTiRnFArSiAlArPTiBPTiRnCaSiAlArCaPTiTiBPMgYFArPTiRnFArSiRnCaCaFArRnCaFArCaSiRnSiRnMgArFYCaSiRnMgArCaCaSiThPRnFArPBCaSiRnMgArCaCaSiThCaSiRnTiMgArFArSiThSiThCaCaSiRnMgArCaCaSiRnFArTiBPTiRnCaSiAlArCaPTiRnFArPBPBCaCaSiThCaPBSiThPRnFArSiThCaSiThCaSiThCaPTiBSiRnFYFArCaCaPRnFArPBCaCaPBSiRnTiRnFArCaPRnFArSiRnCaCaCaSiThCaRnCaFArYCaSiRnFArBCaCaCaSiThFArPBFArCaSiRnFArRnCaCaCaFArSiRnFArTiRnPMgArF"
7+
8+
target = mol
9+
part2 = 0
10+
11+
while target != 'e':
12+
tmp = target
13+
for a, b in reps:
14+
if b not in target:
15+
continue
16+
17+
target = target.replace(b, a, 1)
18+
part2 += 1
19+
20+
if tmp == target:
21+
target = mol
22+
part2 = 0
23+
shuffle(reps)
24+
25+
return part2
26+
27+
28+
result = solve()
29+
print(f"Solution for part 2 via Python: {result}")
30+
with open("../../../../aoc2015-python/src/main/resources/de/havox_design/aoc2015/day19/day19result_part2.txt", 'a') as out:
31+
print(result, file=out)
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
Al => ThF
2+
Al => ThRnFAr
3+
B => BCa
4+
B => TiB
5+
B => TiRnFAr
6+
Ca => CaCa
7+
Ca => PB
8+
Ca => PRnFAr
9+
Ca => SiRnFYFAr
10+
Ca => SiRnMgAr
11+
Ca => SiTh
12+
F => CaF
13+
F => PMg
14+
F => SiAl
15+
H => CRnAlAr
16+
H => CRnFYFYFAr
17+
H => CRnFYMgAr
18+
H => CRnMgYFAr
19+
H => HCa
20+
H => NRnFYFAr
21+
H => NRnMgAr
22+
H => NTh
23+
H => OB
24+
H => ORnFAr
25+
Mg => BF
26+
Mg => TiMg
27+
N => CRnFAr
28+
N => HSi
29+
O => CRnFYFAr
30+
O => CRnMgAr
31+
O => HP
32+
O => NRnFAr
33+
O => OTi
34+
P => CaP
35+
P => PTi
36+
P => SiRnFAr
37+
Si => CaSi
38+
Th => ThCa
39+
Ti => BP
40+
Ti => TiTi
41+
e => HF
42+
e => NAl
43+
e => OMg
44+
45+
ORnPBPMgArCaCaCaSiThCaCaSiThCaCaPBSiRnFArRnFArCaCaSiThCaCaSiThCaCaCaCaCaCaSiRnFYFArSiRnMgArCaSiRnPTiTiBFYPBFArSiRnCaSiRnTiRnFArSiAlArPTiBPTiRnCaSiAlArCaPTiTiBPMgYFArPTiRnFArSiRnCaCaFArRnCaFArCaSiRnSiRnMgArFYCaSiRnMgArCaCaSiThPRnFArPBCaSiRnMgArCaCaSiThCaSiRnTiMgArFArSiThSiThCaCaSiRnMgArCaCaSiRnFArTiBPTiRnCaSiAlArCaPTiRnFArPBPBCaCaSiThCaPBSiThPRnFArSiThCaSiThCaSiThCaPTiBSiRnFYFArCaCaPRnFArPBCaCaPBSiRnTiRnFArCaPRnFArSiRnCaCaCaSiThCaRnCaFArYCaSiRnFArBCaCaCaSiThFArPBFArCaSiRnFArRnCaCaCaFArSiRnFArTiRnPMgArF
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from unittest import TestCase
2+
from solveDay19Part2 import solve
3+
4+
class Test(TestCase):
5+
def test_day19_part2(self):
6+
assert solve() == 207

0 commit comments

Comments
 (0)