mirror of
https://github.com/daylinmorgan/advent-of-code-2023.git
synced 2024-12-21 19:10:43 -06:00
add starter files for 2023
This commit is contained in:
parent
88ea2deff4
commit
613cc75237
5 changed files with 182 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
input.txt
|
3
README.md
Normal file
3
README.md
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# Advent of Code 2023
|
||||||
|
|
||||||
|
![tree](./assets/tree.svg)
|
65
assets/tree.svg
Normal file
65
assets/tree.svg
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 800 600" width="800" height="600">
|
||||||
|
<foreignObject width="100%" height="100%">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<style>
|
||||||
|
.calendar .calendar-verycomplete {
|
||||||
|
color: #a6e3a1;
|
||||||
|
}
|
||||||
|
.calendar .calendar-day25.calendar-verycomplete{ color: #f9e2af; }
|
||||||
|
.calendar .calendar-day25.calendar-verycomplete{ text-shadow: 0 0 5px #f9e2af; }
|
||||||
|
.calendar .calendar-trunk { color: #cccccc; }
|
||||||
|
.calendar .calendar-verycomplete .calendar-ornament0 { text-shadow: 0 0 5px ##89b4fa; animation: anim-ornament 3s infinite;}
|
||||||
|
.calendar .calendar-verycomplete .calendar-ornament1 { text-shadow: 0 0 5px #fab387; animation: anim-ornament 3s infinite 1.2s;}
|
||||||
|
.calendar .calendar-verycomplete .calendar-ornament2 { text-shadow: 0 0 5px #f38ba8; animation: anim-ornament 3s infinite 2.4s;}
|
||||||
|
.calendar .calendar-verycomplete .calendar-ornament3 { color: #f9e2af; text-shadow: 0 0 5px #f9e2af}
|
||||||
|
@keyframes anim-ornament {
|
||||||
|
0% { color: ##89b4fa; }
|
||||||
|
32% { color: ##89b4fa; }
|
||||||
|
|
||||||
|
33% { color: #fab387; }
|
||||||
|
65% {color: #fab387; }
|
||||||
|
|
||||||
|
66% { color: #f38ba8;}
|
||||||
|
100% { color: #f38ba8;}
|
||||||
|
}
|
||||||
|
.calendar .calendar-lightbeam { visibility: hidden; color: #666666; }
|
||||||
|
.calendar .calendar-verycomplete .calendar-lightbeam { visibility: visible; }
|
||||||
|
.calendar .calendar-verycomplete .calendar-lightbeam { color: #f9e2af; text-shadow: 0 0 5px #f9e2af; }
|
||||||
|
</style>
|
||||||
|
<!-- tree from https://adventofcode.com/2015 -->
|
||||||
|
<div style="background-color: #0f0f23; padding: 2em">
|
||||||
|
<pre class="calendar calendar-perfect"><span class="calendar-day25 calendar-verycomplete"> <span class="calendar-lightbeam">|</span>
|
||||||
|
<span class="calendar-lightbeam">\</span><span class="calendar-lightbeam">|</span><span class="calendar-lightbeam">/</span>
|
||||||
|
<span class="calendar-lightbeam">-</span><span class="calendar-lightbeam">-</span>*<span class="calendar-lightbeam">-</span><span class="calendar-lightbeam">-</span></span>
|
||||||
|
<span class="calendar-verycomplete"> ><span class="calendar-ornament1">o</span>< </span>
|
||||||
|
<span class="calendar-verycomplete"> >><span class="calendar-ornament1">o</span><< </span>
|
||||||
|
<span class="calendar-verycomplete"> >><span class="calendar-ornament3">*</span>>><span class="calendar-ornament1">o</span>< </span>
|
||||||
|
<span class="calendar-verycomplete"> >><span class="calendar-ornament3">*</span>><span class="calendar-ornament0">O</span><<<< </span>
|
||||||
|
<span class="calendar-verycomplete"> >><span class="calendar-ornament0">O</span>><span class="calendar-ornament2">@</span>>>><span class="calendar-ornament0">O</span><< </span>
|
||||||
|
<span class="calendar-verycomplete"> ><span class="calendar-ornament3">*</span><<<span class="calendar-ornament3">*</span>>><span class="calendar-ornament1">o</span>>><span class="calendar-ornament2">@</span><< </span>
|
||||||
|
<span class="calendar-verycomplete"> ><span class="calendar-ornament2">@</span><<span class="calendar-ornament1">o</span>><span class="calendar-ornament2">@</span>>><span class="calendar-ornament0">O</span><<<<span class="calendar-ornament3">*</span><< </span>
|
||||||
|
<span class="calendar-verycomplete"> ><span class="calendar-ornament3">*</span><<<<span class="calendar-ornament1">o</span><<span class="calendar-ornament0">O</span>><span class="calendar-ornament3">*</span><<<<span class="calendar-ornament3">*</span><<< </span>
|
||||||
|
<span class="calendar-verycomplete"> ><span class="calendar-ornament3">*</span>>><span class="calendar-ornament1">o</span>>>><span class="calendar-ornament3">*</span>>>><span class="calendar-ornament0">O</span><<span class="calendar-ornament2">@</span>>><span class="calendar-ornament3">*</span>< </span>
|
||||||
|
<span class="calendar-verycomplete"> >><span class="calendar-ornament1">o</span><<<span class="calendar-ornament1">o</span>><span class="calendar-ornament3">*</span>><span class="calendar-ornament1">o</span><<span class="calendar-ornament1">o</span><<<<span class="calendar-ornament2">@</span>><span class="calendar-ornament2">@</span><<< </span>
|
||||||
|
<span class="calendar-verycomplete"> >><span class="calendar-ornament3">*</span>><span class="calendar-ornament0">O</span>>><span class="calendar-ornament3">*</span>>>><span class="calendar-ornament0">O</span>>><span class="calendar-ornament3">*</span>>>><span class="calendar-ornament1">o</span><<<< </span>
|
||||||
|
<span class="calendar-verycomplete"> ><span class="calendar-ornament1">o</span>>><span class="calendar-ornament3">*</span><<<span class="calendar-ornament0">O</span><<<span class="calendar-ornament3">*</span><<<span class="calendar-ornament1">o</span>>>><span class="calendar-ornament3">*</span><<span class="calendar-ornament0">O</span><<<<span class="calendar-ornament0">O</span>< </span>
|
||||||
|
<span class="calendar-verycomplete"> ><span class="calendar-ornament0">O</span><<<span class="calendar-ornament2">@</span>>>><span class="calendar-ornament0">O</span><<<span class="calendar-ornament2">@</span><<<span class="calendar-ornament0">O</span><<span class="calendar-ornament0">O</span><<<span class="calendar-ornament0">O</span>><span class="calendar-ornament0">O</span>>><span class="calendar-ornament0">O</span><< </span>
|
||||||
|
<span class=" calendar-verycomplete"> ><span class="calendar-ornament2">@</span>>><span class="calendar-ornament0">O</span>>><span class="calendar-ornament2">@</span><<span class="calendar-ornament1">o</span>><span class="calendar-ornament1">o</span>><span class="calendar-ornament0">O</span><<<span class="calendar-ornament3">*</span>><span class="calendar-ornament3">*</span><<<span class="calendar-ornament1">o</span><<<span class="calendar-ornament3">*</span><<<span class="calendar-ornament0">O</span>< </span>
|
||||||
|
<span class=" calendar-verycomplete"> ><span class="calendar-ornament1">o</span><<<<span class="calendar-ornament1">o</span><<<<span class="calendar-ornament2">@</span>><span class="calendar-ornament0">O</span><<span class="calendar-ornament3">*</span>>><span class="calendar-ornament2">@</span>>><span class="calendar-ornament3">*</span><<span class="calendar-ornament0">O</span><<<span class="calendar-ornament0">O</span>><span class="calendar-ornament0">O</span><<span class="calendar-ornament3">*</span><< </span>
|
||||||
|
<span class="calendar-verycomplete"> >><span class="calendar-ornament1">o</span>><span class="calendar-ornament3">*</span><<span class="calendar-ornament2">@</span><<<<span class="calendar-ornament1">o</span>>><span class="calendar-ornament3">*</span><<<<span class="calendar-ornament2">@</span>><span class="calendar-ornament1">o</span><<<<span class="calendar-ornament0">O</span><<<span class="calendar-ornament0">O</span><<span class="calendar-ornament1">o</span><<<span class="calendar-ornament3">*</span>< </span>
|
||||||
|
<span class="calendar-verycomplete"> ><span class="calendar-ornament0">O</span><<span class="calendar-ornament1">o</span>>><span class="calendar-ornament0">O</span>>><span class="calendar-ornament0">O</span><<<span class="calendar-ornament2">@</span><<<<span class="calendar-ornament0">O</span>>><span class="calendar-ornament0">O</span><<<span class="calendar-ornament2">@</span><<<<span class="calendar-ornament1">o</span>>>><span class="calendar-ornament0">O</span>>><span class="calendar-ornament1">o</span>< </span>
|
||||||
|
<span class="calendar-verycomplete"> ><span class="calendar-ornament1">o</span><<span class="calendar-ornament1">o</span><<span class="calendar-ornament0">O</span>>>><span class="calendar-ornament1">o</span>>>><span class="calendar-ornament1">o</span><<<<span class="calendar-ornament3">*</span><<<span class="calendar-ornament2">@</span>>>><span class="calendar-ornament0">O</span>><span class="calendar-ornament1">o</span>>>><span class="calendar-ornament2">@</span><<span class="calendar-ornament1">o</span>>><span class="calendar-ornament3">*</span>< </span>
|
||||||
|
<span class="calendar-verycomplete"> >><span class="calendar-ornament2">@</span><<<span class="calendar-ornament1">o</span>><span class="calendar-ornament3">*</span>>>><span class="calendar-ornament2">@</span>>>><span class="calendar-ornament3">*</span><<<<span class="calendar-ornament0">O</span><<span class="calendar-ornament1">o</span><<span class="calendar-ornament2">@</span>><span class="calendar-ornament2">@</span><<span class="calendar-ornament3">*</span><<<span class="calendar-ornament3">*</span>><span class="calendar-ornament2">@</span><<<span class="calendar-ornament3">*</span><<span class="calendar-ornament1">o</span>< </span>
|
||||||
|
<span class="calendar-verycomplete"> >><span class="calendar-ornament2">@</span>>><span class="calendar-ornament1">o</span>>>><span class="calendar-ornament1">o</span>><span class="calendar-ornament3">*</span><<<<span class="calendar-ornament0">O</span><<span class="calendar-ornament3">*</span><<<<span class="calendar-ornament3">*</span><<<<span class="calendar-ornament3">*</span>><span class="calendar-ornament1">o</span><<<span class="calendar-ornament2">@</span>><span class="calendar-ornament0">O</span><<span class="calendar-ornament1">o</span>>><span class="calendar-ornament2">@</span>><span class="calendar-ornament1">o</span>< </span>
|
||||||
|
<span class="calendar-verycomplete"> ><span class="calendar-ornament2">@</span><<span class="calendar-ornament0">O</span>>>><span class="calendar-ornament2">@</span><<<span class="calendar-ornament1">o</span>><span class="calendar-ornament3">*</span><<<<span class="calendar-ornament1">o</span>>>><span class="calendar-ornament2">@</span><<<span class="calendar-ornament3">*</span><<<span class="calendar-ornament3">*</span><<<<span class="calendar-ornament1">o</span><<span class="calendar-ornament0">O</span>><span class="calendar-ornament0">O</span>>><span class="calendar-ornament0">O</span>>>><span class="calendar-ornament3">*</span>< </span>
|
||||||
|
<span class="calendar-verycomplete"> ><span class="calendar-ornament2">@</span>>><span class="calendar-ornament1">o</span>><span class="calendar-ornament0">O</span>>><span class="calendar-ornament1">o</span>>>><span class="calendar-ornament0">O</span><<<span class="calendar-ornament0">O</span><<<<span class="calendar-ornament1">o</span>>>><span class="calendar-ornament1">o</span>><span class="calendar-ornament1">o</span>>>><span class="calendar-ornament0">O</span>>><span class="calendar-ornament2">@</span><<<<span class="calendar-ornament1">o</span><<span class="calendar-ornament0">O</span><<<span class="calendar-ornament0">O</span><< </span>
|
||||||
|
<span class="calendar-verycomplete"> ><span class="calendar-ornament1">o</span><<<<span class="calendar-ornament2">@</span><<<span class="calendar-ornament3">*</span><<<<span class="calendar-ornament0">O</span>>>><span class="calendar-ornament2">@</span>><span class="calendar-ornament1">o</span>><span class="calendar-ornament0">O</span>>><span class="calendar-ornament0">O</span><<span class="calendar-ornament3">*</span><<<span class="calendar-ornament1">o</span>>>><span class="calendar-ornament1">o</span>><span class="calendar-ornament3">*</span><<span class="calendar-ornament2">@</span><<span class="calendar-ornament2">@</span><<<<span class="calendar-ornament0">O</span>><span class="calendar-ornament1">o</span><< </span>
|
||||||
|
<span class="calendar-verycomplete">><span class="calendar-ornament0">O</span>>>><span class="calendar-ornament2">@</span><<<<span class="calendar-ornament0">O</span><<span class="calendar-ornament3">*</span><<span class="calendar-ornament3">*</span>>>><span class="calendar-ornament2">@</span>>>><span class="calendar-ornament3">*</span><<span class="calendar-ornament3">*</span><<span class="calendar-ornament0">O</span><<<span class="calendar-ornament2">@</span><<<<span class="calendar-ornament1">o</span>>>><span class="calendar-ornament2">@</span>>><span class="calendar-ornament0">O</span><<span class="calendar-ornament2">@</span><<<<span class="calendar-ornament3">*</span><<< </span>
|
||||||
|
<span class="calendar-trunk"> | |
|
||||||
|
| |
|
||||||
|
_ _ __ ___|___|___ __ _ _</span>
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 14 KiB |
112
tools/aoc.nim
Normal file
112
tools/aoc.nim
Normal file
|
@ -0,0 +1,112 @@
|
||||||
|
import std/[httpclient, os, strformat, strutils, terminal, times]
|
||||||
|
|
||||||
|
let aocCookie = getEnv("AOC_COOKIE")
|
||||||
|
|
||||||
|
proc errQuit(msg: string) =
|
||||||
|
stderr.styledWriteLine(fgRed, "AOCError", fgDefault, ": ", msg)
|
||||||
|
quit 1
|
||||||
|
|
||||||
|
proc getInput(year, day: int): string =
|
||||||
|
let url = fmt"https://adventofcode.com/{year}/day/{day}/input"
|
||||||
|
var response: Response
|
||||||
|
var client = newHttpClient()
|
||||||
|
client.headers = newHttpHeaders({"Cookie": aocCookie})
|
||||||
|
try:
|
||||||
|
response = client.request(url)
|
||||||
|
finally:
|
||||||
|
client.close()
|
||||||
|
return response.body().strip()
|
||||||
|
|
||||||
|
proc skeleton(day: int) =
|
||||||
|
const solution = """
|
||||||
|
import std/[strutils]
|
||||||
|
|
||||||
|
const example* = slurp("example.txt").strip()
|
||||||
|
const input* = slurp("input.txt").strip()
|
||||||
|
|
||||||
|
proc parseInput(input: string)
|
||||||
|
|
||||||
|
proc partOne*(input: string): int = 0
|
||||||
|
proc partTwo*(input: string): int = 0
|
||||||
|
|
||||||
|
when isMainModule:
|
||||||
|
echo partOne(example)
|
||||||
|
echo partOne(input)
|
||||||
|
echo partTwo(example)
|
||||||
|
echo partTwo(input)
|
||||||
|
"""
|
||||||
|
let test = fmt"""
|
||||||
|
import std/unittest
|
||||||
|
import ./solution
|
||||||
|
|
||||||
|
suite "day {day}":
|
||||||
|
test "part one":
|
||||||
|
check partOne(example) == 0
|
||||||
|
check partOne(input) == 0
|
||||||
|
test "part two":
|
||||||
|
check partTwo(example) == 0
|
||||||
|
check partTwo(input) == 0
|
||||||
|
|
||||||
|
"""
|
||||||
|
let d = fmt"solutions/day{day:0>2}"
|
||||||
|
writeFile(d / "solution.nim", solution)
|
||||||
|
writeFile(d / "test.nim", test)
|
||||||
|
|
||||||
|
proc newDay(year, day: int) =
|
||||||
|
let d = fmt"solutions/day{day:0>2}"
|
||||||
|
createDir d
|
||||||
|
let input = getInput(year, day)
|
||||||
|
if input.startsWith "Puzzle inputs differ by user.":
|
||||||
|
errQuit "faild to get input check cookie environemnt variable, AOC_COOKIE"
|
||||||
|
elif input.startsWith "Please don't repeatedly request this endpoint before it unlocks!":
|
||||||
|
errQuit "don't abuse the service and make sure the day exists first"
|
||||||
|
writeFile(d / "input.txt", input)
|
||||||
|
skeleton(day)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
when isMainModule:
|
||||||
|
import std/parseopt
|
||||||
|
if not dirExists ".git":
|
||||||
|
errQuit "only run from root dir of project"
|
||||||
|
const help = """
|
||||||
|
!
|
||||||
|
-~*~-
|
||||||
|
/!\
|
||||||
|
/%;@\
|
||||||
|
o/@,%\o
|
||||||
|
/%;`@,\
|
||||||
|
o/@'%',\o
|
||||||
|
'^^^N^^^`
|
||||||
|
|
||||||
|
usage:
|
||||||
|
aoc [opts]
|
||||||
|
|
||||||
|
options:
|
||||||
|
-d, --day int day of the month
|
||||||
|
-y, --year int day of the year
|
||||||
|
"""
|
||||||
|
let today = now()
|
||||||
|
var
|
||||||
|
year = today.year
|
||||||
|
day = today.weekday.ord
|
||||||
|
|
||||||
|
for kind, key, val in getopt():
|
||||||
|
case kind
|
||||||
|
of cmdArgument:
|
||||||
|
discard
|
||||||
|
of cmdLongOption, cmdShortOption:
|
||||||
|
case key:
|
||||||
|
of "y", "year":
|
||||||
|
year = parseInt(val)
|
||||||
|
of "d", "day":
|
||||||
|
day = parseInt(val)
|
||||||
|
of "h", "help":
|
||||||
|
echo help; quit 0
|
||||||
|
of cmdEnd:
|
||||||
|
discard
|
||||||
|
|
||||||
|
echo "Fetching input for: "
|
||||||
|
echo fmt" year -> {year}"
|
||||||
|
echo fmt" day -> {day}"
|
||||||
|
newDay(year, day)
|
1
tools/aoc.nim.cfg
Normal file
1
tools/aoc.nim.cfg
Normal file
|
@ -0,0 +1 @@
|
||||||
|
-d:ssl
|
Loading…
Reference in a new issue