Move 2022 into a separate directory
This commit is contained in:
13
2022/README.md
Normal file
13
2022/README.md
Normal file
@@ -0,0 +1,13 @@
|
||||
# Advent of code 2022 - Nix
|
||||
|
||||
This is [Advent of Code 2022][aoc2022] (or at least as far as I'm able to get before having to deal with my exams...)
|
||||
|
||||
They're written in nix this year.
|
||||
|
||||
To run the code:
|
||||
|
||||
```
|
||||
nix build github:h7x4/aoc2022#day01
|
||||
```
|
||||
|
||||
[aoc2022]: https://adventofcode.com/2022
|
||||
32
2022/day01/default.nix
Normal file
32
2022/day01/default.nix
Normal file
@@ -0,0 +1,32 @@
|
||||
{ pkgs, lib, ... }:
|
||||
|
||||
with lib;
|
||||
|
||||
let
|
||||
elves = pipe (builtins.readFile ./input.txt) [
|
||||
(splitString "\n\n")
|
||||
(map (splitString "\n"))
|
||||
(map (map toInt))
|
||||
(map (fold add 0))
|
||||
];
|
||||
|
||||
answer1 = toString (fold max (-1) elves);
|
||||
|
||||
max3 = abc: x: if x >= abc.a then { a = x; b = abc.a; c = abc.b; } else
|
||||
if x >= abc.b then { a = abc.a; b = x; c = abc.b; } else
|
||||
if x >= abc.c then { inherit (abc) a b; c = x; } else
|
||||
abc;
|
||||
|
||||
answer2 = pipe elves [
|
||||
(foldl max3 { a = -1; b = -1; c = -1; })
|
||||
(abc: abc.a + abc.b + abc.c)
|
||||
toString
|
||||
];
|
||||
|
||||
in pkgs.writeText "answers" ''
|
||||
Task1:
|
||||
${answer1}
|
||||
|
||||
Task2:
|
||||
${answer2}
|
||||
''
|
||||
2265
2022/day01/input.txt
Normal file
2265
2022/day01/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
53
2022/day02/default.nix
Normal file
53
2022/day02/default.nix
Normal file
@@ -0,0 +1,53 @@
|
||||
{ pkgs, lib, ... }:
|
||||
|
||||
with lib;
|
||||
|
||||
let
|
||||
guide = pipe (builtins.readFile ./input.txt) [
|
||||
(splitString "\n")
|
||||
(map (splitString " "))
|
||||
(map (xs: { they = elemAt xs 0; you = elemAt xs 1; }))
|
||||
];
|
||||
|
||||
inherentValue = x: { A = 1; B = 2; C = 3; }.${x};
|
||||
|
||||
comparativeValue = { they, you }: if they == you then 3 else
|
||||
if (they == "A" && you == "B")
|
||||
|| (they == "B" && you == "C")
|
||||
|| (they == "C" && you == "A") then 6 else
|
||||
0;
|
||||
|
||||
score = match: comparativeValue match + inherentValue match.you;
|
||||
|
||||
equalizeValueType = x: { X = "A"; Y = "B"; Z = "C"; }.${x};
|
||||
|
||||
answer1 = pipe guide [
|
||||
(map (match@{ you, ... }: match // { you = equalizeValueType you; }))
|
||||
(map score)
|
||||
(foldr add 0)
|
||||
toString
|
||||
];
|
||||
|
||||
inherentValue2 = { they, you }: {
|
||||
X = { A = 3; B = 1; C = 2; };
|
||||
Y = { A = 1; B = 2; C = 3; };
|
||||
Z = { A = 2; B = 3; C = 1; };
|
||||
}.${you}.${they};
|
||||
|
||||
comparativeValue2 = x: { X = 0; Y = 3; Z = 6; }.${x};
|
||||
|
||||
score2 = match: comparativeValue2 match.you + inherentValue2 match;
|
||||
|
||||
answer2 = pipe guide [
|
||||
(map score2)
|
||||
(foldr add 0)
|
||||
toString
|
||||
];
|
||||
|
||||
in pkgs.writeText "answers" ''
|
||||
Task1:
|
||||
${answer1}
|
||||
|
||||
Task2:
|
||||
${answer2}
|
||||
''
|
||||
2500
2022/day02/input.txt
Normal file
2500
2022/day02/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
70
2022/day03/default.nix
Normal file
70
2022/day03/default.nix
Normal file
@@ -0,0 +1,70 @@
|
||||
{ pkgs, lib, AoCLib, ... }:
|
||||
|
||||
with lib;
|
||||
|
||||
let
|
||||
inherit (AoCLib) transformRange chunksOf;
|
||||
|
||||
compartments = pipe (fileContents ./input.txt) [
|
||||
(splitString "\n")
|
||||
];
|
||||
|
||||
splitAtMiddle = s: {
|
||||
c1 = substring 0 ((stringLength s) / 2) s;
|
||||
c2 = substring ((stringLength s) / 2) (stringLength s) s;
|
||||
};
|
||||
|
||||
charsToSet = s: foldl (set: c: set // { ${c} = true; }) { } (stringToCharacters s);
|
||||
|
||||
getCommonChar = { c1, c2 }:
|
||||
findSingle
|
||||
(c: c2.${c} or false)
|
||||
"Error: no common chars"
|
||||
"Error: multiple chars"
|
||||
(attrNames c1);
|
||||
|
||||
charValue = c: pipe c [
|
||||
lib.strings.charToInt
|
||||
(transformRange 65 91 (-(65 - 27)))
|
||||
(transformRange 97 123 (-(97 - 1)))
|
||||
];
|
||||
|
||||
answer1 = pipe compartments [
|
||||
(map splitAtMiddle)
|
||||
(map (mapAttrs (_: charsToSet)))
|
||||
(map getCommonChar)
|
||||
(map charValue)
|
||||
(foldr add 0)
|
||||
toString
|
||||
];
|
||||
|
||||
toA123 = l: {
|
||||
a1 = elemAt l 0;
|
||||
a2 = elemAt l 1;
|
||||
a3 = elemAt l 2;
|
||||
};
|
||||
|
||||
getCommonChar2 = { a1, a2, a3 }:
|
||||
findSingle
|
||||
(c: a2.${c} or false && a3.${c} or false)
|
||||
"Error: no common chars"
|
||||
"Error: multiple chars"
|
||||
(attrNames a1);
|
||||
|
||||
answer2 = pipe compartments [
|
||||
(chunksOf 3)
|
||||
(map toA123)
|
||||
(map (mapAttrs (_: charsToSet)))
|
||||
(map getCommonChar2)
|
||||
(map charValue)
|
||||
(foldr add 0)
|
||||
toString
|
||||
];
|
||||
|
||||
in pkgs.writeText "answers" ''
|
||||
Task1:
|
||||
${answer1}
|
||||
|
||||
Task2:
|
||||
${answer2}
|
||||
''
|
||||
300
2022/day03/input.txt
Normal file
300
2022/day03/input.txt
Normal file
@@ -0,0 +1,300 @@
|
||||
lflZfgnSnlmmlgGfjGthQPtLNsQhvbHLLpSS
|
||||
zrCVDVFMJTCTcCJMwCThWbtbpbWpPbtbHPLQssLsHP
|
||||
rBFcrwFzFwwVDcDrzTzJfnRGjllBdGZnnZfhqmdn
|
||||
FjpnFRDmbRtnbJrFJmSTsGShWVhGqGVVsmqs
|
||||
ZwPvNPdzNZwfzBNLdNNNNcLvhnQhqMTVsTGSWSqGqTdVWhMT
|
||||
vgLZHfvLffNLPbggnrbFpJnCbC
|
||||
hzJzGjGfqmGtDQtDSvVV
|
||||
plpcMBNBcCTlTgCMbvtrsSVsVJDJlrwDQr
|
||||
McHBMMcTTHgJnWqnRqjzZnnRzR
|
||||
ppvsGZhDGprrSjSllwfZ
|
||||
TTFMMFJMgMHmHmdqdSvNqlSSSNJv
|
||||
mgBPHTRWFRVcpvsVttppbv
|
||||
ZZDssfMDMtqqppZLLJzmzSTwNJplTSgpgm
|
||||
BdCRRHFRbccWWBvBHCdcJVngNVSvTgVNzgNNVmnz
|
||||
QHFFrBdcGtqPmmQh
|
||||
qLvQFRgLSSNgqQvRrqLTQvLttwDBFWDwjwFttDdlBBwBwM
|
||||
nbsmZnbmHbZVCGPVmHWtwlStBDtwBMtwWHMj
|
||||
CnCbhGCPpPCSnZmrgRNRqNRrLNgrzh
|
||||
vgLWWHRNLnWwLggWzwLFFzMmBMRMhMhTbhsmmsbbmQTm
|
||||
rScpJJDDpjtSDPPPJDpjqPCHBBtlTdblmmlhBsMMmTsbmtsl
|
||||
GHZHCPprSSwgvWNVwVZv
|
||||
dMrCMJMqvtdFwcjczjQzThtm
|
||||
gGbLblLpZlHvllQhlQwcjT
|
||||
GHRWvPRbPHPRvNGbvdRBqdqBBfRqBqnrfF
|
||||
VsHcljlbhmHbHHlcjVcVShJSCdJCfMrMMQDfRNFCfMRGfNrQ
|
||||
tGtvLtpgBTGvDMMRdMMgdCNM
|
||||
pnGnGqGtvtzTLjWqmSSjHhWhWs
|
||||
NJTDntDNDVjNnjBfjjjcCZCZcVqCSCLqcSScCc
|
||||
zvhgRgQvvdllgQbHghlvHrRHSScBCRqqwCLGqSMCZCGGGqMZ
|
||||
pvvrHzdgvlgzQphQsDFmnsNTTtjfjJJmPB
|
||||
ScnSZSZZlmjmHjjWHHWZftJVJpppwtVVnLJtnptnwt
|
||||
CFFlQBbbPQqrBwJrJJrGJD
|
||||
PgTqRddFzgdRPFFbFgqQFgsSjfHWfSHmSMWcjZlmZmjTZM
|
||||
lzBRtctbnBRBRBBWnDnDWjlLVvwGMrvwrHHQHGmDvHQvHGrV
|
||||
FsTgFCTSgsCNspzhCGMfTHQVwVMfMmMmrH
|
||||
hSdSFgghhqpRbLqjntqnPz
|
||||
DCDnNGFFDQdQmVDNdFVNFccpJLHWSvPLrvvvPtGGhSttLv
|
||||
sBgTzzZqrBlfljslWBhvHSvPBhSBJSSL
|
||||
lRlTgMzlzrwRrnmbCMCFnNVMnc
|
||||
MJQJMJHBrsdrHwts
|
||||
dbbSVGgbjVqGTVfqddCTpmWWcprgNgWmcWwWswpN
|
||||
LPdGGdVGPCVdLBlBMlDRRRMD
|
||||
vdcwZLTdTFFRDHVgmpppMmqZ
|
||||
jGPzCnQPjlsDVqDpqDHbgP
|
||||
BjWJrlGQQzrCzBzlzBCGBznzwNRNcwLJdwTJFTHRSTvtLcNN
|
||||
ngrgqTjJJZnjFJpnqnnVTLzBbbHbLQdLHLHbrdHdHG
|
||||
lNcltCCtvftfWssPbMQdMBzhbbcBDLdh
|
||||
PRtWsQCmWsmSsCNCSvCSWlspwgqjqmqjTpnJZwnZVpFwgq
|
||||
PjWjGDCjmrmWPNmvWDWFmgCNfVJRLfJRfLDLJQlfHplpRbfR
|
||||
MtZMtcSbccZshTtQTVVTpzHlLRRQLV
|
||||
cZhbwMnwqsqnhnqtMBnvNFrnGPNPPmgPGCgW
|
||||
WBjWjWjqZwQJnJZCZZbf
|
||||
StHSDRPHHcTrTrJpLCCMbrqnJn
|
||||
RvTTvGqcqTFvSvSRDHvRjlhgWBWBdhjwjGgNjhlj
|
||||
FSbCqcFsbCPtrcrqhCScbshMjHDGGWBLHBnjGLPBHGGBGnHj
|
||||
flQdlsgQgGnQHBHjDn
|
||||
vllgRZdmvsvpgdwZgzJdwRmprqccSFcSShJbTSttqMCrCCch
|
||||
GwwgCtvHgwcHVVDqpWdfnqVv
|
||||
sllBsSNBjSrLfqhLgjfqhL
|
||||
ZbQbZQzgQQPSblBggNQRHGZHHCmwmHFGGcwtJm
|
||||
CmGVGBTVTmmTWTNLLCVgCSFvDQppQQDDnDQDJpMggfnQft
|
||||
RrtdqtldPbHzRbnjRfQZjJfMDnMj
|
||||
wcwhccqrdrrlFmLGCwCtSwtL
|
||||
pzZznZphZnpcNWSwGwVVPzrPrG
|
||||
lgFllLLltgbDsrBCwrjWGmwmtw
|
||||
MgJbDLlMQRJccchrhc
|
||||
wbbjzZhdGDwLzZSBWqqHmZgssCWqFtMZ
|
||||
VRJccfvPlTTlQlHQCWQhMMhCCHqQ
|
||||
RlVfVJcPTVTfvvvJfNJVlcBjGjwhSLdBNGGnjLLBwzGb
|
||||
bvpqHMVTTpZnqnWRQQQw
|
||||
tfhFFdSFggfhbldhhZcnRscRcQmnRs
|
||||
DPzgFJzFLfFbFSgPFgdPglMHpvBpHTCMGpjvMMpLvvNG
|
||||
JggGLQgQpLpSPRJgGPSnGlFTDBjjRFvRjtBFjWvFjqRj
|
||||
cmHhZcMHcWjrTBjrvm
|
||||
dbHwdNNHhwTNThZHdlwQJJwngpgnJGnSPw
|
||||
DbZjVfjVLhZDLpWPHpMZPmmGNp
|
||||
lFcJJGcFqnBFqwJCHHMmNHPsdCNp
|
||||
BlwccRQtBwBrwLGbGhGggzLgzR
|
||||
RBhZPjlWqgbNbgGLBr
|
||||
MzSmSzpFdHwpswzzHnzjnvLCbgtrtLGLbJLLJNtJtbwJ
|
||||
MsSHdmMdpFfmFjpfcPWRhRVZfWQThZ
|
||||
mqmssPCFhhsJccVg
|
||||
FTttfwdjjHznJgfngpnc
|
||||
dNFTjQNRtRNQldRNrRdHMRrlPZqCGlGBCqqZmmbPqDmDCmGW
|
||||
ZJVRRZZJRcvmPhCJrvhm
|
||||
PPWQDTfWbnnstlCGvjGrWMGMvr
|
||||
TbbwddndsnsfDpwFqZFVHBVPqc
|
||||
tFmpJmgJJgmFDWgRgFrrlGSltSQvZChMtCMM
|
||||
TLcZHsjLVNBwGQCCGlsCShvh
|
||||
nqNdwwccBwVLwjjDznZzppbgzFZfDF
|
||||
qsTqCCCszjlqTssBShlQSSZFgZZhgB
|
||||
LDPmVgDDJdLPrPgLgPZSFZQfhQGGBQJcSFJS
|
||||
mvmVbVvtggVtvgdLVvtmptCsNTtjRnpRTTjpsqCp
|
||||
BdNPLnmFvLFNgnmBmnFGnwSZZZWwqWgqjwWssTHWSS
|
||||
bJhMzhbVMbDCcVpZtjHMqTMwtttSjH
|
||||
hzclfCppVqQfbzQVbpzPQLNFBdrvdNGGBnmrmP
|
||||
nLVLzBDJCCHqdLncqVJgSsDlGsbssmvvvbvbff
|
||||
jMNHFWNTZZNwMPrPWrrPMMrrvSllbgsllfgbgvQsvGmglZbv
|
||||
RjPjrjRPtNrwHhBtncCJtJtL
|
||||
jbhhjhNjvqNbmjMjqhtCFdmPFdlzJzfFfJQJfR
|
||||
GBBZWrZWgpSsnSngrrSgHzFzFFdClzfFQFlRZftQPR
|
||||
TrGTrGWHpHWGHWVWsngprHpLbLLVvcqMcNbVNLhwVNbtNb
|
||||
sQDvDmDLQFDRsdchzhBczLhhPhVz
|
||||
MbGGMjjGZSjvfHvHSbfwBqcPnqqcPVhPNnqnzjcn
|
||||
ZwMMHrWvSHbfJfTrbJwSMMfMsQDtsFRptlpdCRpWmptQDRmC
|
||||
TwMHdcTznLqzTrHdzzzHTdgMRQWRhJhNjjvgQvQQWNjl
|
||||
tbfsVbDCVSSDtSPQJWPvRNhQtghN
|
||||
FVGBpGCVFCbfCbVbZCSHqmwqcqLcdHJGwHqqTd
|
||||
lTlGfjLGwHNMggscsDRwsC
|
||||
MrFtrzZZPZrtVQtnrrFdQhhDPDSphgDRhDcsCCgWpW
|
||||
ZJmJVzVVJFHfGbqJGMLv
|
||||
zsFZVjzlHPfTzGfLGt
|
||||
mdrrmdMMcBcmNqNbPqfRDLPWPlqTWD
|
||||
BNQhmmrBrQghgSmNBQQSmvwssjZZSJHljJFFHZJvZV
|
||||
rLZCsZdMJfdNCsfZMrLdFmssnwgTRQgBBwgRwcngTNVRVQjV
|
||||
StqDHlStDPgRTqcwjT
|
||||
GlDGDhbpHhvSHWlzbWlhpzhJdrFLrCLmvdmFZsmJJjJfdv
|
||||
pJHJMJsJjSMFdHhszFvMhlmmGNlSmmBGllWmVlwcTw
|
||||
ZqZRDrZCZDtPDPDrCngrnnPQGVmGHVBWGWtGmWVwVlmTlGNl
|
||||
ZQPgRqrrQPqLnrLMvLphHdvdjpJddb
|
||||
NwbBjljFbcjtTcccqW
|
||||
RHZrPHPpNgZTzTqc
|
||||
sfrPdmPdpsmPPPrfQPVGlwGVBwbGVnFlNQCG
|
||||
hQdNTlzhdTvrhdnTBqcWBLsBHgWQgBPg
|
||||
zwzRDbDfqZBLHDLB
|
||||
wFbFmjjRzfmjGGMGMfmJwwGCCnvNhpvSCNnrvJvCprnnSp
|
||||
zshNNJbwGFJfGJzzzNRnHGnCnRHcRPgTmPmn
|
||||
LMDVtZLStrrZClBrVDllLSBWRPTPPRRPmgWPVmPTPHTWgR
|
||||
SDSqLMlrtLlLtrBqBdlMZjvffCNzwvhjvvzhdfNhvf
|
||||
SLQmGBmhLSLQTBGBGwdwpJjwwQjwcVpJZJ
|
||||
sNrWrWPNbHghrbgnNNzbWbFWdZpMpzVpdMZMzMMVZcwwJdwd
|
||||
frrPNNWshWhhHDvDGDRSBSRvttqv
|
||||
FJqpgvhJJRjFjZTqDsMHrzwjsSsSszMrMm
|
||||
PPPQWGtnbbfBmPsFswwsMrcc
|
||||
QfBtbldtWQfbWbnfGlFqZppvpFZZLhFlpq
|
||||
ZqSMZHHCMpHTZTWmFTFZPZQJBgVGVJQvVVSDBvBtcBBG
|
||||
RNsndwsNjsbsgGCgjQBttcBg
|
||||
NRszRRNzLNNNwNfhCCrfdmTqFZllFFHFFpWhlTmWpq
|
||||
llbbzDmSspGRpHpzsldzRRsVtFBBFJMMVVFLTTTMVtLTDM
|
||||
cqgjqvNgvqCjQZqgGGnhMTnMJVLBLMtFhhVFWB
|
||||
PfGGvQrPCjvjZgGCCCZZZbSmmmHlRpprlHrHwssSRr
|
||||
mRmpFpWpfMMgLnmS
|
||||
CdCsqzdRzqStLjSqfMnL
|
||||
wQRHdTzCQbzCwsTrZBlFZGpVlpFGQD
|
||||
qnMTnTVSTPTHTHcMZMvVpmppmFmVzFLLFLlFpG
|
||||
gBjDsjRRwhDDghthwwWZwLmpmwWWLWLbGZ
|
||||
NhZtZtBgPTNJJNTS
|
||||
jLjjmpHvzvZrfzQjmfHHWrfbqblLsSlTsqsgqPJbPqVglb
|
||||
FBcCwDwtwgcgnCwcGchtJSsRqVRVJPPqDlbSDRPq
|
||||
MBhthFNtMGCwhcwnpQfWjNrQprpvzpgQ
|
||||
RfCnWfnhCbwHgWjzBgzB
|
||||
PsVqDsSTshsgszpsph
|
||||
DPDvTVtTShhSZhmqSvLlQJFnQJJZnbCnlCCZ
|
||||
pRRdJngltnwwvTNSWqWffqgBqD
|
||||
HQGcsdrjzMDDBfGMGG
|
||||
FLhsdbzCLLHjhntpVnRPRvZV
|
||||
gZNwQHHNRlGvhvhGRvRb
|
||||
dpSSBDrzdCfcSzfrzZrfCfMbthWWWPttDthvMFWvvvPj
|
||||
ZdpBpZCrssBJZfSJBzBdCTcnmQwmnVVlmqTQTTQlHLwNnN
|
||||
ssCpTttVVVpzZDVvRpCsRtDgWBWBBFBJvvJHMBghGghrMJ
|
||||
lwLmNNLwSblbmSQLfhJHZgHrHhhJJhHHmW
|
||||
QLSdbdPqndlNlLdSLNQncpRtRTcRVTPPZRCjVCcc
|
||||
wzzJclzcTThvWSSCqRlQSsNN
|
||||
rDpVjpVVDpsQSRDRfQmm
|
||||
GLbjrLpFbgLVLLgdbjVpchcFZhvBwJvtvtJcZwRB
|
||||
wPgZgLVMfWVTgmTZZZftJjtfjtJCcdpjdCqc
|
||||
zGGbQQnQGvBBhGQvvvBBSBvQdhdqqCpdddDmJlCcDjCtJdmJ
|
||||
HszzHBzQBSmGSwTWgswZPWTVgZ
|
||||
GDFvzCFdrszSdNJrFfjjfqZjRfsjpqmcwZ
|
||||
WbbVtVnBPWMgBLMBnQQnBQHcjfjpZRwqcwMfcNTZRqqNmT
|
||||
WQQnVVPHtggLghWWhHnPVQbvlJhSlrvJDlFGJDdDCzGNFF
|
||||
dVhTBjBHtTVqWRJZRqhJZQ
|
||||
brSDTbDfcCwDzfCSbwMQnlqCRJnMgWWnZngM
|
||||
DFwNSrwNwbDzbFTTFtjmBpVdGpHs
|
||||
dPQfdfTzDrFDmFDBgBFj
|
||||
RlJRclcswJRvnwPcpjbjbbCZjFjbBmsbFZ
|
||||
pqncGlcRJpHGpllGHhvPhRTHrQrttVVfrdQzfrTdftfV
|
||||
RCzTzRMTfCfRRDzRfhSmZZlCslBbZZBVtZBZsqBL
|
||||
nvvJPpdcFnPcWnFnVZvBqVlZMbZBNVlV
|
||||
FpWPMdjdPhSTmwfSjD
|
||||
NDJjNHLLNWjcLLWCLJLZjLDtRqqtgtMqgtqnRqnSRgggtZ
|
||||
BwrlfFwmQwhwfPBFhsBdFmbQggCgqQVtbRSqttqMngnp
|
||||
llPPwsPlGshBJGWJLcHvCzNv
|
||||
rBvTmwdTSbnrvVWsWVftGfJQGT
|
||||
gNRLLjlPRWnFVRFDFW
|
||||
lpCpPNZqZCdvdppnSnBr
|
||||
ShRdCrJgHClZJtZDGMMz
|
||||
LvqVVTTNbVPLQNFTnwwMtzFZGDDwmtnM
|
||||
VLbNvpPvTNVqVbbNpbVPGNLPrRWrcRCWdSrCjWSHcHSdWpCh
|
||||
tNmZnLSZPFLDnLTmhJMWczQdhmWhWH
|
||||
bGqbgrpsCsWhcChNQfJz
|
||||
vwlNbppsRGRRSSSDvjTjLZjZ
|
||||
zgMZhgfBtftSZQQmLHpSWH
|
||||
cdqcqnrJVGjjqPVjrPnfpJmsQHQQpsSsbsSDmm
|
||||
NNnrNqNlrNcPTlBvBvgggfMv
|
||||
llPrrLHBHCrRRBjrHCjBdrPmvJZzZgZbmgJlZmZhMhhmvh
|
||||
pNDstVtNtGFNSDFScQtfwzzFJwmJhgqzbMwqZJmh
|
||||
fpNsptGtQcTsSTccprddCWPrWdTRBMMCMd
|
||||
TTtDVqTsTcJFgbCqmbCq
|
||||
NWZQnllzfBFZPBGWQGzFPFRNNgHbHrrwbNrmCbggJRHR
|
||||
nBZjGFjMQBMPZnjfWjstpcctttvVtcTttMpL
|
||||
qphVCCwnHqhnRVznFwvLtBTLDTWZtwLWWS
|
||||
JmdlsdlsjfJfrtjTcvtctDZSSB
|
||||
rsmfPGbrPbPJfPmrsgMrdJdlFTHhFCqhNqVHnNHHCFznhphG
|
||||
JsWFMJJzrhSSdFdldmmdmdQc
|
||||
qLLgCVTgLbBvqsQPVdQGcRRmQmdc
|
||||
bBCBgCCDbLDqTvqqjpShHfzrzMfjtHHSHsfz
|
||||
nvFSBFlvvgQFFBzQnlQglmRRzqwsrrMJJMrsMqrfrwzf
|
||||
CjZNCNhLDNbPZZLZZhwVjpcfrqRhsdJqdsshRTTdqJrJ
|
||||
jNNDDppjpjDWNVLCVVDpGVVPBFtlSQFWvvQvSSQHSgwQnvtB
|
||||
WhrQWBRWwhzgmpnSpH
|
||||
LqMVsJVvFMJLJMsfNjsTJvCgFbSmzgpSHzmngHbGPCbm
|
||||
jvMjjtqVjTRnwZQwBWwt
|
||||
jfTWSGSTTWhgcngQfbtJfNzztBQBzz
|
||||
pVVwsdppRVPLVmPsVVHsjPLPzQdzBzQFzFBNNrJZZQBzbbFF
|
||||
VmsqHmjHmpvGDSWDvlclSl
|
||||
PNZfTFSFfTFGCHqqmbFm
|
||||
WjzRWrjVgnjzplrWWjJVppgGPGsgstmPCCtcmssQqGQt
|
||||
pzjzJVvnzJjWvpPlnVRVrvnlTDLNNhwfdNZLfMZLwLhTNvTw
|
||||
QFrQZMFVrVpVszzcNTdMRCCb
|
||||
SvljGmlvLfwLhLLLHlHdNzsRthhbbRccRCRNbC
|
||||
LfwlDmlvGBSjjlLLgpPpFJqgQndQgZBJ
|
||||
RBjPRHdjPfqQcfhcdv
|
||||
SngFcJZJlcnctSlhhsQvGsDGDsDnfs
|
||||
pSmFgSWNJFNtStrmNtpCCjPVcbjjHbcWTBHBHL
|
||||
vGjqCPqNPGFGNftLwmZwfQNTLp
|
||||
hrdBCSHcCJJcCBShJswmLQpLbbQZTLLJmmZp
|
||||
BdHHSzrBWdzchzzCcdzHddcDVWFnjPjllGggVlWljPFFFWPM
|
||||
hBtZZnpbhbPZJbnhDtPnpBtpfjfNNzrrCzjFzFzFTjfjjWzJ
|
||||
gHllMqRSmqcqMTdggMqHlcFzRrFQWNfvrRvzQrWjWvWf
|
||||
gwqlgHmmdsgwlwMHZtpsbBbtDBThbBht
|
||||
CsDLFFLFCvczsCsJrCrJJLRgbQQgmMmPbDDQbPnMgMmg
|
||||
VlwNBNVhjNVNWBwWjtbRMRZzPmQnfQMPnlZP
|
||||
VWWSSwGTwtwWWNVwwpqJJrcJGvzqCJCqJF
|
||||
wLwSSbzwCvddlvvlSj
|
||||
THnQnnHttcvpQzrZRllZ
|
||||
sTntBHTnVbPbgzsbgL
|
||||
FwHgrHvFQQwpHhNhTBLdpNNNLd
|
||||
fCGqCVtszfSslCSzSGsfCssjNTqLTdmjNLBLdnTTTMTjTg
|
||||
DccfslfgRSSVVzlcSVtzDRVHwQZFrwwvwFWbbbRRWwrFJb
|
||||
CwwWwwFNRpFFpZQHtsmfqbQDTQTTqb
|
||||
VcjzLjGjzGjGjVjLdzqmDqHrsmsqGRrHqGqH
|
||||
RjdVlgdnljlBnSgPCpNwwMWwMM
|
||||
tCCtqtbPGzsSQVzQTq
|
||||
mzMmHMpRsRQTsFFV
|
||||
DpzDwgdMzMLppNmNpDpfgrbhLcGtPrbtrbrbhnbBcC
|
||||
BvsQBBBLvDQGjDvSQLTvrHprHlRpVlVllgRbRbHPqq
|
||||
MMMMCpfJFZZMmCzwpVPCWRtHgqWgqClgtt
|
||||
FwzmfzhFFdFcpvSDSBDThs
|
||||
fQrGQbFFFrHHtlHPclzzPLvc
|
||||
mTnwpNCCqMqjmCThpTpSvvtBczstlLznvsztsPPP
|
||||
mCpTNhmmpCqCmjmpTjmLCpSJQZVfFVrDVfffFFgfgJQFdbgG
|
||||
GmWjRBSfttcGfRcSclVVJqsTMllsgJVMVZwV
|
||||
pPFNpfNCdNzCVMTTNqVssqJN
|
||||
dzPfHCLLhdjjLGRnmnmr
|
||||
GPhPfGWgggfslffPsVPGsqJMzLQJtBprwQJJGQwLpQrw
|
||||
ZNdmvbDDbNvHbmZCcJQwMmzMwWWQrrwttp
|
||||
bvdDNdnvNbnHDdnDHHRSbnqhqhWfjWFVTVhRVjfjFTfP
|
||||
hTThfWNCDRfsVCDhpgzgbpPZZwbnZQns
|
||||
GSjGGcCBGmdjdSlGBcmZwzJzpPpJzwPwQbzgPd
|
||||
BGmcrcStcMMMmrSLmSMCvFVRFDhfFhhNDWWTqFqTvf
|
||||
ZmjDTTbmqQCCQQSwvhsL
|
||||
FGVJPmPmtRVRsCvvRLwwhC
|
||||
JgdHJgmfbjzTpTMf
|
||||
fTbsVCsssgLNrfNrgm
|
||||
zQvzZlRvddvpNLpZrMNNLZ
|
||||
HLvWFHHlFQvzHnnlnvQqhzWvstBwbGVtstjGqjjwqGGCcwGq
|
||||
JNpNdzzdJhNnfNGBZLqZqlhvSZSG
|
||||
QswtcmmwwmTmwwcwZSLlZLDSvSvlBZQD
|
||||
FsVFBbFgFsPwtVBTwgTPcsmpzdNngfzfpCzJdzCJzNCndn
|
||||
qcvrLBppgpWWWgLcpzPfhNDqdzqwDDzwhV
|
||||
MZFjFnHFMHbMntMtnwStfddPhDffDfzDfS
|
||||
QmnjMZnlHjmnMGFnFlMmjlZWzLgsGgcrspBBLCBcgvgBRC
|
||||
sdfWHjZfrZrSPMCQ
|
||||
zqtWRDDDRMbrQJPQ
|
||||
zwhwzmqwzmFpWzvFqBmFvjNHlHfgVLBgdfVfNVjLsl
|
||||
lRlBTlvlZfhtbGBWtFBz
|
||||
cqCNjjqjrNrcNjwDqNPCVrSQStSWshFhtQhbQzGzmFCG
|
||||
HjPPzMcdNqjcNHMqPjdpgpZflfdgnTfdlvlJ
|
||||
VpwQJVRtHplnnwtppHhqWBCfVdNNPqPBPWsBDq
|
||||
jzLZCrvvrZjZvqNffvDNDcWDWd
|
||||
LTrZZLFZbgTzgjZZjFClJhTHTplQpmnQlpmpQR
|
||||
JGJnSWLGSpWHVHwGGJHpZdwPdTTPMdTMDdlzccPMPv
|
||||
gqrrmtbrbgggqgBtqmRSrFgNCzvMDvlMPDdddvzBcPMMMDBd
|
||||
gjrmRgmtRggFtqjbhgbjrtnJJHWLHQWZZLhZsLLGHhSL
|
||||
BtTDNggLRPdWQHqggg
|
||||
wrVpVVlCJVGMMJVdHWSdPSqqRwSQSP
|
||||
vCVrpvvGjlphBRmZBhmBhBND
|
||||
lqDcZGcSSqSqbDnccSLJgHgLRfnvvJRLmvWJ
|
||||
FVCFPChQzVhmsFBgddRgJBfdNfJdfv
|
||||
FzCpmTQzjQCThppTSttqDccMTDGcDG
|
||||
QCSGBGCrCsMBTCQwMGSfvvLNNnnVLDlNVNDdVdlr
|
||||
ZHtPffjWbqgtmnNdvljFnFhdVv
|
||||
JRWbmgmRJtmJMGGwSBBRRRfQ
|
||||
LqNrCfCQQhtgnPnc
|
||||
JWBrWrVlbWgbbtcb
|
||||
VwvTBprdrVJVNLNMNNqfqpjN
|
||||
bjVqdHrdqVHPsPNbqHbqNdjFGRwRGlttRtMtRtFFGMLHJw
|
||||
cfSpZnBZWQBZJlGRJJcwGMGL
|
||||
WWBhTMgDTZghVjgjssbrbddd
|
||||
46
2022/day04/default.nix
Normal file
46
2022/day04/default.nix
Normal file
@@ -0,0 +1,46 @@
|
||||
{ pkgs, lib, ... }:
|
||||
|
||||
with lib;
|
||||
|
||||
let
|
||||
sections = pipe (fileContents ./input.txt) [
|
||||
(splitString "\n")
|
||||
(map (splitString ","))
|
||||
(map (map toElfRange))
|
||||
(map (x: {
|
||||
e1 = elemAt x 0;
|
||||
e2 = elemAt x 1;
|
||||
}))
|
||||
];
|
||||
|
||||
toElfRange = start-end:
|
||||
let splitSE = splitString "-" start-end;
|
||||
in {
|
||||
start = toInt (elemAt splitSE 0);
|
||||
end = toInt (elemAt splitSE 1);
|
||||
};
|
||||
|
||||
eitherContainsTheOther = { e1, e2 }:
|
||||
((e2.start <= e1.start) && (e1.end <= e2.end))
|
||||
|| ((e1.start <= e2.start) && (e2.end <= e1.end));
|
||||
|
||||
answer1 = pipe sections [
|
||||
(count eitherContainsTheOther)
|
||||
toString
|
||||
];
|
||||
|
||||
eitherOverlapsTheOther = { e1, e2 }:
|
||||
e1.start <= e2.end && e2.start <= e1.end;
|
||||
|
||||
answer2 = pipe sections [
|
||||
(count eitherOverlapsTheOther)
|
||||
toString
|
||||
];
|
||||
|
||||
in pkgs.writeText "answers" ''
|
||||
Task1:
|
||||
${answer1}
|
||||
|
||||
Task2:
|
||||
${answer2}
|
||||
''
|
||||
1000
2022/day04/input.txt
Normal file
1000
2022/day04/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
76
2022/day05/default.nix
Normal file
76
2022/day05/default.nix
Normal file
@@ -0,0 +1,76 @@
|
||||
{ pkgs, lib, ... }:
|
||||
|
||||
with lib;
|
||||
|
||||
let
|
||||
input = splitString "\n\n" (fileContents ./input.txt);
|
||||
|
||||
getCharOffset = index: 1 + 4 * (index - 1);
|
||||
|
||||
getLineAttrs = line: pipe (range 1 9) [
|
||||
(map (n: nameValuePair (toString n) (getCharOffset n)))
|
||||
listToAttrs
|
||||
(mapAttrs (_: elemAt (stringToCharacters line)))
|
||||
(filterAttrs (_: char: char != " "))
|
||||
];
|
||||
|
||||
stack = pipe input [
|
||||
(flip elemAt 0)
|
||||
(splitString "\n")
|
||||
|
||||
# remove the line with stack indices
|
||||
reverseList
|
||||
(drop 1)
|
||||
reverseList
|
||||
|
||||
(map getLineAttrs)
|
||||
zipAttrs
|
||||
];
|
||||
|
||||
moves = pipe input [
|
||||
(flip elemAt 1)
|
||||
(splitString "\n")
|
||||
(map (s:
|
||||
let words = splitString " " s;
|
||||
in {
|
||||
amount = elemAt words 1;
|
||||
from = elemAt words 3;
|
||||
to = elemAt words 5;
|
||||
}
|
||||
))
|
||||
(map (mapAttrs (_: toInt)))
|
||||
];
|
||||
|
||||
executeStackMove = move: stack:
|
||||
stack // {
|
||||
${toString move.from} = drop move.amount stack.${toString move.from};
|
||||
${toString move.to} = (reverseList (take move.amount stack.${toString move.from})) ++ stack.${toString move.to};
|
||||
};
|
||||
|
||||
answer1 = pipe stack
|
||||
((map executeStackMove moves)
|
||||
++ [
|
||||
(mapAttrsToList (_: head))
|
||||
concatStrings
|
||||
]);
|
||||
|
||||
executeStackMove2 = move: stack:
|
||||
stack // {
|
||||
${toString move.from} = drop move.amount stack.${toString move.from};
|
||||
${toString move.to} = (take move.amount stack.${toString move.from}) ++ stack.${toString move.to};
|
||||
};
|
||||
|
||||
answer2 = pipe stack
|
||||
((map executeStackMove2 moves)
|
||||
++ [
|
||||
(mapAttrsToList (_: head))
|
||||
concatStrings
|
||||
]);
|
||||
|
||||
in pkgs.writeText "answers" ''
|
||||
Task1:
|
||||
${answer1}
|
||||
|
||||
Task2:
|
||||
${answer2}
|
||||
''
|
||||
512
2022/day05/input.txt
Normal file
512
2022/day05/input.txt
Normal file
@@ -0,0 +1,512 @@
|
||||
[M] [W] [M]
|
||||
[L] [Q] [S] [C] [R]
|
||||
[Q] [F] [F] [T] [N] [S]
|
||||
[N] [V] [V] [H] [L] [J] [D]
|
||||
[D] [D] [W] [P] [G] [R] [D] [F]
|
||||
[T] [T] [M] [G] [G] [Q] [N] [W] [L]
|
||||
[Z] [H] [F] [J] [D] [Z] [S] [H] [Q]
|
||||
[B] [V] [B] [T] [W] [V] [Z] [Z] [M]
|
||||
1 2 3 4 5 6 7 8 9
|
||||
|
||||
move 1 from 7 to 4
|
||||
move 1 from 6 to 2
|
||||
move 5 from 9 to 4
|
||||
move 2 from 2 to 8
|
||||
move 2 from 2 to 6
|
||||
move 3 from 3 to 7
|
||||
move 3 from 7 to 1
|
||||
move 1 from 9 to 4
|
||||
move 4 from 7 to 3
|
||||
move 5 from 1 to 8
|
||||
move 1 from 1 to 2
|
||||
move 1 from 4 to 9
|
||||
move 4 from 5 to 6
|
||||
move 1 from 5 to 8
|
||||
move 3 from 2 to 4
|
||||
move 3 from 6 to 4
|
||||
move 3 from 5 to 9
|
||||
move 1 from 9 to 7
|
||||
move 1 from 9 to 8
|
||||
move 2 from 7 to 9
|
||||
move 1 from 7 to 9
|
||||
move 1 from 7 to 8
|
||||
move 2 from 9 to 8
|
||||
move 13 from 4 to 2
|
||||
move 2 from 6 to 1
|
||||
move 3 from 3 to 2
|
||||
move 9 from 2 to 7
|
||||
move 1 from 9 to 7
|
||||
move 5 from 7 to 8
|
||||
move 9 from 8 to 4
|
||||
move 2 from 7 to 1
|
||||
move 1 from 1 to 7
|
||||
move 2 from 3 to 2
|
||||
move 14 from 4 to 5
|
||||
move 3 from 8 to 4
|
||||
move 13 from 8 to 3
|
||||
move 2 from 7 to 1
|
||||
move 6 from 6 to 5
|
||||
move 1 from 6 to 9
|
||||
move 3 from 2 to 8
|
||||
move 1 from 7 to 8
|
||||
move 5 from 2 to 8
|
||||
move 4 from 4 to 8
|
||||
move 1 from 9 to 8
|
||||
move 1 from 7 to 1
|
||||
move 1 from 1 to 2
|
||||
move 7 from 3 to 2
|
||||
move 4 from 3 to 2
|
||||
move 2 from 5 to 3
|
||||
move 2 from 1 to 5
|
||||
move 5 from 8 to 7
|
||||
move 6 from 8 to 3
|
||||
move 11 from 5 to 8
|
||||
move 8 from 8 to 9
|
||||
move 5 from 7 to 8
|
||||
move 3 from 1 to 8
|
||||
move 5 from 3 to 8
|
||||
move 11 from 2 to 9
|
||||
move 1 from 3 to 5
|
||||
move 1 from 2 to 1
|
||||
move 1 from 2 to 7
|
||||
move 6 from 5 to 7
|
||||
move 19 from 9 to 7
|
||||
move 3 from 5 to 3
|
||||
move 1 from 5 to 4
|
||||
move 1 from 1 to 4
|
||||
move 1 from 9 to 8
|
||||
move 25 from 7 to 9
|
||||
move 2 from 4 to 1
|
||||
move 2 from 1 to 4
|
||||
move 2 from 4 to 7
|
||||
move 2 from 7 to 9
|
||||
move 5 from 3 to 1
|
||||
move 1 from 7 to 1
|
||||
move 9 from 9 to 5
|
||||
move 3 from 5 to 6
|
||||
move 9 from 9 to 1
|
||||
move 7 from 1 to 3
|
||||
move 6 from 8 to 9
|
||||
move 1 from 5 to 2
|
||||
move 10 from 9 to 2
|
||||
move 1 from 2 to 7
|
||||
move 5 from 9 to 8
|
||||
move 1 from 5 to 8
|
||||
move 5 from 3 to 8
|
||||
move 1 from 9 to 4
|
||||
move 4 from 3 to 6
|
||||
move 4 from 6 to 3
|
||||
move 3 from 1 to 4
|
||||
move 3 from 2 to 4
|
||||
move 3 from 5 to 8
|
||||
move 3 from 4 to 9
|
||||
move 1 from 7 to 3
|
||||
move 2 from 9 to 8
|
||||
move 4 from 2 to 5
|
||||
move 1 from 3 to 4
|
||||
move 1 from 9 to 3
|
||||
move 5 from 5 to 6
|
||||
move 7 from 8 to 5
|
||||
move 3 from 1 to 7
|
||||
move 6 from 5 to 8
|
||||
move 5 from 4 to 5
|
||||
move 3 from 3 to 2
|
||||
move 1 from 1 to 4
|
||||
move 19 from 8 to 1
|
||||
move 3 from 7 to 3
|
||||
move 4 from 2 to 9
|
||||
move 1 from 2 to 6
|
||||
move 7 from 6 to 4
|
||||
move 1 from 6 to 2
|
||||
move 2 from 1 to 3
|
||||
move 5 from 4 to 1
|
||||
move 1 from 6 to 2
|
||||
move 3 from 3 to 6
|
||||
move 12 from 1 to 2
|
||||
move 2 from 8 to 1
|
||||
move 14 from 2 to 4
|
||||
move 7 from 1 to 5
|
||||
move 10 from 4 to 6
|
||||
move 3 from 6 to 4
|
||||
move 1 from 8 to 4
|
||||
move 4 from 3 to 5
|
||||
move 1 from 2 to 3
|
||||
move 2 from 1 to 4
|
||||
move 17 from 5 to 3
|
||||
move 7 from 4 to 1
|
||||
move 1 from 9 to 4
|
||||
move 4 from 6 to 3
|
||||
move 5 from 4 to 8
|
||||
move 12 from 3 to 1
|
||||
move 6 from 3 to 5
|
||||
move 17 from 1 to 5
|
||||
move 2 from 1 to 9
|
||||
move 3 from 1 to 4
|
||||
move 7 from 8 to 2
|
||||
move 4 from 3 to 7
|
||||
move 1 from 1 to 8
|
||||
move 17 from 5 to 2
|
||||
move 11 from 2 to 8
|
||||
move 11 from 8 to 4
|
||||
move 11 from 2 to 4
|
||||
move 4 from 6 to 1
|
||||
move 4 from 1 to 3
|
||||
move 2 from 6 to 9
|
||||
move 3 from 7 to 8
|
||||
move 3 from 5 to 3
|
||||
move 23 from 4 to 3
|
||||
move 4 from 4 to 8
|
||||
move 1 from 7 to 4
|
||||
move 2 from 2 to 3
|
||||
move 6 from 3 to 2
|
||||
move 16 from 3 to 9
|
||||
move 2 from 5 to 8
|
||||
move 1 from 4 to 5
|
||||
move 2 from 5 to 9
|
||||
move 1 from 2 to 3
|
||||
move 1 from 3 to 8
|
||||
move 9 from 9 to 1
|
||||
move 6 from 3 to 8
|
||||
move 3 from 3 to 1
|
||||
move 18 from 8 to 9
|
||||
move 1 from 3 to 5
|
||||
move 5 from 1 to 4
|
||||
move 5 from 1 to 8
|
||||
move 3 from 4 to 1
|
||||
move 1 from 5 to 2
|
||||
move 2 from 4 to 8
|
||||
move 1 from 1 to 2
|
||||
move 5 from 2 to 7
|
||||
move 2 from 8 to 1
|
||||
move 2 from 2 to 6
|
||||
move 3 from 1 to 6
|
||||
move 3 from 9 to 6
|
||||
move 31 from 9 to 7
|
||||
move 26 from 7 to 8
|
||||
move 3 from 1 to 6
|
||||
move 22 from 8 to 4
|
||||
move 2 from 4 to 5
|
||||
move 4 from 6 to 5
|
||||
move 11 from 4 to 3
|
||||
move 9 from 4 to 6
|
||||
move 2 from 5 to 9
|
||||
move 4 from 7 to 1
|
||||
move 2 from 6 to 1
|
||||
move 1 from 5 to 3
|
||||
move 6 from 8 to 6
|
||||
move 8 from 6 to 2
|
||||
move 1 from 1 to 6
|
||||
move 3 from 1 to 3
|
||||
move 1 from 5 to 3
|
||||
move 1 from 5 to 9
|
||||
move 5 from 7 to 2
|
||||
move 2 from 9 to 6
|
||||
move 4 from 8 to 6
|
||||
move 1 from 7 to 2
|
||||
move 1 from 5 to 4
|
||||
move 12 from 3 to 4
|
||||
move 3 from 3 to 1
|
||||
move 3 from 6 to 8
|
||||
move 1 from 9 to 3
|
||||
move 6 from 2 to 6
|
||||
move 2 from 3 to 2
|
||||
move 10 from 2 to 7
|
||||
move 2 from 1 to 9
|
||||
move 2 from 1 to 6
|
||||
move 1 from 1 to 4
|
||||
move 9 from 7 to 9
|
||||
move 3 from 8 to 7
|
||||
move 7 from 4 to 8
|
||||
move 2 from 7 to 4
|
||||
move 4 from 8 to 1
|
||||
move 5 from 8 to 2
|
||||
move 3 from 1 to 3
|
||||
move 1 from 8 to 7
|
||||
move 3 from 3 to 7
|
||||
move 4 from 2 to 6
|
||||
move 8 from 4 to 2
|
||||
move 5 from 2 to 5
|
||||
move 11 from 9 to 7
|
||||
move 2 from 5 to 7
|
||||
move 16 from 7 to 8
|
||||
move 5 from 8 to 7
|
||||
move 1 from 4 to 3
|
||||
move 3 from 5 to 1
|
||||
move 11 from 6 to 5
|
||||
move 7 from 5 to 4
|
||||
move 5 from 7 to 4
|
||||
move 1 from 3 to 7
|
||||
move 2 from 5 to 4
|
||||
move 10 from 4 to 8
|
||||
move 14 from 6 to 3
|
||||
move 1 from 5 to 9
|
||||
move 1 from 6 to 5
|
||||
move 2 from 2 to 9
|
||||
move 2 from 1 to 3
|
||||
move 2 from 5 to 3
|
||||
move 2 from 7 to 6
|
||||
move 2 from 1 to 4
|
||||
move 1 from 2 to 3
|
||||
move 19 from 3 to 6
|
||||
move 3 from 9 to 2
|
||||
move 4 from 2 to 6
|
||||
move 6 from 6 to 7
|
||||
move 13 from 6 to 2
|
||||
move 14 from 8 to 1
|
||||
move 6 from 4 to 3
|
||||
move 5 from 7 to 8
|
||||
move 3 from 6 to 3
|
||||
move 2 from 8 to 2
|
||||
move 2 from 6 to 8
|
||||
move 4 from 1 to 8
|
||||
move 13 from 8 to 4
|
||||
move 10 from 4 to 7
|
||||
move 1 from 4 to 5
|
||||
move 1 from 5 to 1
|
||||
move 3 from 6 to 5
|
||||
move 3 from 8 to 9
|
||||
move 9 from 3 to 1
|
||||
move 3 from 5 to 8
|
||||
move 3 from 9 to 6
|
||||
move 3 from 8 to 7
|
||||
move 1 from 6 to 9
|
||||
move 1 from 9 to 4
|
||||
move 9 from 2 to 8
|
||||
move 2 from 2 to 6
|
||||
move 14 from 7 to 1
|
||||
move 31 from 1 to 5
|
||||
move 3 from 1 to 7
|
||||
move 4 from 6 to 8
|
||||
move 24 from 5 to 3
|
||||
move 2 from 8 to 1
|
||||
move 1 from 8 to 5
|
||||
move 2 from 1 to 7
|
||||
move 3 from 7 to 6
|
||||
move 6 from 8 to 6
|
||||
move 2 from 4 to 2
|
||||
move 1 from 4 to 3
|
||||
move 2 from 2 to 7
|
||||
move 6 from 6 to 7
|
||||
move 4 from 8 to 6
|
||||
move 7 from 6 to 2
|
||||
move 12 from 7 to 5
|
||||
move 4 from 2 to 8
|
||||
move 1 from 2 to 4
|
||||
move 1 from 4 to 6
|
||||
move 1 from 6 to 7
|
||||
move 1 from 7 to 3
|
||||
move 3 from 3 to 8
|
||||
move 17 from 3 to 5
|
||||
move 4 from 3 to 6
|
||||
move 35 from 5 to 3
|
||||
move 2 from 2 to 6
|
||||
move 1 from 5 to 9
|
||||
move 9 from 3 to 7
|
||||
move 6 from 8 to 1
|
||||
move 4 from 2 to 6
|
||||
move 4 from 6 to 9
|
||||
move 20 from 3 to 9
|
||||
move 22 from 9 to 7
|
||||
move 1 from 8 to 6
|
||||
move 29 from 7 to 5
|
||||
move 4 from 6 to 8
|
||||
move 6 from 1 to 8
|
||||
move 2 from 7 to 3
|
||||
move 1 from 6 to 5
|
||||
move 2 from 3 to 9
|
||||
move 1 from 9 to 3
|
||||
move 4 from 5 to 6
|
||||
move 18 from 5 to 1
|
||||
move 7 from 3 to 1
|
||||
move 1 from 3 to 6
|
||||
move 3 from 5 to 1
|
||||
move 1 from 3 to 9
|
||||
move 4 from 5 to 2
|
||||
move 10 from 8 to 7
|
||||
move 2 from 9 to 3
|
||||
move 1 from 3 to 5
|
||||
move 21 from 1 to 9
|
||||
move 1 from 3 to 2
|
||||
move 1 from 2 to 9
|
||||
move 15 from 9 to 3
|
||||
move 4 from 7 to 1
|
||||
move 2 from 6 to 1
|
||||
move 7 from 9 to 1
|
||||
move 1 from 5 to 4
|
||||
move 1 from 4 to 6
|
||||
move 6 from 3 to 9
|
||||
move 3 from 6 to 5
|
||||
move 19 from 1 to 6
|
||||
move 8 from 3 to 6
|
||||
move 1 from 3 to 7
|
||||
move 20 from 6 to 7
|
||||
move 1 from 2 to 6
|
||||
move 6 from 9 to 8
|
||||
move 2 from 9 to 4
|
||||
move 1 from 1 to 3
|
||||
move 1 from 2 to 9
|
||||
move 3 from 5 to 6
|
||||
move 2 from 7 to 3
|
||||
move 2 from 9 to 7
|
||||
move 1 from 4 to 8
|
||||
move 4 from 8 to 9
|
||||
move 4 from 7 to 1
|
||||
move 2 from 1 to 7
|
||||
move 1 from 3 to 2
|
||||
move 2 from 8 to 9
|
||||
move 6 from 6 to 2
|
||||
move 1 from 8 to 1
|
||||
move 1 from 5 to 7
|
||||
move 4 from 2 to 9
|
||||
move 1 from 3 to 5
|
||||
move 5 from 6 to 1
|
||||
move 1 from 4 to 2
|
||||
move 1 from 9 to 6
|
||||
move 1 from 9 to 6
|
||||
move 4 from 6 to 3
|
||||
move 7 from 9 to 7
|
||||
move 8 from 7 to 2
|
||||
move 1 from 5 to 8
|
||||
move 5 from 2 to 9
|
||||
move 3 from 2 to 5
|
||||
move 6 from 1 to 3
|
||||
move 17 from 7 to 6
|
||||
move 1 from 8 to 2
|
||||
move 2 from 1 to 7
|
||||
move 5 from 9 to 4
|
||||
move 4 from 3 to 8
|
||||
move 3 from 4 to 1
|
||||
move 1 from 9 to 2
|
||||
move 4 from 2 to 1
|
||||
move 1 from 8 to 4
|
||||
move 1 from 5 to 9
|
||||
move 1 from 2 to 3
|
||||
move 3 from 3 to 2
|
||||
move 10 from 7 to 6
|
||||
move 3 from 4 to 1
|
||||
move 5 from 3 to 2
|
||||
move 4 from 1 to 5
|
||||
move 3 from 8 to 6
|
||||
move 12 from 6 to 4
|
||||
move 1 from 9 to 3
|
||||
move 1 from 5 to 2
|
||||
move 3 from 1 to 6
|
||||
move 12 from 6 to 8
|
||||
move 3 from 1 to 5
|
||||
move 2 from 4 to 3
|
||||
move 5 from 8 to 7
|
||||
move 7 from 5 to 3
|
||||
move 3 from 7 to 9
|
||||
move 1 from 5 to 8
|
||||
move 5 from 3 to 7
|
||||
move 10 from 6 to 5
|
||||
move 2 from 7 to 5
|
||||
move 8 from 2 to 9
|
||||
move 5 from 3 to 9
|
||||
move 9 from 5 to 1
|
||||
move 5 from 7 to 4
|
||||
move 15 from 9 to 5
|
||||
move 1 from 2 to 5
|
||||
move 1 from 8 to 5
|
||||
move 6 from 4 to 1
|
||||
move 2 from 2 to 9
|
||||
move 18 from 5 to 8
|
||||
move 18 from 8 to 3
|
||||
move 16 from 3 to 4
|
||||
move 3 from 5 to 8
|
||||
move 1 from 9 to 2
|
||||
move 3 from 1 to 7
|
||||
move 3 from 8 to 2
|
||||
move 3 from 7 to 9
|
||||
move 2 from 3 to 4
|
||||
move 3 from 9 to 8
|
||||
move 11 from 1 to 6
|
||||
move 2 from 9 to 4
|
||||
move 3 from 6 to 9
|
||||
move 8 from 6 to 4
|
||||
move 26 from 4 to 7
|
||||
move 1 from 2 to 5
|
||||
move 1 from 5 to 2
|
||||
move 3 from 9 to 3
|
||||
move 21 from 7 to 6
|
||||
move 4 from 2 to 4
|
||||
move 1 from 2 to 3
|
||||
move 5 from 7 to 6
|
||||
move 8 from 8 to 1
|
||||
move 1 from 3 to 7
|
||||
move 9 from 1 to 4
|
||||
move 1 from 7 to 4
|
||||
move 20 from 4 to 7
|
||||
move 1 from 8 to 5
|
||||
move 2 from 4 to 8
|
||||
move 1 from 4 to 9
|
||||
move 3 from 8 to 9
|
||||
move 1 from 5 to 8
|
||||
move 2 from 3 to 1
|
||||
move 4 from 7 to 8
|
||||
move 3 from 7 to 5
|
||||
move 1 from 1 to 7
|
||||
move 4 from 8 to 3
|
||||
move 3 from 5 to 6
|
||||
move 1 from 8 to 4
|
||||
move 1 from 1 to 8
|
||||
move 28 from 6 to 4
|
||||
move 1 from 6 to 1
|
||||
move 2 from 7 to 8
|
||||
move 1 from 8 to 7
|
||||
move 1 from 8 to 1
|
||||
move 2 from 1 to 9
|
||||
move 3 from 9 to 3
|
||||
move 12 from 7 to 5
|
||||
move 7 from 3 to 1
|
||||
move 1 from 3 to 6
|
||||
move 26 from 4 to 9
|
||||
move 1 from 6 to 3
|
||||
move 1 from 3 to 6
|
||||
move 1 from 8 to 6
|
||||
move 1 from 7 to 8
|
||||
move 1 from 6 to 3
|
||||
move 3 from 1 to 3
|
||||
move 5 from 4 to 3
|
||||
move 28 from 9 to 4
|
||||
move 2 from 1 to 5
|
||||
move 22 from 4 to 1
|
||||
move 3 from 5 to 3
|
||||
move 5 from 5 to 7
|
||||
move 10 from 1 to 6
|
||||
move 1 from 5 to 2
|
||||
move 3 from 5 to 3
|
||||
move 2 from 5 to 9
|
||||
move 3 from 9 to 7
|
||||
move 2 from 4 to 5
|
||||
move 1 from 5 to 4
|
||||
move 4 from 3 to 8
|
||||
move 1 from 5 to 7
|
||||
move 9 from 6 to 5
|
||||
move 1 from 7 to 6
|
||||
move 1 from 6 to 5
|
||||
move 2 from 6 to 9
|
||||
move 3 from 5 to 1
|
||||
move 13 from 1 to 3
|
||||
move 7 from 7 to 5
|
||||
move 1 from 2 to 9
|
||||
move 3 from 8 to 2
|
||||
move 1 from 7 to 2
|
||||
move 3 from 4 to 3
|
||||
move 19 from 3 to 8
|
||||
move 5 from 3 to 7
|
||||
move 1 from 7 to 1
|
||||
move 19 from 8 to 6
|
||||
move 5 from 1 to 4
|
||||
move 5 from 5 to 2
|
||||
move 2 from 2 to 7
|
||||
move 3 from 4 to 1
|
||||
move 6 from 5 to 7
|
||||
move 2 from 8 to 7
|
||||
move 2 from 2 to 7
|
||||
move 3 from 3 to 5
|
||||
move 5 from 7 to 6
|
||||
move 6 from 6 to 1
|
||||
move 2 from 5 to 1
|
||||
move 2 from 4 to 3
|
||||
move 1 from 5 to 8
|
||||
31
2022/day06/default.nix
Normal file
31
2022/day06/default.nix
Normal file
@@ -0,0 +1,31 @@
|
||||
{ pkgs, lib, AoCLib, ... }:
|
||||
|
||||
with lib;
|
||||
|
||||
let
|
||||
inherit (AoCLib) allUnique;
|
||||
|
||||
countWithNUntil = n: pred: list: let
|
||||
inner = list': count:
|
||||
if pred (take n list')
|
||||
then count
|
||||
else inner (tail list') (count + 1);
|
||||
in inner list 0;
|
||||
|
||||
answerN = n: pipe ./input.txt [
|
||||
fileContents
|
||||
stringToCharacters
|
||||
(countWithNUntil n allUnique)
|
||||
(add n)
|
||||
toString
|
||||
];
|
||||
|
||||
answer1 = answerN 4;
|
||||
answer2 = answerN 14;
|
||||
in pkgs.writeText "answers" ''
|
||||
Task1:
|
||||
${answer1}
|
||||
|
||||
Task2:
|
||||
${answer2}
|
||||
''
|
||||
1
2022/day06/input.txt
Normal file
1
2022/day06/input.txt
Normal file
@@ -0,0 +1 @@
|
||||
pqffvllhrhthvhshhpnhpnpqpvpvrpvpwvwjjdssmcsmccjvjmjjwnjwjwhjwwwzswwhvhwwlvvlbvbtbzbfbzbtbqbgbpbggwzggvjjdpdffbmffntncchtccbcffcjfjnjfnntssvtstzssmnnhrhlhbbwfwjfwjfwwbhhfhmmpsssbnssssfzzfpffdrdpdqqvnncjjgrjjmhhpqqcjqcjjzdzzpvvprrlglrrcmcqqtltdltddswsrrzzwgzzgssczcmzzmgmwgmggwwzttpccmcsmmvfvnvppzlzvzllgclggpfggfnfrfvrvwwvhwwvgwwrbbgfglflblzblzbznzhzffplffnrrcqqsgsvshvhlldhhvnhhmdddnssdvdwdwccggmddsmswwtctdtqqjsshhjzzdpdmpdmppjtjwjswjsjjjsdjjtrtbrbjjwwvnvppqphqhwhcwhwbbpgbbnhbnhhswwdswwlcczdztzbbbnwwtmmpvvgjjqgqdqzzdjdpjjnnffhccscvvchhbmbcbffpdpggvdvttpvpqqhggdtdhtdhhmghmgggzwgwrgwggwlggvpggcfcttzmtmgmvgmmpqmqlmqllsqqjbjwjsszczlzrzgrzzhshlhjjwttwnntbtjtjpplccqrqhrhssbmbttrddfvfwwjcwcvwcwwvpvggqwgwjgwgccvqqcmqqtqnqpnqnffdqfqhhqnhnmhmvhmhwwfrwrggnmmmcnmmgsszmzlmzmddcwwthtssgjsgjjgpgnppdqqcgqggzjgjngnrnggvffgddvtvctcftcftfnnnnhssbgsgwwthtqtltftqtnqttsrtrggwcgwcwmwgmgvmmzrmzrzjzmmcclmmtjmjhmmlhlwlppnpccbbrlrqrcrjrdrlrnngmnmvmcmzczztbblglccvzvppzspsddrzzlsllfzfsspnpdnpnvvvgmmpccmpcpgcpcwcddtmddgwgngqqcpqqlhqqczqqbvqqgdqgqmgmlmmvrrgfgzffbccldcdmmcmcgcngnghngngdngdndcncbbpqbbphbphpccpcwwjswwfttbqbsszccrbbdndsdrdqrqjrjjbmbtbdbbgbvgvcggwdwcccttqccnffjpjqqzpzlzvlljhhschhzlhhfhcfhchvcvtvtgvgzvzrvrdrgrwrjwjljhljlssszsqzsswhhmlhlrhlhzzgghjhzjjcllwrwtrrbdbrbnrnprnrffjvvphhvbbqbbscstsmslmlvmvrmmvvngnlnzzwqzzjqqsqbqrrtmrtmmfgmgrgjjtmjmrrddmrrqmrrjmjqmqnqmmcmlmfmffcgcclplffzvzwvzzjtztftqftqffjjpwjjbpjjggzdgzgwzzfrfvvhfvvwcvvbccfcvffpcpgpbbqhbbhmmzfmfvvnjvnjjhzhqqmffndndmmzhmmqnnlglvvjhjddvggqwgwdgwdggqbqgqrqlrrtptsswlssqwssbdsdrsddjsszjszjjpnjnvnjvnnmznmnddccpwwhshzzcfcqcwcddsjjmnjmjljwwgmglllqlhhctcvvqrvrrhfrrbcrrfbrfbrfrqffbwbqwbbjggsjjjnqqrqsqhhwnhnshnhhdjjqfqpqmmqgqgqggzmmnncrrpgglgqlqclqlsqqwnnfntnzttrnnmtmvvfppbrprzpzzdzvvtctnncpclpccsbbswwcscjssvhvhhqggzmgmqgmgwwgcwgccrllzhzzlzlbljbllmqqpjqqhrhqhjhbbjmjmhmddmwmcmvvmbbmvbmmznnwvwlwtllhwlwgwpgplgpgmgngjgglbglgmllvvlttgrrrlsrllghlggjdjwwfjwfjfvhjmgqnwhwpbdtzrphsqbmmvscslhbdzffsfshgsdjbqbwlgmrtschcnfhdlnndsvpwmwttfglpghhznmgfcjsdlwhnmfqvmpvhgpnnwtjfztbmtprqhsqtjwzhwcqjtjbtqwlcldnvggrwddmpllwnrqwdljwzfzqwcdwgqwvnthnrpcsfwrmqvbzjvzqnmdnfgtbzgtnrvblfwmhdsddgbffnjzvjzfpwglctpqhnqdvtblcchrlmndzhlsczgnsmnbwgnjngnjtlrdpfhqjrwcrqvcpspbtwcvgvvmpnwqjjpdpnslmcrcjnjmhqmrmfbcmrcmpbcbhpcvwqwflljfpgdvqhgdwgcphjqfnqzjjpsqnbtfzhftjtfcbhhcmmlwcfznsflfpphprrgvqwfgjcwfgjfsghzcbqrldwrjlzlbjhpgrbmgdpgzmfsqsphqbbslwwpzspccrhcfrgcjlfwhlcmzdcltbbpcrzglqgqntpwtmgstqlmcsqqbsqgmsmfznwcrfdgvsmnfqmwtsvqvlhwwjlrlhnsvcnrtwwmrjcgfncvlrcqrllndlvmrjpfjpgrrjcwhsqvlbtnlqgwjjqzwcvtvlnfnmqqshbcnqtcbvnwtwbfdgqmvnpmjhlsfdntfwwntvsrrsmspzqmglfnprjtdbmbgnplzzclsjpnzwdhcbhpfnqrgmgqtpfhgnfbqhrpmznbrshjhntzctslwhtgtjvpqhntmchhtncfjmbzcgnpcbpmldrtnpvrzqfftbjjcjlpwwgvmnstjghftcczjzfsftgzpfhbspqmrbfhcdfmqbrgrbsmjvgpbrnvbblwwvqzzpmqrspzvzppjfbgfftdvsdvmrjzhfslptzmgndnqqgmrrfnbbpvbmvpngwjhzvfbwfnzlrgwffvjsfdldfgchfjmnzfnzhwrwttrzlrhmnwvjjdqfmbpfllhrgmddjgnwjnbqwjnslcrdjrmnldcpsgzjpdhrpdfwhbvwhwnhcsmwcwstvqrcrqsnvjrzljfgbljfszchbsqnldgntvcscwqqmpnlwtlfmswtmvrlpzgbrjhtgjgpnhggnprpvwfqpjffqhtfvpnrptgrtwzzlvplgnfjmqphgmnssccrdndqgpljtwtntshrpgsjcdrpmccjnjdgmpmzbfhqjzphcswtwvvqcrwsjhtdqgrhqjmjjcrblpswcblnpzvfztqtbpgjcgngqmwrjtlmhvlsbmrdzwlgqlfqcqnsnjcnddssqbftjvnlgcwwfcgdpdmqrdsjmcnzrfrpnvjmbsltpzwjhjzqqvbgrltczbgvcpwdzqsvhddsbjgjgcmnldrfhnhddlvjcvsnghprjwlghhtghldcqsdcdgnmbcjglvjjvvlbhzczlmjsdqtdpzdtvfztgsdfjsdtfchvzcgvhjnnncmsrfvvmcsjjdftmlpczgvtwngssqmzlmsrrsrbhhhrnwqhmpcdvqmdsvvtsgsqfdcpgsdgzvmbzpbpgtcbshnvdzlmpnwmqrvnmrjprmvppjwfbjhlhzsfhqqzmpbclqvsvfrcqwprrcvqcbbwvnqfwnrgjhlwmgzpfspqrvqrhmqnwvzjrhvvgdgswlvzjjhjtdctlthlpzqhjvwwbpsclpgflcnsdshrqbhmczcwljqlndfnfrcdgmptpsltrcjccnpdchgnswdcpsslcslcjznzpgfhznhbgqhdqvddmqzdnmpshhdcjrsmfjllhfvjvmzzhzrvlbpzqngwmlwcmqnppqzncvjshfrpjlptvnqfrfcrfnbhwhpdqqvjhsqvsmprtgfrddwzjzlwhhqvjpfrwgwvwpszzsfzwjtwngdjfllhjrmqjtmvwsvggnswpqpjbtcrnhhhlzbrvhjdstnpctjlgsffrrbfdvjzhwsgthgfsqnvqdcjffsttlrjnhtqqdpfqpjtdgfwcdwzmwfvqgglsrmmqwbszclpzwldwcswpwfwldrfmmdndcptjbmnvgcpntqcdrcffvgnlpjmcqjpfmbmwjfpqzbzhqtqbzsghbnfvhphfzzhfznttpfrqwpmzjchpzzrdclhdltlqbjmjdfdjqlqbwptsghcnvtdscwgpqnlhhvsvglplhlrwpnzmdbsbrlhmpczzfz
|
||||
71
2022/day07/default.nix
Normal file
71
2022/day07/default.nix
Normal file
@@ -0,0 +1,71 @@
|
||||
{ pkgs, lib, ... }:
|
||||
|
||||
with lib;
|
||||
|
||||
let
|
||||
updateState = s@{ path ? [], filetree ? { } }: line: let
|
||||
splitCommand = splitString " " line;
|
||||
in if line == "$ cd /" then { path = [ "/" ]; inherit filetree; }
|
||||
else if line == "$ cd .." then { path = init path; inherit filetree; }
|
||||
else if elemAt splitCommand 1 == "cd" then { path = path ++ [(elemAt splitCommand 2)]; inherit filetree; }
|
||||
else if line == "$ ls" then s
|
||||
else if head splitCommand == "dir" then s
|
||||
else let
|
||||
newPath = path ++ [(elemAt splitCommand 1)];
|
||||
filesize = toInt (elemAt splitCommand 0);
|
||||
in {
|
||||
inherit path;
|
||||
filetree = recursiveUpdate filetree (setAttrByPath newPath filesize);
|
||||
};
|
||||
|
||||
mapAttrsRecursiveToList = f: g: attrs: let
|
||||
inner = path: attrs': flatten (mapAttrsToList (attrsToListF path) attrs');
|
||||
attrsToListF = path: n: v: let newPath = path ++ [n];
|
||||
in if isAttrs v
|
||||
then g newPath (inner newPath v)
|
||||
else f newPath v;
|
||||
in inner [] attrs;
|
||||
|
||||
backfillDirSizes = { path, size }: dirs:
|
||||
if path == []
|
||||
then dirs
|
||||
else let
|
||||
key = concatStringsSep "/" path;
|
||||
newDirs = recursiveUpdate dirs { ${key} = (dirs.${key} or 0) + size; };
|
||||
in backfillDirSizes { path = init path; inherit size; } newDirs;
|
||||
|
||||
mapFiletreeToDirSizes = attrs: pipe attrs [
|
||||
(mapAttrsRecursiveToList (path: size: { inherit path size; }) (_: v: v))
|
||||
(map (x: x // { path = init x.path; }))
|
||||
(fold backfillDirSizes {})
|
||||
];
|
||||
|
||||
dirSizes = pipe ./input.txt [
|
||||
fileContents
|
||||
(splitString "\n")
|
||||
(foldl updateState { })
|
||||
(x: x.filetree)
|
||||
mapFiletreeToDirSizes
|
||||
];
|
||||
|
||||
answer1 = pipe dirSizes [
|
||||
(filterAttrs (_: v: v <= 100000))
|
||||
attrValues
|
||||
(foldr add 0)
|
||||
toString
|
||||
];
|
||||
|
||||
answer2 = pipe dirSizes [
|
||||
(filterAttrs (_: v: v >= dirSizes."/" - 40000000))
|
||||
attrValues
|
||||
(foldr min (30000000))
|
||||
toString
|
||||
];
|
||||
|
||||
in pkgs.writeText "answers" ''
|
||||
Task1:
|
||||
${answer1}
|
||||
|
||||
Task2:
|
||||
${answer2}
|
||||
''
|
||||
1030
2022/day07/input.txt
Normal file
1030
2022/day07/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
112
2022/day08/default.nix
Normal file
112
2022/day08/default.nix
Normal file
@@ -0,0 +1,112 @@
|
||||
{ pkgs, lib, AoCLib, ... }:
|
||||
|
||||
with lib;
|
||||
|
||||
let
|
||||
inherit (AoCLib) transpose countWhile multiply;
|
||||
|
||||
calculateTreeVisibilityForLine = line: let
|
||||
updateState = { currentMax ? (-1), trees ? [] }: tree:
|
||||
if tree > currentMax then { currentMax = tree; trees = trees ++ [true]; }
|
||||
else { inherit currentMax; trees = trees ++ [false]; };
|
||||
forwards = (foldl updateState { } line).trees;
|
||||
backwards = reverseList (foldr (flip updateState) { } line).trees;
|
||||
in zipListsWith or forwards backwards;
|
||||
|
||||
combineGridsWith = f: grid1: grid2: let
|
||||
height = length grid1;
|
||||
width = length (elemAt grid1 0);
|
||||
elemAt' = row: col: grid: elemAt (elemAt grid row) col;
|
||||
generator = row: col: f (elemAt' row col grid1) (elemAt' row col grid2);
|
||||
in genList (row: genList (col: generator row col) width) height;
|
||||
|
||||
trees = pipe ./input.txt [
|
||||
fileContents
|
||||
(splitString "\n")
|
||||
(map (splitString ""))
|
||||
(map tail)
|
||||
(map init)
|
||||
(map (map toInt))
|
||||
];
|
||||
|
||||
treeVisibleGrid = pipe trees [
|
||||
(lines: { horizontal = lines; vertical = transpose lines; })
|
||||
(mapAttrs (_: map calculateTreeVisibilityForLine))
|
||||
({horizontal, vertical}: { inherit horizontal; vertical = transpose vertical; })
|
||||
({horizontal, vertical}: combineGridsWith or horizontal vertical)
|
||||
];
|
||||
|
||||
visualization = let
|
||||
genColor = name: command: builtins.readFile
|
||||
(pkgs.runCommand name {
|
||||
buildInputs = [ pkgs.ncurses ];
|
||||
} "tput ${command} > $out");
|
||||
red = genColor "red" "setaf 1";
|
||||
green = genColor "green" "setaf 2";
|
||||
clear = genColor "clear" "sgr0";
|
||||
|
||||
greenRedTree = visible: tree:
|
||||
if visible then "${green}${tree}${clear}"
|
||||
else "${red}${tree}${clear}";
|
||||
|
||||
in pipe trees [
|
||||
(map (map toString))
|
||||
(combineGridsWith greenRedTree treeVisibleGrid)
|
||||
(map (concatStringsSep ""))
|
||||
(concatStringsSep "\n")
|
||||
];
|
||||
|
||||
answer1 = pipe treeVisibleGrid [
|
||||
(map (count id))
|
||||
(foldr add 0)
|
||||
toString
|
||||
];
|
||||
|
||||
countUntil = stopPred: xs:
|
||||
if xs == [] then 0
|
||||
else if stopPred (head xs) then 1
|
||||
else 1 + (countUntil stopPred (tail xs));
|
||||
|
||||
visibleDistanceBackwards = line: let
|
||||
measure = trees: size: let
|
||||
newTree = {
|
||||
inherit size;
|
||||
viewDistance = countUntil (x: x.size >= size) trees;
|
||||
};
|
||||
in [newTree] ++ trees;
|
||||
in pipe line [
|
||||
(foldl measure [])
|
||||
(map (x: x.viewDistance))
|
||||
reverseList
|
||||
];
|
||||
|
||||
visibleDistanceHorizontal = line: let
|
||||
backwards = visibleDistanceBackwards line;
|
||||
forwards = pipe line [
|
||||
reverseList
|
||||
visibleDistanceBackwards
|
||||
reverseList
|
||||
];
|
||||
in zipListsWith multiply forwards backwards;
|
||||
|
||||
answer2 = pipe trees [
|
||||
(lines: { horizontal = lines; vertical = transpose lines; })
|
||||
(mapAttrs (_: map visibleDistanceHorizontal))
|
||||
({horizontal, vertical}: { inherit horizontal; vertical = transpose vertical; })
|
||||
({horizontal, vertical}: combineGridsWith multiply horizontal vertical)
|
||||
(map (foldr max 0))
|
||||
(foldr max 0)
|
||||
toString
|
||||
];
|
||||
|
||||
in pkgs.writeText "answers" ''
|
||||
Task1:
|
||||
${answer1}
|
||||
|
||||
Visualization:
|
||||
|
||||
${visualization}
|
||||
|
||||
Task2:
|
||||
${answer2}
|
||||
''
|
||||
99
2022/day08/input.txt
Normal file
99
2022/day08/input.txt
Normal file
@@ -0,0 +1,99 @@
|
||||
020111211022103023211142403044034010412103202221251542233334311102303044440313120021223120332211221
|
||||
121001110111201102213124201444431204213221413222211111444444412110041144131210002230130121313101010
|
||||
112010221202200121420032021412024323255214355122345552225213252324112400440302313420323102103100221
|
||||
211022232121222123201224234031435144114512425232345144523531533222344004011342234110131312300332202
|
||||
202103101023303021233104321411251553151424242531344221312225231225524421412434024103021300123300121
|
||||
202122200002211022342141123051132352344252152315525324551424132421225143201002114204223302333232221
|
||||
011310312223223421431113235421121321152124551441143435255214322514544552225412313011414423301132102
|
||||
121331322013001133311000223433443341113554412556562564315233144532455221433431002003332002203013201
|
||||
003201332004241133340023541532333131413153266664363423353232622124454254554345422200200433100333102
|
||||
230030131344203011040552414515334144165664524445366334422626244444323115333252423443232113432003211
|
||||
020300112334333142144323414353551436334563654426436625356343222253643212532215422020214344013310331
|
||||
220002231221003314452445344223355655546325233543653632544634656464243551334233433413423044300230210
|
||||
111022100242320043435324555421362243363346366346456252353246655455262455415331454531201000441410231
|
||||
101232013434204241242451442362524554225656254252456532663634445256345634451144555513214431300213021
|
||||
021113211441142541244515256653533353262654644343347336234522332254544443346322422154143020040021110
|
||||
002032342223245141521455555365463263562446777664546776637635443223664266645633333231151132112140113
|
||||
002033421301452414544444345232465536465366346553375665564756366435442422632435555111445311104203133
|
||||
332303032232445231354236322622423634433537753546335477544636344436526324435436522445155410213401230
|
||||
214021124335354212514535634245552337436663757533364556376776733565333462254562365531354214423412431
|
||||
231123230423124441525624265443647673566756453545563655373357453547537663433453433212213223101140424
|
||||
100211320333154123522263362425466444634667564437776546465446345667366445453365366551352122420231230
|
||||
024400401554531424535342424657437377754456437376767656436366374765557746355562226364213315421212320
|
||||
214442223135544515264335435467756354735433346664764464468465443746334373746425422542525455354340110
|
||||
141333001441254326655252563743544735555378755475567457777687677357576573543344653346551442221242312
|
||||
022033123224325536562464253467675635635678458757477754757874576653435356676234462564555551451230022
|
||||
444402313413432333426636637636453646648557685556587678886878777785454364533433543362622525453201222
|
||||
031024134513414333456224636475357556855564445765756678575486648885765563445546566235352311454320030
|
||||
341331341415512452344636337436467675565575756658588888477584775646657736366434365523664142235144413
|
||||
333344214132152543325563654447567486457556845676545687457688885466457333476777342344625323533242333
|
||||
203124152315365546566375565336778768544768846599686578655665448478657834657533335544343231212251101
|
||||
200144235323636235437557635373578555545475587655886585897998654658858755534374677344254563233421200
|
||||
433243323452635426237436445738684446475489658878699879887988684656474746764334543334452565153341241
|
||||
340411231113223465344733555465744685569658998876796578688888887678657675875533766464362432543531231
|
||||
132155112416452662274535754677457567869597559977756878779755568868854644586734466764422245333151550
|
||||
321153454153653654743477667888756477986578656976558879999589975695487876766664653466625262642234421
|
||||
414524133155254243564664555445778475666688565697596679558768656758547564888437343772346336642515514
|
||||
321251321324554554436434474754674597576658986766997798688766897876884764444653674674326233445555243
|
||||
031553412663524646375654566887688857698655696699699989968699659665774657875735457664452362352111522
|
||||
121541141642244257534355645887786995858959886778688769889987779898696567777567344373632655621545545
|
||||
334343242432423553675774445756455759676757789677879778999988695976997447856786357655446656351514552
|
||||
125145532643224566754564678556569669557567799868776897666898866898879866784847777744353546366314141
|
||||
045114213352452647446647465888875868689699789677897977779999699895556776458746737674746244442322442
|
||||
132343555663565436365447746478789879798676878686777999789966769777759954677478745673552645533545344
|
||||
045253354653642556466557766588567888887978866878777776986676768968695857655674556463732652626443441
|
||||
324411423536354677366485874488885578788769789998797978797888777868996895476778847746764226464355343
|
||||
355421453642352476436787475855785669696986976979989787787998669696679989555875747556435562425323311
|
||||
225422326356526465747344444546866698678986799879779799999876866969999686664477767757535635652555421
|
||||
215234242322226376376776764668889755898766677787987779877967696689565966757675463574434246652622343
|
||||
214252444222333767567367778585695867987669688798987987789888698888858597545545475573737453632634414
|
||||
435144324646623745547785547465689576878976877888878988989877866686976879488454664357347554642541254
|
||||
424224446333664566656688545685586987987699788897978888788999878967887869445474863534753362524653532
|
||||
234521532264544735666677658457578679997886798878788998987976677895559685784445835563745433436535545
|
||||
541253562333326733576345574569866788667878789897999998887996866685657897848485475437744246636412312
|
||||
531515163362265375476387485646556857878999799999999989879989886696789765664474863474462523344554532
|
||||
134323536435565375644658845476675857999867789999988888799986676978987577885467643356656525623333421
|
||||
432434326635433776557758756889896978587689688777989999797796888999765958586488873373565325435254453
|
||||
352344243543664654777655867556767767686778796989888798998697976755779565488844544677343523234525134
|
||||
023522455223435563774634466685769765877876776996699877886876668865856964846675357575675235445525211
|
||||
452211123455454466574537744568597875596879779869788776669767986968956557448486336534544244456115451
|
||||
154255352645344566574476875484685575595898898697799799688669879869766768688476473673634645556554324
|
||||
153224532366353377543578485765465665577767776999977978876879865565957587758448456773452265664315213
|
||||
212223354662352476456344644856876756566976677698968768897897866997679566845464663374352444344522513
|
||||
333134124655526377555445475778655559695856687767878889687866969787796886748547665457422543622531314
|
||||
114114243655626456537464558857564557866777897897898988696885586978887448448543375665233363532515252
|
||||
022123225426235336675765546686448888566865666569876966556979869667956845877753374733454555422452344
|
||||
105112231544246463366336777688875488697685796985999888976956985978664485756743456372244565641412542
|
||||
243421525526425322655767646868764584599579555769857975877669799998745668566534743565233224245452434
|
||||
310412235133463356343754335447454467578555798898788997569756589585876868467475435524433556255213522
|
||||
122253434533466554567356664688567676567976599967878669868967997845484546736534545734455626245154423
|
||||
313334534424352263526466637778587787868565658999559897596678677574858776343543534432632333531241224
|
||||
001031252124265545567437743765668445564487997555965858678954577555545545743366457636433553523254344
|
||||
044305452425444342246365565576568644874888888677955886697487686854588744354437555336664241413533111
|
||||
110113123534526242542645447354547688467557884774478677887477777586654656653436654455626314334324023
|
||||
403311355254242426345425533745657486754657454674877454647844866774463676664344325662334351444144012
|
||||
114043453225323265365363357353773386544675474785655464585675566555543364665665355442555535443420344
|
||||
234021355512324262426566274773756436677647664566764646854655875476556464746532226425352124354233001
|
||||
104234323224222234534254555373773666356744475886877868685764755374634533664662562645321154355101301
|
||||
413312132345313224565423553463467666456365585778746647466885776356666677636556254365513311121044324
|
||||
010140223145323354554344523347476477547564757555585887484666633663433654743326266555221322431333120
|
||||
023311233225342421354662654347733666374666336373663635367447753577353743232632663243333251551031321
|
||||
143043334422453221246324462653756444767736544367544755375437335646557334655533644454121143303220002
|
||||
101212344011254432246625336226267546745356655577456676377355677475746633565634244145133154032123242
|
||||
233244204414154431434433222525444454344635736634774576466473546373725623264634363324244114303014300
|
||||
010103422332213512154554324533443662535535356636747655647737636354525554536436123454141421414030443
|
||||
203123300244432323224135253642444433566335637575443374634433336553444225543564152215332533001133230
|
||||
213003230312403552352142145445635666323653353353657647435752235322633623453542112525124011312421020
|
||||
120004434213011143254452233425222536464236356544634635324242345464353322232141135221424123200431123
|
||||
331000214011314431233211121223425334456246345226324246526344536556636556453143153253323114441131132
|
||||
303123142412333143322451153243464566344362342525524265432552566442626262524431454151443133021301210
|
||||
220100102032004440315125323552226234566265233246334556355333643662354455122325544112124232340231031
|
||||
112122312031202424345533512342151435534325334444254264542526645645533111234131131223411304322200110
|
||||
213031212133401330114433121533455425225634422363334633454623522242353342455454511303033230433202120
|
||||
223232022333401311421344332255311133421254642562465526534445512134533413153142410113101444330132130
|
||||
020133013100324344342244215442123125243314222446342424421353134352515124333133430431401122202211032
|
||||
102300310001014311443112031115242425132234255215315523551534154524134344433432201022200432133000302
|
||||
001233311232134334100401400151532231322435145412132433235254313414243334103312232304403111313321210
|
||||
110213022233310011220103432114343112114222424442543155552411511144115122143322304023012132213011210
|
||||
000220123220323122321103444304134551331233141552114422121151224211122042434324042030120133230110110
|
||||
020120232301110331441234422110132302233413123211331413433254521355004032312110222131010330301222211
|
||||
5
2022/day08/test.txt
Normal file
5
2022/day08/test.txt
Normal file
@@ -0,0 +1,5 @@
|
||||
30373
|
||||
25512
|
||||
65332
|
||||
33549
|
||||
35390
|
||||
92
2022/day09/default.nix
Normal file
92
2022/day09/default.nix
Normal file
@@ -0,0 +1,92 @@
|
||||
{ pkgs, lib, AoCLib, ... }:
|
||||
|
||||
with lib;
|
||||
|
||||
let
|
||||
inherit (AoCLib) scanl abs repeat cmp;
|
||||
|
||||
mapDirectionStepsToHorizontalVertical = { direction, steps }: {
|
||||
horizontal = if direction == "L" then steps else
|
||||
if direction == "R" then -steps else 0;
|
||||
vertical = if direction == "D" then steps else
|
||||
if direction == "U" then -steps else 0;
|
||||
};
|
||||
|
||||
foldHeadPosition =
|
||||
{ x ? 0, y ? 0 }:
|
||||
{ horizontal, vertical }: {
|
||||
x = x + horizontal;
|
||||
y = y + vertical;
|
||||
};
|
||||
|
||||
movements = pipe ./input.txt [
|
||||
fileContents
|
||||
(splitString "\n")
|
||||
(map (splitString " "))
|
||||
(map (x: { direction = head x; steps = toInt (elemAt x 1); }))
|
||||
(map mapDirectionStepsToHorizontalVertical)
|
||||
(scanl foldHeadPosition {})
|
||||
];
|
||||
|
||||
ropePieceLength = headPiece: tailPiece: let
|
||||
deltaX = abs (headPiece.x - tailPiece.x);
|
||||
deltaY = abs (headPiece.y - tailPiece.y);
|
||||
in max deltaX deltaY;
|
||||
|
||||
moveRopePiece = headPiece: tailPiece: {
|
||||
x = tailPiece.x + (cmp headPiece.x tailPiece.x);
|
||||
y = tailPiece.y + (cmp headPiece.y tailPiece.y);
|
||||
};
|
||||
|
||||
moveRope = headToOverlap: rope: let
|
||||
newHead = moveRopePiece headToOverlap (head rope);
|
||||
moveIfNextPieceMoved = x: y:
|
||||
if ropePieceLength x y > 1
|
||||
then moveRopePiece x y
|
||||
else y;
|
||||
newTail = scanl moveIfNextPieceMoved newHead (tail rope);
|
||||
in [newHead] ++ newTail;
|
||||
|
||||
moveRopeUntilHeadOverlapsAndReportLastPositions = headToOverlap: rope: let
|
||||
newRope = moveRope headToOverlap rope;
|
||||
nextIteration = moveRopeUntilHeadOverlapsAndReportLastPositions headToOverlap newRope;
|
||||
in if head rope == headToOverlap
|
||||
then {
|
||||
inherit rope;
|
||||
tailPositions = [];
|
||||
}
|
||||
else {
|
||||
inherit (nextIteration) rope;
|
||||
tailPositions = [(last newRope)] ++ nextIteration.tailPositions;
|
||||
};
|
||||
|
||||
f = n: { rope ? (repeat { x = 0; y = 0; } n), tailPositions ? [{ x = 0; y = 0; }] }: newHeadPosition: let
|
||||
newRope = moveRopeUntilHeadOverlapsAndReportLastPositions newHeadPosition rope;
|
||||
in {
|
||||
rope = newRope.rope;
|
||||
tailPositions = tailPositions ++ newRope.tailPositions;
|
||||
};
|
||||
|
||||
answer1 = pipe movements [
|
||||
(foldl (f 2) {})
|
||||
(x: x.tailPositions)
|
||||
unique
|
||||
length
|
||||
toString
|
||||
];
|
||||
|
||||
answer2 = pipe movements [
|
||||
(foldl (f 10) {})
|
||||
(x: x.tailPositions)
|
||||
unique
|
||||
length
|
||||
toString
|
||||
];
|
||||
|
||||
in pkgs.writeText "answers" ''
|
||||
Task1:
|
||||
${answer1}
|
||||
|
||||
Task2:
|
||||
${answer2}
|
||||
''
|
||||
2000
2022/day09/input.txt
Normal file
2000
2022/day09/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
59
2022/day10/default.nix
Normal file
59
2022/day10/default.nix
Normal file
@@ -0,0 +1,59 @@
|
||||
{ pkgs, lib, AoCLib, ... }:
|
||||
|
||||
with lib;
|
||||
|
||||
let
|
||||
inherit (AoCLib) toInt repeat takeWithStride chunksOf;
|
||||
|
||||
lineToInstruction = line:
|
||||
if line == "noop"
|
||||
then { type = "n"; }
|
||||
else { type = "a"; val = toInt (elemAt (splitString " " line) 1); };
|
||||
|
||||
foldToSignalState = { cycles ? 0, X ? 0, nextX ? 1 }: instructions: let
|
||||
instr = head instructions;
|
||||
nextSignalState = if instr.type == "n"
|
||||
then { cycles = 1; X = nextX; inherit nextX; }
|
||||
# Implicit `addx`
|
||||
else { cycles = 2; X = nextX; nextX = nextX + instr.val; };
|
||||
in if instructions == [] then [] else [nextSignalState] ++ (foldToSignalState nextSignalState (tail instructions));
|
||||
|
||||
expandSignalStates = signalStates: let
|
||||
s = head signalStates;
|
||||
in if signalStates == []
|
||||
then []
|
||||
else (repeat s.X s.cycles) ++ (expandSignalStates (tail signalStates));
|
||||
|
||||
signalStates = pipe ./input.txt [
|
||||
fileContents
|
||||
(splitString "\n")
|
||||
(map lineToInstruction)
|
||||
(foldToSignalState {})
|
||||
expandSignalStates
|
||||
];
|
||||
|
||||
answer1 = pipe signalStates [
|
||||
(imap1 (i: v: i * v))
|
||||
(drop 19)
|
||||
(takeWithStride 40)
|
||||
(foldr add 0)
|
||||
toString
|
||||
];
|
||||
|
||||
f = i: v: if v <= i && i <= v + 2 then "#" else ".";
|
||||
|
||||
answer2 = pipe signalStates [
|
||||
(chunksOf 40)
|
||||
(map (imap1 f))
|
||||
(map (concatStringsSep ""))
|
||||
(concatStringsSep "\n")
|
||||
toString
|
||||
];
|
||||
|
||||
in pkgs.writeText "answers" ''
|
||||
Task1:
|
||||
${answer1}
|
||||
|
||||
Task2:
|
||||
${answer2}
|
||||
''
|
||||
139
2022/day10/input.txt
Normal file
139
2022/day10/input.txt
Normal file
@@ -0,0 +1,139 @@
|
||||
noop
|
||||
noop
|
||||
noop
|
||||
addx 5
|
||||
noop
|
||||
addx 1
|
||||
addx 2
|
||||
addx 5
|
||||
addx 2
|
||||
addx 1
|
||||
noop
|
||||
addx 5
|
||||
noop
|
||||
addx -1
|
||||
noop
|
||||
addx 5
|
||||
noop
|
||||
noop
|
||||
addx 5
|
||||
addx 1
|
||||
noop
|
||||
noop
|
||||
addx 3
|
||||
addx 2
|
||||
noop
|
||||
addx -38
|
||||
noop
|
||||
addx 3
|
||||
addx 2
|
||||
addx -5
|
||||
addx 12
|
||||
addx 2
|
||||
addx 27
|
||||
addx -40
|
||||
addx 19
|
||||
addx 2
|
||||
addx 19
|
||||
addx -18
|
||||
addx 2
|
||||
addx 5
|
||||
addx 2
|
||||
addx -23
|
||||
addx 22
|
||||
addx 4
|
||||
addx -34
|
||||
addx -1
|
||||
addx 5
|
||||
noop
|
||||
addx 2
|
||||
addx 1
|
||||
addx 20
|
||||
addx -17
|
||||
noop
|
||||
addx 25
|
||||
addx -17
|
||||
addx -2
|
||||
noop
|
||||
addx 3
|
||||
addx 19
|
||||
addx -12
|
||||
addx 3
|
||||
addx -2
|
||||
addx 3
|
||||
addx 1
|
||||
noop
|
||||
addx 5
|
||||
noop
|
||||
noop
|
||||
addx -37
|
||||
addx 3
|
||||
addx 4
|
||||
noop
|
||||
addx 24
|
||||
addx -6
|
||||
addx -15
|
||||
addx 2
|
||||
noop
|
||||
addx 6
|
||||
addx -2
|
||||
addx 6
|
||||
addx -12
|
||||
addx -2
|
||||
addx 19
|
||||
noop
|
||||
noop
|
||||
noop
|
||||
addx 3
|
||||
noop
|
||||
addx 7
|
||||
addx -2
|
||||
addx -24
|
||||
addx -11
|
||||
addx 4
|
||||
addx 3
|
||||
addx -2
|
||||
noop
|
||||
addx 7
|
||||
addx -2
|
||||
addx 2
|
||||
noop
|
||||
addx 3
|
||||
addx 7
|
||||
noop
|
||||
addx -2
|
||||
addx 5
|
||||
addx 2
|
||||
addx 5
|
||||
noop
|
||||
noop
|
||||
noop
|
||||
addx 3
|
||||
addx -35
|
||||
addx 35
|
||||
addx -21
|
||||
addx -14
|
||||
noop
|
||||
addx 5
|
||||
addx 2
|
||||
addx 33
|
||||
addx -7
|
||||
addx -23
|
||||
addx 5
|
||||
addx 2
|
||||
addx 1
|
||||
noop
|
||||
noop
|
||||
addx 5
|
||||
addx -1
|
||||
noop
|
||||
addx 3
|
||||
addx -23
|
||||
addx 30
|
||||
addx 1
|
||||
noop
|
||||
addx 4
|
||||
addx -17
|
||||
addx 11
|
||||
noop
|
||||
noop
|
||||
26
2022/flake.lock
generated
Normal file
26
2022/flake.lock
generated
Normal file
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"nodes": {
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1669834992,
|
||||
"narHash": "sha256-YnhZGHgb4C3Q7DSGisO/stc50jFb9F/MzHeKS4giotg=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "596a8e828c5dfa504f91918d0fa4152db3ab5502",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"id": "nixpkgs",
|
||||
"ref": "nixos-22.11",
|
||||
"type": "indirect"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"nixpkgs": "nixpkgs"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
||||
22
2022/flake.nix
Normal file
22
2022/flake.nix
Normal file
@@ -0,0 +1,22 @@
|
||||
{
|
||||
inputs.nixpkgs.url = "nixpkgs/nixos-22.11";
|
||||
|
||||
outputs = { self, nixpkgs }: let
|
||||
system = "x86_64-linux";
|
||||
pkgs = nixpkgs.legacyPackages.${system};
|
||||
in {
|
||||
AoCLib = pkgs.callPackage ./lib.nix { };
|
||||
packages.${system} = {
|
||||
day01 = pkgs.callPackage ./day01 { inherit (self) AoCLib; };
|
||||
day02 = pkgs.callPackage ./day02 { inherit (self) AoCLib; };
|
||||
day03 = pkgs.callPackage ./day03 { inherit (self) AoCLib; };
|
||||
day04 = pkgs.callPackage ./day04 { inherit (self) AoCLib; };
|
||||
day05 = pkgs.callPackage ./day05 { inherit (self) AoCLib; };
|
||||
day06 = pkgs.callPackage ./day06 { inherit (self) AoCLib; };
|
||||
day07 = pkgs.callPackage ./day07 { inherit (self) AoCLib; };
|
||||
day08 = pkgs.callPackage ./day08 { inherit (self) AoCLib; };
|
||||
day09 = pkgs.callPackage ./day09 { inherit (self) AoCLib; };
|
||||
day10 = pkgs.callPackage ./day10 { inherit (self) AoCLib; };
|
||||
};
|
||||
};
|
||||
}
|
||||
117
2022/lib.nix
Normal file
117
2022/lib.nix
Normal file
@@ -0,0 +1,117 @@
|
||||
{ pkgs, lib }: with lib; rec {
|
||||
# Transpose a square grid
|
||||
#
|
||||
# [[a]] -> [[a]]
|
||||
transpose = grid:
|
||||
genList (n: map ((flip elemAt) n) grid) (length grid);
|
||||
|
||||
# Checks if there are any duplicate items in the list,
|
||||
# in which case it returns false.
|
||||
#
|
||||
# [a] -> Bool
|
||||
allUnique = list: list == []
|
||||
|| !(elem (head list) (tail list)) && allUnique (tail list);
|
||||
|
||||
# Takes items until either a predicate fails, or the list is empty.
|
||||
#
|
||||
# (a -> Bool) -> [a] -> Int
|
||||
takeWhile = pred: xs:
|
||||
if xs == [] || !(stopPred (head xs))
|
||||
then []
|
||||
else [(head xs)] + (takeWhile pred (tail xs));
|
||||
|
||||
# Counts items until either a predicate fails, or the list is empty
|
||||
#
|
||||
# (a -> Bool) -> [a] -> Int
|
||||
countWhile = pred: xs: length (takeWhile head xs);
|
||||
|
||||
# Like foldl, but keeps all intermediate values
|
||||
#
|
||||
# (b -> a -> b) -> b -> [a] -> [b]
|
||||
scanl = f: x1: list: let
|
||||
x2 = head list;
|
||||
x1' = f x1 x2;
|
||||
in if list == [] then [] else [x1'] ++ (scanl f x1' (tail list));
|
||||
|
||||
# Like scanl, but uses the first element as its start element.
|
||||
#
|
||||
# (a -> a -> a) -> [a] -> [a]
|
||||
scanl1 = f: list:
|
||||
if list == [] then [] else scanl f (head list) (tail list);
|
||||
|
||||
# See https://github.com/NixOS/nixpkgs/pull/205457
|
||||
toInt = str:
|
||||
let
|
||||
inherit (builtins) match fromJSON;
|
||||
# RegEx: Match any leading whitespace, possibly a '-', one or more digits,
|
||||
# and finally match any trailing whitespace.
|
||||
strippedInput = match "[[:space:]]*(-?[[:digit:]]+)[[:space:]]*" str;
|
||||
|
||||
# RegEx: Match a leading '0' then one or more digits.
|
||||
isLeadingZero = match "0[[:digit:]]+" (head strippedInput) == [];
|
||||
|
||||
# Attempt to parse input
|
||||
parsedInput = fromJSON (head strippedInput);
|
||||
|
||||
generalError = "toInt: Could not convert ${escapeNixString str} to int.";
|
||||
|
||||
octalAmbigError = "toInt: Ambiguity in interpretation of ${escapeNixString str}"
|
||||
+ " between octal and zero padded integer.";
|
||||
|
||||
in
|
||||
# Error on presence of non digit characters.
|
||||
if strippedInput == null
|
||||
then throw generalError
|
||||
# Error on presence of leading zero/octal ambiguity.
|
||||
else if isLeadingZero
|
||||
then throw octalAmbigError
|
||||
# Error if parse function fails.
|
||||
else if !isInt parsedInput
|
||||
then throw generalError
|
||||
# Return result.
|
||||
else parsedInput;
|
||||
|
||||
# Trivial function to wrap around the multiplication operation.
|
||||
#
|
||||
# Number -> Number -> Number
|
||||
multiply = x: y: x * y;
|
||||
|
||||
# Trivial function to take the absolute value of a number
|
||||
#
|
||||
# Number -> Number
|
||||
abs = x: if x < 0 then -x else x;
|
||||
|
||||
# Generate a list by repeating an element n times.
|
||||
#
|
||||
# a -> Int -> [a]
|
||||
repeat = item: times: map (const item) (range 1 times);
|
||||
|
||||
# Compare two items, return either 1, 0, or -1 depending on whether
|
||||
# one is bigger than the other.
|
||||
#
|
||||
# Ord a => a -> a -> Int
|
||||
cmp = x: y: if x > y then 1 else if x < y then -1 else 0;
|
||||
|
||||
# Take 1 item, and skip the n-1 next items continuosly until the list is empty.
|
||||
#
|
||||
# Int -> [a] -> [a]
|
||||
takeWithStride = n: l:
|
||||
if l == [] then [] else [(head l)] ++ takeWithStride n (drop n l);
|
||||
|
||||
# Split a list at every n items.
|
||||
#
|
||||
# Int -> [a] -> [[a]]
|
||||
chunksOf = n: list: if list == []
|
||||
then []
|
||||
else [(take n list)] ++ (chunksOf n (drop n list));
|
||||
|
||||
# Map something orderable through a function f if it is between min and max.
|
||||
#
|
||||
# Ord a => a -> a -> (a -> b) -> a -> Either a b
|
||||
mapRange = min: max: f: o: if min <= o && o < max then f o else o;
|
||||
|
||||
# Shift a number n by an offset if it is between min and max.
|
||||
#
|
||||
# Number -> Number -> Number -> Number -> Number
|
||||
transformRange = min: max: offset: n: mapRange min max (x: x + offset) n;
|
||||
}
|
||||
Reference in New Issue
Block a user