Skip to content

Commit c63d0ad

Browse files
committed
automation
1 parent 04cc980 commit c63d0ad

10 files changed

+191
-29
lines changed

Aoc2024/Day09/Examples.lean

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
def exampleInput :=
2+
"..."

Aoc2024/Day09/Main.lean

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import Aoc2024.Day09.Solve
2+
import Aoc2024.CustomMonadLift
3+
4+
def main : IO Unit := do
5+
IO.println "Day 09"
6+
IO.println ""
7+
IO.println "Part 1"
8+
let exampleInput <- IO.FS.readFile "Aoc2024/Day09/inputs/example.txt"
9+
let puzzleInput <- IO.FS.readFile "Aoc2024/Day09/inputs/input.txt"
10+
IO.println s!"Example: {<- parseAndSolvePart1 exampleInput}"
11+
let answerPart1 <- parseAndSolvePart1 puzzleInput
12+
IO.println s!"Puzzle: {answerPart1}"
13+
assert! (answerPart1 == -1)
14+
IO.println ""
15+
IO.println "Part 2"
16+
IO.println s!"Example: {<- parseAndSolvePart2 exampleInput}"
17+
let answerPart2 <- parseAndSolvePart2 puzzleInput
18+
IO.println s!"Puzzle: {answerPart2}"
19+
assert! (answerPart2 == -1)

Aoc2024/Day09/Parser.lean

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import Aoc2024.Day09.Examples
2+
import Aoc2024.Day09.Types
3+
import Aoc2024.Utils
4+
import Std
5+
open Std.Internal.Parsec.String
6+
open Std.Internal.Parsec
7+
8+
private def inputParser : Parser (List Int) := sorry
9+
10+
def parseInput : String -> Except String (List Int) := inputParser.run
11+
12+
-- #guard parseInput exampleInput == Except.ok 42

Aoc2024/Day09/Solve.lean

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import Aoc2024.Utils
2+
import Aoc2024.Day09.Examples
3+
import Aoc2024.Day09.Parser
4+
import Aoc2024.Day09.Types
5+
6+
-- Part 1
7+
8+
private def solvePart1 (input : List Int) : Int := sorry
9+
10+
def parseAndSolvePart1 (s : String): Except String Int := parseInput s |>.map solvePart1
11+
12+
-- #guard parseAndSolvePart1 exampleInput == Except.ok -1
13+
14+
-- Part 2
15+
16+
private def solvePart2 (input : List Int) : Int := sorry
17+
18+
def parseAndSolvePart2 (s : String): Except String Int := parseInput s |>.map solvePart2
19+
20+
-- #guard parseAndSolvePart2 exampleInput == Except.ok -1

Aoc2024/Day09/Types.lean

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
import Aoc2024.Utils

Aoc2024/Day09/inputs/example.txt

Whitespace-only changes.

Aoc2024/Day09/inputs/input.txt

Whitespace-only changes.

Taskfile.yml

+44-29
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,71 @@
11
version: '3'
2-
32
tasks:
43
default: task --list
54
build:
65
desc: Build
76
sources:
8-
- Aoc2024/**/*.lean
7+
- Aoc2024/**/*.lean
98
generates:
10-
- .lake/build/bin/*
9+
- .lake/build/bin/*
1110
cmds:
12-
- lake build
11+
- lake build
1312
make-day:
1413
desc: Template a day
1514
cmds:
16-
- ./make-day.sh {{.CLI_ARGS}}
15+
- ./make-day.sh {{.CLI_ARGS}}
16+
- ./add_day_to_taskfile.py {{.CLI_ARGS}}
17+
- ./add_day_to_lakefile.py {{.CLI_ARGS}}
1718
day1:
1819
desc: Run day 1
19-
deps: [build]
20-
cmds:
21-
- .lake/build/bin/day1
20+
deps:
21+
- build
22+
cmds:
23+
- .lake/build/bin/day1
2224
day2:
2325
desc: Run day 2
24-
deps: [build]
25-
cmds:
26-
- .lake/build/bin/day2
26+
deps:
27+
- build
28+
cmds:
29+
- .lake/build/bin/day2
2730
day3:
2831
desc: Run day 3
29-
deps: [build]
30-
cmds:
31-
- .lake/build/bin/day3
32+
deps:
33+
- build
34+
cmds:
35+
- .lake/build/bin/day3
3236
day4:
3337
desc: Run day 4
34-
deps: [build]
35-
cmds:
36-
- .lake/build/bin/day4
38+
deps:
39+
- build
40+
cmds:
41+
- .lake/build/bin/day4
3742
day5:
3843
desc: Run day 5
39-
deps: [build]
40-
cmds:
41-
- .lake/build/bin/day5
44+
deps:
45+
- build
46+
cmds:
47+
- .lake/build/bin/day5
4248
day6:
4349
desc: Run day 6
44-
deps: [build]
45-
cmds:
46-
- .lake/build/bin/day6
50+
deps:
51+
- build
52+
cmds:
53+
- .lake/build/bin/day6
4754
day7:
4855
desc: Run day 7
49-
deps: [build]
50-
cmds:
51-
- .lake/build/bin/day7
56+
deps:
57+
- build
58+
cmds:
59+
- .lake/build/bin/day7
5260
day8:
5361
desc: Run day 8
54-
deps: [build]
55-
cmds:
56-
- .lake/build/bin/day8
62+
deps:
63+
- build
64+
cmds:
65+
- .lake/build/bin/day8
66+
day9:
67+
desc: Run day 9
68+
deps:
69+
- build
70+
cmds:
71+
- .lake/build/bin/day9

add_day_to_lakefile.py

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
#!/usr/bin/env nix-shell
2+
#!nix-shell -i python -p python3Packages.toml
3+
4+
import sys
5+
import toml
6+
7+
def add_day_to_lakefile(file_path, day_number):
8+
try:
9+
with open(file_path, 'r') as file:
10+
lakefile = toml.load(file)
11+
12+
# Update defaultTargets
13+
default_targets = lakefile.get('defaultTargets', [])
14+
new_target = f"day{day_number}"
15+
if new_target in default_targets:
16+
print(f"Target '{new_target}' already exists in defaultTargets.")
17+
else:
18+
default_targets.append(new_target)
19+
lakefile['defaultTargets'] = default_targets
20+
21+
# Add new lean_exe entry
22+
lean_exes = lakefile.get('lean_exe', [])
23+
new_exe = {
24+
"name": f"day{day_number}",
25+
"root": f"Aoc2024.Day{day_number:02d}.Main"
26+
}
27+
if any(exe['name'] == new_exe['name'] for exe in lean_exes):
28+
print(f"Lean exe '{new_exe['name']}' already exists.")
29+
else:
30+
lean_exes.append(new_exe)
31+
lakefile['lean_exe'] = lean_exes
32+
33+
# Write back to the file
34+
with open(file_path, 'w') as file:
35+
toml.dump(lakefile, file)
36+
37+
print(f"Day {day_number} added successfully.")
38+
except Exception as e:
39+
print(f"Error: {e}")
40+
41+
if __name__ == "__main__":
42+
if len(sys.argv) != 3:
43+
print("Usage: python add_day_to_lakefile.py <lakefile.toml> <N>")
44+
sys.exit(1)
45+
46+
file_path = sys.argv[1]
47+
try:
48+
day_number = int(sys.argv[2])
49+
add_day_to_lakefile(file_path, day_number)
50+
except ValueError:
51+
print("Error: N must be an integer.")
52+
sys.exit(1)

add_day_to_taskfile.py

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#!/usr/bin/env nix-shell
2+
#!nix-shell -i python -p python3Packages.pyyaml
3+
4+
import sys
5+
import yaml
6+
7+
def add_day_to_taskfile(file_path, day_number):
8+
try:
9+
with open(file_path, 'r') as file:
10+
taskfile = yaml.safe_load(file)
11+
12+
day_task_name = f"day{day_number}"
13+
if day_task_name in taskfile['tasks']:
14+
print(f"Task '{day_task_name}' already exists in {file_path}.")
15+
return
16+
17+
taskfile['tasks'][day_task_name] = {
18+
'desc': f"Run day {day_number}",
19+
'deps': ['build'],
20+
'cmds': [f".lake/build/bin/day{day_number}"]
21+
}
22+
23+
with open(file_path, 'w') as file:
24+
yaml.dump(taskfile, file, default_flow_style=False, sort_keys=False)
25+
26+
print(f"Task '{day_task_name}' added successfully.")
27+
except Exception as e:
28+
print(f"Error: {e}")
29+
30+
if __name__ == "__main__":
31+
if len(sys.argv) != 3:
32+
print("Usage: python add_day_to_taskfile.py <Taskfile.yml> <N>")
33+
sys.exit(1)
34+
35+
file_path = sys.argv[1]
36+
try:
37+
day_number = int(sys.argv[2])
38+
add_day_to_taskfile(file_path, day_number)
39+
except ValueError:
40+
print("Error: N must be an integer.")
41+
sys.exit(1)

0 commit comments

Comments
 (0)