commit 6f5d482865e943987eadd451ed3369c445b6aea7 Author: Daylin Morgan Date: Sun Dec 1 10:57:37 2024 -0600 setup skeleton for 2024 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/LICENSE b/LICENSE new file mode 100644 index 0000000..429d853 --- /dev/null +++ b/LICENSE @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2023 Daylin Morgan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/README.md b/README.md new file mode 100644 index 0000000..0199862 --- /dev/null +++ b/README.md @@ -0,0 +1,31 @@ +# Advent of Code 2024 + +
+ christmas tree +
+ +To generate a new day and fetch the input's for a puzzle use the below command. +Note: the day and year are inferred from today's date if not specified. +Set advent of code session cookie to `AOC_COOKIE` environment variable. + +```sh +nim r ./src/aoc.nim # -d:1 -y:2024 +``` + +To quickly view solutions from your terminal use my soft-serve instance! + +For an individual solution: + +```sh +ssh -p 23231 git.dayl.in repo blob advent-of-code-2024 solutions/day01/solution.nim +``` + +To interactively explore repo: + +```sh +ssh -p 23231 git.dayl.in -t advent-of-code-2024 +``` 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/config.nims b/config.nims new file mode 100644 index 0000000..9f149aa --- /dev/null +++ b/config.nims @@ -0,0 +1,9 @@ +import std/[algorithm, os, sequtils] + +--noNimblePath +--path:"./src" + +task solve, "run all solutions": + for dir in walkDirRec("solutions", yieldFilter = {pcDir}).toSeq().sortedByIt(it): + echo "--",dir,"--" + selfExec "r --hint:all:off " & dir & "/solution.nim" diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..def3031 --- /dev/null +++ b/flake.lock @@ -0,0 +1,27 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1732837521, + "narHash": "sha256-jNRNr49UiuIwaarqijgdTR2qLPifxsVhlJrKzQ8XUIE=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "970e93b9f82e2a0f3675757eb0bfc73297cc6370", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..6e0fb12 --- /dev/null +++ b/flake.nix @@ -0,0 +1,28 @@ +{ + description = "advent of code 2023"; + + inputs.nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + + outputs = + { nixpkgs, ... }: + let + inherit (nixpkgs.lib) genAttrs; + systems = [ + "x86_64-linux" + "x86_64-darwin" + "aarch64-linux" + "aarch64-darwin" + ]; + forAllSystems = f: genAttrs systems (system: f (import nixpkgs { inherit system; })); + in + { + devShells = forAllSystems (pkgs: { + default = pkgs.mkShell { + packages = with pkgs; [ + nim + openssl + ]; + }; + }); + }; +} diff --git a/src/aoc.nim b/src/aoc.nim new file mode 100644 index 0000000..fa10b8e --- /dev/null +++ b/src/aoc.nim @@ -0,0 +1,132 @@ +import std/[ + httpclient, macros, os, + strformat, strutils, terminal, times +] + +macro solve*(arg: untyped): untyped = + arg.expectKind nnkStmtList + result = newStmtList() + for stmt in arg: + stmt.expectKind nnkCall + stmt[0].expectKind nnkStrLit + stmt[1].expectKind nnkStmtList + for inputs in stmt[1]: + inputs.expectKind nnkCall + inputs[0].expectKind nnkIdent + inputs[1].expectKind nnkStmtList + let + part = inputs[0] + inputFile = stmt[0] + output = inputs[1][0] + msg = newLit(part.repr & "|" & inputFile.strVal) + result.add quote do: + block: + const input = slurp(getProjectPath() / `inputFile`).strip() + let solution = `part`(input) + if solution == `output`: + stdout.styledWriteLine fgGreen, `msg` + else: + stdout.styledWriteLine fgRed, `msg` + stdout.writeLine " expected: ", $`output`, "; got: ", solution + + + +proc errQuit(msg: string) = + stderr.styledWriteLine(fgRed, "AOCError", fgDefault, ": ", msg) + quit 1 + +proc getInput(year, day: int): string = + let aocCookie = getEnv("AOC_COOKIE") + 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) = + let solution = fmt""" +import std/[strutils] +import aoc + +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 + +solve: + "example.txt": + partOne: 0 + partTwo: 0 + "input.txt": + partOne: 0 + partTwo: 0 +""" + let d = fmt"solutions/day{day:0>2}" + writeFile(d / "solution.nim", solution) + +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 environment 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") or dirExists(".jj")): + 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 = parseInt(today.format("d")) + + 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/src/config.nims b/src/config.nims new file mode 100644 index 0000000..fc86e83 --- /dev/null +++ b/src/config.nims @@ -0,0 +1 @@ +--define:ssl