Init
This commit is contained in:
commit
a3766a0666
13
1/solution.nix
Normal file
13
1/solution.nix
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
with import ../utilities.nix;
|
||||||
|
|
||||||
|
let
|
||||||
|
input = readFile ./input;
|
||||||
|
elfCalories = map (grp: map toInt (splitString "\n" grp)) (splitString "\n\n" input);
|
||||||
|
totalsPerElf = map sum elfCalories;
|
||||||
|
|
||||||
|
part1 = maxList totalsPerElf;
|
||||||
|
part2 = sum (topOfList (sortList totalsPerElf) 3);
|
||||||
|
in {
|
||||||
|
inherit part1;
|
||||||
|
inherit part2;
|
||||||
|
}
|
35
2/solution.nix
Normal file
35
2/solution.nix
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
with import ../utilities.nix;
|
||||||
|
|
||||||
|
let
|
||||||
|
# read file
|
||||||
|
input = readFile ./input;
|
||||||
|
matches = map (line: convertMvId (splitString " " line)) (splitString "\n" input);
|
||||||
|
|
||||||
|
# convert moves to numbers for opponent and player
|
||||||
|
# Rock -> 0, Paper -> 1, Scissors 2
|
||||||
|
mvId = c: m: (charToInt m) - (charToInt c);
|
||||||
|
convertMvId = pair: split pair (a: b: [(mvId "A" a) (mvId "X" b)] );
|
||||||
|
|
||||||
|
# scoring matches
|
||||||
|
isWin = a: b: (mod (a+1) 3) == b;
|
||||||
|
isTie = a: b: a == b;
|
||||||
|
getScore = a: b:
|
||||||
|
b + 1 + # add score for the move itself
|
||||||
|
(if isWin a b then 6
|
||||||
|
else if isTie a b then 3
|
||||||
|
else 0); # loss
|
||||||
|
totalScore = m: sum (map (pair: split pair getScore) m);
|
||||||
|
|
||||||
|
# part 2
|
||||||
|
mkDraw = a: a;
|
||||||
|
mkWin = a: (mod (a+1) 3);
|
||||||
|
mkLoss = a: (mod (a+2) 3);
|
||||||
|
bestMove = a: b:
|
||||||
|
if b == 0 then mkLoss a
|
||||||
|
else if b == 1 then mkDraw a
|
||||||
|
else mkWin a;
|
||||||
|
makeBestMoves = m: map (pair: split pair (a: b: [a (bestMove a b)] )) m;
|
||||||
|
in {
|
||||||
|
part1 = totalScore matches;
|
||||||
|
part2 = totalScore (makeBestMoves matches);
|
||||||
|
}
|
21
LICENSE
Normal file
21
LICENSE
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2021 zuckerberg
|
||||||
|
|
||||||
|
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.
|
7
README.md
Normal file
7
README.md
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
# AoC 2022 solved using Nix
|
||||||
|
|
||||||
|
To evaluate, go to the directory of a day and run:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
nix eval -f solution.nix
|
||||||
|
```
|
19
utilities.nix
Normal file
19
utilities.nix
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
|
||||||
|
let
|
||||||
|
lib = import <nixpkgs/lib>;
|
||||||
|
utils = rec {
|
||||||
|
# Passthrough trace for debugging
|
||||||
|
pTrace = v: lib.traceSeq v v;
|
||||||
|
# find the total sum of a int list
|
||||||
|
sum = l: lib.foldr (x: y: x + y) 0 l;
|
||||||
|
# splits a list of length two into two params then they're passed to a func
|
||||||
|
split = pair: f: f (lib.head pair) (lib.last pair);
|
||||||
|
# Finds the max value in a list
|
||||||
|
maxList = l: lib.foldr lib.max 0 l;
|
||||||
|
# Sorts a int list. Greatest value first
|
||||||
|
sortList = l: lib.sort (x: y: x > y) l;
|
||||||
|
# Returns the top cnt items of the list
|
||||||
|
topOfList = l: cnt: lib.take cnt l;
|
||||||
|
};
|
||||||
|
in
|
||||||
|
lib // lib.strings // builtins // utils
|
Loading…
x
Reference in New Issue
Block a user