From 613cc75237bc73fc76126dca51b276a059f50b01 Mon Sep 17 00:00:00 2001 From: Daylin Morgan Date: Thu, 30 Nov 2023 21:10:34 -0600 Subject: [PATCH] add starter files for 2023 --- .gitignore | 1 + README.md | 3 ++ assets/tree.svg | 65 +++++++++++++++++++++++++++ tools/aoc.nim | 112 ++++++++++++++++++++++++++++++++++++++++++++++ tools/aoc.nim.cfg | 1 + 5 files changed, 182 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 assets/tree.svg create mode 100644 tools/aoc.nim create mode 100644 tools/aoc.nim.cfg diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..06c798b --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +input.txt diff --git a/README.md b/README.md new file mode 100644 index 0000000..3be2fef --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# Advent of Code 2023 + +![tree](./assets/tree.svg) diff --git a/assets/tree.svg b/assets/tree.svg new file mode 100644 index 0000000..77309d9 --- /dev/null +++ b/assets/tree.svg @@ -0,0 +1,65 @@ + + +
+ + +
+
                                                |
+			                       \|/
+			                      --*--
+			                       >o<                         
+			                      >>o<<                        
+			                     >>*>>o<                       
+			                    >>*>O<<<<                      
+			                   >>O>@>>>O<<                     
+			                  >*<<*>>o>>@<<                    
+			                 >@<o>@>>O<<<*<<                   
+			                >*<<<o<O>*<<<*<<<                  
+			               >*>>o>>>*>>>O<@>>*<                 
+			              >>o<<o>*>o<o<<<@>@<<<                
+			             >>*>O>>*>>>O>>*>>>o<<<<               
+			            >o>>*<<O<<*<<o>>>*<O<<<O<              
+			           >O<<@>>>O<<@<<O<O<<O>O>>O<<             
+			          >@>>O>>@<o>o>O<<*>*<<o<<*<<O<            
+			         >o<<<o<<<@>O<*>>@>>*<O<<O>O<*<<           
+			        >>o>*<@<<<o>>*<<<@>o<<<O<<O<o<<*<          
+			       >O<o>>O>>O<<@<<<O>>O<<@<<<o>>>O>>o<         
+			      >o<o<O>>>o>>>o<<<*<<@>>>O>o>>>@<o>>*<        
+			     >>@<<o>*>>>@>>>*<<<O<o<@>@<*<<*>@<<*<o<       
+			    >>@>>o>>>o>*<<<O<*<<<*<<<*>o<<@>O<o>>@>o<      
+			   >@<O>>>@<<o>*<<<o>>>@<<*<<*<<<o<O>O>>O>>>*<     
+			  >@>>o>O>>o>>>O<<O<<<o>>>o>o>>>O>>@<<<o<O<<O<<    
+			 >o<<<@<<*<<<O>>>@>o>O>>O<*<<o>>>o>*<@<@<<<O>o<<   
+			>O>>>@<<<O<*<*>>>@>>>*<*<O<<@<<<o>>>@>>O<@<<<*<<<  
+			                      |   |
+			                      |   |
+			           _  _ __ ___|___|___ __ _  _
+			
+
+
+
+
diff --git a/tools/aoc.nim b/tools/aoc.nim new file mode 100644 index 0000000..1adc617 --- /dev/null +++ b/tools/aoc.nim @@ -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) diff --git a/tools/aoc.nim.cfg b/tools/aoc.nim.cfg new file mode 100644 index 0000000..521e21d --- /dev/null +++ b/tools/aoc.nim.cfg @@ -0,0 +1 @@ +-d:ssl