Move 2022 into a separate directory

This commit is contained in:
2023-12-01 21:13:42 +01:00
parent a41e1ce80e
commit 77faa66e9d
25 changed files with 0 additions and 0 deletions

13
2022/README.md Normal file
View 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
View 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

File diff suppressed because it is too large Load Diff

53
2022/day02/default.nix Normal file
View 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

File diff suppressed because it is too large Load Diff

70
2022/day03/default.nix Normal file
View 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
View 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
View 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

File diff suppressed because it is too large Load Diff

76
2022/day05/default.nix Normal file
View 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
View 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
View 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
View File

@@ -0,0 +1 @@
pqffvllhrhthvhshhpnhpnpqpvpvrpvpwvwjjdssmcsmccjvjmjjwnjwjwhjwwwzswwhvhwwlvvlbvbtbzbfbzbtbqbgbpbggwzggvjjdpdffbmffntncchtccbcffcjfjnjfnntssvtstzssmnnhrhlhbbwfwjfwjfwwbhhfhmmpsssbnssssfzzfpffdrdpdqqvnncjjgrjjmhhpqqcjqcjjzdzzpvvprrlglrrcmcqqtltdltddswsrrzzwgzzgssczcmzzmgmwgmggwwzttpccmcsmmvfvnvppzlzvzllgclggpfggfnfrfvrvwwvhwwvgwwrbbgfglflblzblzbznzhzffplffnrrcqqsgsvshvhlldhhvnhhmdddnssdvdwdwccggmddsmswwtctdtqqjsshhjzzdpdmpdmppjtjwjswjsjjjsdjjtrtbrbjjwwvnvppqphqhwhcwhwbbpgbbnhbnhhswwdswwlcczdztzbbbnwwtmmpvvgjjqgqdqzzdjdpjjnnffhccscvvchhbmbcbffpdpggvdvttpvpqqhggdtdhtdhhmghmgggzwgwrgwggwlggvpggcfcttzmtmgmvgmmpqmqlmqllsqqjbjwjsszczlzrzgrzzhshlhjjwttwnntbtjtjpplccqrqhrhssbmbttrddfvfwwjcwcvwcwwvpvggqwgwjgwgccvqqcmqqtqnqpnqnffdqfqhhqnhnmhmvhmhwwfrwrggnmmmcnmmgsszmzlmzmddcwwthtssgjsgjjgpgnppdqqcgqggzjgjngnrnggvffgddvtvctcftcftfnnnnhssbgsgwwthtqtltftqtnqttsrtrggwcgwcwmwgmgvmmzrmzrzjzmmcclmmtjmjhmmlhlwlppnpccbbrlrqrcrjrdrlrnngmnmvmcmzczztbblglccvzvppzspsddrzzlsllfzfsspnpdnpnvvvgmmpccmpcpgcpcwcddtmddgwgngqqcpqqlhqqczqqbvqqgdqgqmgmlmmvrrgfgzffbccldcdmmcmcgcngnghngngdngdndcncbbpqbbphbphpccpcwwjswwfttbqbsszccrbbdndsdrdqrqjrjjbmbtbdbbgbvgvcggwdwcccttqccnffjpjqqzpzlzvlljhhschhzlhhfhcfhchvcvtvtgvgzvzrvrdrgrwrjwjljhljlssszsqzsswhhmlhlrhlhzzgghjhzjjcllwrwtrrbdbrbnrnprnrffjvvphhvbbqbbscstsmslmlvmvrmmvvngnlnzzwqzzjqqsqbqrrtmrtmmfgmgrgjjtmjmrrddmrrqmrrjmjqmqnqmmcmlmfmffcgcclplffzvzwvzzjtztftqftqffjjpwjjbpjjggzdgzgwzzfrfvvhfvvwcvvbccfcvffpcpgpbbqhbbhmmzfmfvvnjvnjjhzhqqmffndndmmzhmmqnnlglvvjhjddvggqwgwdgwdggqbqgqrqlrrtptsswlssqwssbdsdrsddjsszjszjjpnjnvnjvnnmznmnddccpwwhshzzcfcqcwcddsjjmnjmjljwwgmglllqlhhctcvvqrvrrhfrrbcrrfbrfbrfrqffbwbqwbbjggsjjjnqqrqsqhhwnhnshnhhdjjqfqpqmmqgqgqggzmmnncrrpgglgqlqclqlsqqwnnfntnzttrnnmtmvvfppbrprzpzzdzvvtctnncpclpccsbbswwcscjssvhvhhqggzmgmqgmgwwgcwgccrllzhzzlzlbljbllmqqpjqqhrhqhjhbbjmjmhmddmwmcmvvmbbmvbmmznnwvwlwtllhwlwgwpgplgpgmgngjgglbglgmllvvlttgrrrlsrllghlggjdjwwfjwfjfvhjmgqnwhwpbdtzrphsqbmmvscslhbdzffsfshgsdjbqbwlgmrtschcnfhdlnndsvpwmwttfglpghhznmgfcjsdlwhnmfqvmpvhgpnnwtjfztbmtprqhsqtjwzhwcqjtjbtqwlcldnvggrwddmpllwnrqwdljwzfzqwcdwgqwvnthnrpcsfwrmqvbzjvzqnmdnfgtbzgtnrvblfwmhdsddgbffnjzvjzfpwglctpqhnqdvtblcchrlmndzhlsczgnsmnbwgnjngnjtlrdpfhqjrwcrqvcpspbtwcvgvvmpnwqjjpdpnslmcrcjnjmhqmrmfbcmrcmpbcbhpcvwqwflljfpgdvqhgdwgcphjqfnqzjjpsqnbtfzhftjtfcbhhcmmlwcfznsflfpphprrgvqwfgjcwfgjfsghzcbqrldwrjlzlbjhpgrbmgdpgzmfsqsphqbbslwwpzspccrhcfrgcjlfwhlcmzdcltbbpcrzglqgqntpwtmgstqlmcsqqbsqgmsmfznwcrfdgvsmnfqmwtsvqvlhwwjlrlhnsvcnrtwwmrjcgfncvlrcqrllndlvmrjpfjpgrrjcwhsqvlbtnlqgwjjqzwcvtvlnfnmqqshbcnqtcbvnwtwbfdgqmvnpmjhlsfdntfwwntvsrrsmspzqmglfnprjtdbmbgnplzzclsjpnzwdhcbhpfnqrgmgqtpfhgnfbqhrpmznbrshjhntzctslwhtgtjvpqhntmchhtncfjmbzcgnpcbpmldrtnpvrzqfftbjjcjlpwwgvmnstjghftcczjzfsftgzpfhbspqmrbfhcdfmqbrgrbsmjvgpbrnvbblwwvqzzpmqrspzvzppjfbgfftdvsdvmrjzhfslptzmgndnqqgmrrfnbbpvbmvpngwjhzvfbwfnzlrgwffvjsfdldfgchfjmnzfnzhwrwttrzlrhmnwvjjdqfmbpfllhrgmddjgnwjnbqwjnslcrdjrmnldcpsgzjpdhrpdfwhbvwhwnhcsmwcwstvqrcrqsnvjrzljfgbljfszchbsqnldgntvcscwqqmpnlwtlfmswtmvrlpzgbrjhtgjgpnhggnprpvwfqpjffqhtfvpnrptgrtwzzlvplgnfjmqphgmnssccrdndqgpljtwtntshrpgsjcdrpmccjnjdgmpmzbfhqjzphcswtwvvqcrwsjhtdqgrhqjmjjcrblpswcblnpzvfztqtbpgjcgngqmwrjtlmhvlsbmrdzwlgqlfqcqnsnjcnddssqbftjvnlgcwwfcgdpdmqrdsjmcnzrfrpnvjmbsltpzwjhjzqqvbgrltczbgvcpwdzqsvhddsbjgjgcmnldrfhnhddlvjcvsnghprjwlghhtghldcqsdcdgnmbcjglvjjvvlbhzczlmjsdqtdpzdtvfztgsdfjsdtfchvzcgvhjnnncmsrfvvmcsjjdftmlpczgvtwngssqmzlmsrrsrbhhhrnwqhmpcdvqmdsvvtsgsqfdcpgsdgzvmbzpbpgtcbshnvdzlmpnwmqrvnmrjprmvppjwfbjhlhzsfhqqzmpbclqvsvfrcqwprrcvqcbbwvnqfwnrgjhlwmgzpfspqrvqrhmqnwvzjrhvvgdgswlvzjjhjtdctlthlpzqhjvwwbpsclpgflcnsdshrqbhmczcwljqlndfnfrcdgmptpsltrcjccnpdchgnswdcpsslcslcjznzpgfhznhbgqhdqvddmqzdnmpshhdcjrsmfjllhfvjvmzzhzrvlbpzqngwmlwcmqnppqzncvjshfrpjlptvnqfrfcrfnbhwhpdqqvjhsqvsmprtgfrddwzjzlwhhqvjpfrwgwvwpszzsfzwjtwngdjfllhjrmqjtmvwsvggnswpqpjbtcrnhhhlzbrvhjdstnpctjlgsffrrbfdvjzhwsgthgfsqnvqdcjffsttlrjnhtqqdpfqpjtdgfwcdwzmwfvqgglsrmmqwbszclpzwldwcswpwfwldrfmmdndcptjbmnvgcpntqcdrcffvgnlpjmcqjpfmbmwjfpqzbzhqtqbzsghbnfvhphfzzhfznttpfrqwpmzjchpzzrdclhdltlqbjmjdfdjqlqbwptsghcnvtdscwgpqnlhhvsvglplhlrwpnzmdbsbrlhmpczzfz

71
2022/day07/default.nix Normal file
View 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

File diff suppressed because it is too large Load Diff

112
2022/day08/default.nix Normal file
View 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
View 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
View File

@@ -0,0 +1,5 @@
30373
25512
65332
33549
35390

92
2022/day09/default.nix Normal file
View 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

File diff suppressed because it is too large Load Diff

59
2022/day10/default.nix Normal file
View 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
View 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
View 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
View 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
View 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;
}