Compare commits

...

4 Commits

Author SHA1 Message Date
67ee67ea42 Updating README.md 2020-12-22 16:32:29 -08:00
038e67d444 Day 22 part 2 doc comment 2020-12-22 15:36:32 -08:00
b7ff05ac27 Day 22 part 1 solution 2020-12-22 15:28:13 -08:00
b160a511b3 Day 21 cleanup debugging. 2020-12-22 14:57:48 -08:00
5 changed files with 686 additions and 103 deletions

View File

@ -1,155 +1,236 @@
```
Advent of code 2020
Day 1 - Part 1 - binary: 1006875
generator: 21.838µs,
runner: 1.773µs
generator: 21.403µs,
runner: 581ns
Day 1 - Part 1 - linear: 1006875
generator: 5.339µs,
runner: 8.329µs
generator: 8.431µs,
runner: 11.164µs
Day 1 - Part 1 - set: 1006875
generator: 18.303µs,
runner: 1.392µs
generator: 22.51µs,
runner: 1.04µs
Day 1 - Part 2: 165026160
generator: 4.735µs,
runner: 1.465477ms
generator: 6.176µs,
runner: 1.320463ms
Day 2 - Part 1: 640
generator: 1.713032ms,
runner: 123.609µs
generator: 1.572384ms,
runner: 99.594µs
Day 2 - Part 1 - handrolled: 640
generator: 173.912µs,
runner: 109.58µs
generator: 202.476µs,
runner: 106.704µs
Day 2 - Part 2: 472
generator: 1.475144ms,
runner: 10.985µs
generator: 1.341148ms,
runner: 10.37µs
Day 3 - Part 1: 148
generator: 38.406µs,
runner: 2.797µs
generator: 35.027µs,
runner: 1.018µs
Day 3 - Part 2: 727923200
generator: 37.063µs,
runner: 12.181µs
generator: 33.64µs,
runner: 4.379µs
Day 4 - Part 1: 239
generator: 372.532µs,
runner: 1.922µs
generator: 351.073µs,
runner: 1.736µs
Day 4 - Part 2: 188
generator: 363.202µs,
runner: 43.784µs
generator: 332.453µs,
runner: 42.199µs
Day 5 - Part 1 - glenng: 989
generator: 171ns,
runner: 81.501µs
generator: 181ns,
runner: 77.639µs
Day 5 - Part 1 - wathiede: 989
generator: 85.614µs,
runner: 459ns
generator: 83.219µs,
runner: 632ns
Day 5 - Part 2 - wathiede: 548
generator: 86.417µs,
runner: 29.328µs
generator: 76.923µs,
runner: 28.274µs
Day 6 - Part 1: 6930
generator: 118ns,
runner: 630.141µs
generator: 122ns,
runner: 548.722µs
Day 6 - Part 2: 3585
generator: 127ns,
runner: 2.007135ms
generator: 109ns,
runner: 1.786837ms
Day 6 - Part 2 - faster: 3585
generator: 129ns,
runner: 1.095441ms
generator: 119ns,
runner: 911.866µs
Day 7 - Part 1: 222
generator: 1.109401ms,
runner: 202.592µs
generator: 936.409µs,
runner: 181.642µs
Day 7 - Part 2: 13264
generator: 1.092186ms,
runner: 5.447µs
generator: 898.057µs,
runner: 4.034µs
Day 8 - Part 1: 1744
generator: 143ns,
runner: 47.289µs
generator: 183ns,
runner: 38.058µs
Day 8 - Part 2: 1174
generator: 111ns,
runner: 150.1µs
generator: 119ns,
runner: 144.217µs
Day 9 - Part 1: 1309761972
generator: 27.284µs,
runner: 37.991µs
generator: 29.337µs,
runner: 40.825µs
Day 9 - Part 1 - sorted: 1309761972
generator: 26.598µs,
runner: 230.765µs
generator: 26.371µs,
runner: 222.038µs
Day 9 - Part 2: 177989832
generator: 28.558µs,
runner: 124.417µs
generator: 29.874µs,
runner: 119.825µs
Day 10 - Part 1: 1625
generator: 6.835µs,
runner: 421ns
generator: 6.602µs,
runner: 528ns
Day 10 - Part 2: 3100448333024
generator: 4.802µs,
runner: 1.176µs
generator: 4.893µs,
runner: 1.448µs
Day 11 - Part 1: 2338
generator: 75.55µs,
runner: 11.383128ms
generator: 67.172µs,
runner: 12.483103ms
Day 11 - Part 2: 2134
generator: 58.641µs,
runner: 49.994105ms
generator: 117.56µs,
runner: 47.514021ms
Day 12 - Part 1: 1838
generator: 38.302µs,
runner: 8.936µs
generator: 81.477µs,
runner: 9.093µs
Day 12 - Part 2: 89936
generator: 33.951µs,
runner: 8.316µs
generator: 55.605µs,
runner: 8.085µs
Day 13 - Part 1: 153
generator: 2.04µs,
runner: 205ns
generator: 2.293µs,
runner: 384ns
Day 13 - Part 2: 471793476184394
generator: 2.258µs,
runner: 3.68µs
generator: 2.142µs,
runner: 2.576µs
Day 14 - Part 1: 10717676595607
generator: 93ns,
runner: 89.201µs
generator: 86ns,
runner: 117.882µs
Day 14 - Part 2: 3974538275659
generator: 92ns,
runner: 5.803116ms
generator: 155ns,
runner: 5.737865ms
Day 15 - Part 1: 929
generator: 177ns,
runner: 253.908µs
generator: 145ns,
runner: 257.345µs
Day 15 - Part 2: 16671510
generator: 114ns,
runner: 2.423626128s
generator: 106ns,
runner: 2.520441045s
Day 16 - Part 1: 23115
generator: 246.028µs,
runner: 24.917µs
generator: 268.255µs,
runner: 23.009µs
Day 16 - Part 2: 239727793813
generator: 246.67µs,
runner: 429.366µs
generator: 214.632µs,
runner: 392.169µs
Day 17 - Part 1: 315
generator: 3.741µs,
runner: 2.863143ms
Day 17 - Part 2: 1520
generator: 2.332µs,
runner: 29.722289ms
Day 19 - Part 1: 178
generator: 1.706494ms,
runner: 228.465µs
Day 19 - Part 2: 346
generator: 50.489244ms,
runner: 9.837093ms
Day 21 - Part 1: 2595
generator: 314.271µs,
runner: 613.046µs
["sesame", "nuts"]: thvm ckqq qrsczjv zmb zrgzf jmdg hlmvqh *pnglkx *nfnzx *tjsdp *jkbqk *rpmqq *gzgvdh *rgdx *szsbj *xjdhk *zfml *ddbmq *mvnqdh *gsgmdn *dtlhh *rqqfnlc *bxv *nthhxn *hnmjfl *fkh *hkxcb *rpcdfph *flhfddq *qspfqb *rpmmv *jfqqgtl *xxfgvz *kltcm *xjrpr *vnfmc *xhmmt *zkzdrn *xgbvk *ngqh *djpsmd *bnzq *rbvdt *tfmgl *pjln
["sesame"]: thvm mrfxh ckqq hlmvqh zmb qrsczjv zrgzf *qchnn *dnpgcd *zfml *gsgmdn *frld *nfnzx *nqfc *xbpb *kltcm *ljmvpp *zntrfp *gzgvdh *rrbndl *pptgt *rknm *qsgb *mstc *zzldmh *nggcjr *bkd *zfsks *cxzkmr *tzjnvp *npbnj *lh *pfqxsxd *clqk *rpmmv *szsbj *mnvq *cnghsg *jdtzr *kfsfn *jxjqp *knqzf *lvjpp *qdpbx *xxfgvz *ngqh *jvvmcq *zmcj *dsmc *xhmmt
["eggs"]: hlmvqh qrsczjv thvm zrgzf ckqq jmdg mrfxh *klmjmz *clqk *pjln *lvjpp *tbm *rqqfnlc *gzgvdh *klx *sfk *bnzq *mhrm *vht *pjqdmpm *tfmgl *cxzkmr *ghr *rxrgtvs *rfh *rhrc *vnfmc *ljhn *fbcds *rkzhxmh *htllnq *xhmmt *rcr *dgrrm *xlzqfb *xlnn *vpgvm *zntrfp *pgqxp *xjrpr *vnmfg *vqrjn *thcs *mnvq *rczbvg *bkd *zqsc *ngqh *rpmqq *zmcj *cbbkfx *rpcdfph *jfqqgtl *mszc *tzjnvp *sdccxkt *rcvd *pcf *xzcdnr *jgtrnm *zfcvnj *dsmc *gjqfj *gtgrcf *nthhxn *jngghk *hnmjfl *qspfqb *bxv
["dairy", "peanuts", "eggs"]: mrfxh zrgzf zmb jmdg thvm ckqq hlmvqh *nthhxn *htllnq *pbn *qsgb *dvcfx *mstc *jngghk *xddkbd *dpfphd *zhghprj *rfh *ljmvpp *vtljml *pmtfmv *xxfgvz *crnfzr *xbpb *tshn *nqfc *kmsh *rknm *hkqp *pjqdmpm *pjln *ddbmq *bjvcg *zntrfp *vnfmc *qszmzsh *fhtsl *tjsdp *kfsfn *jkbqk *mnvq *dnpgcd *xzcdnr *xjrpr *rbvdt *vht *jxjqp *zzldmh *cnghsg *pzxj *jfqqgtl *kqzcj *lxr *glrc *dgrrm *cxzkmr *clqk *xjdhk *vpvj *lbfgp *klmjmz
["dairy"]: zrgzf thvm mrfxh zmb hlmvqh jmdg ckqq *rqqfnlc *vgp *tbm *tjsdp *tshn *zzldmh *vgjbgj *pptgt *xnfhq *pbn *rpmmv *dnpgcd *qszmzsh *rbvdt *nzlks *xddkbd *npbnj *lxr *szsbj *dtlhh *ljmvpp *xjzc *pjqdmpm *rknm *rrbndl *xhmmt *pjln *pfqxsxd *jdtzr *jnr *jkbqk *vht *vhcnpg *ddgdhg *pzxj *ljhn *xgbvk *qfkjsq *zhghprj *gzgvdh *xzcdnr *ddbmq *rcvd *lbfgp *mvnqdh *rfh *nggcjr *gjqfj *hrfmdk
["soy", "shellfish"]: jmdg ckqq qrsczjv thvm mrfxh hlmvqh zrgzf *cmnb *cnghsg *cxzkmr *vfkpj *pgb *xddkbd *qfvfzg *gzgvdh *bxv *zfml *clqk *pbn *nthhxn *rvchbn *xbpb *sfk *dtlhh *rqqfnlc *rhrc *djpsmd *qrftr *gjqfj *bjvcg *zntrfp *zlgztsbd *lbfgp *vnmfg *jkbqk *lvjpp *pfqxsxd *ljmvpp *mnvq *ljhn *fkh *ddrd *qmmt *rcr *vht *xgbvk *ddbmq *tbm *vhcnpg *srgnx *ngqh *mhrm *pptgt *glrc *rpmmv *kx *htllnq
["nuts", "dairy", "sesame"]: ckqq jmdg zmb thvm mrfxh zrgzf qrsczjv *fdf *tshn *zhghprj *xjzc *xxfgvz *nggcjr *hkqp *vgjbgj *hnmjfl *mstc *dmxhhd *rpmmv *jdtzr *klx *ngqh *gtgrcf *bjvcg *vgp *jgtrnm *ttxx *bcvmz *pgqxp *nfnzx *sjgx *zfcvnj *tzjnvp *qmmt *qdpbx *rhrc *gmc *zfsks *ljmvpp *gjqfj *fjgxv *zttx *lbskg *vnfmc *vfkpj *lxr *hkxcb *dln *xbpb *sfk *vpgvm *ljhn *rknm *rfh *mgxzl *thcs *jfqqgtl *bkd *sdccxkt *zzldmh *rcvd *qchnn *xhmmt *rkzhxmh *xgbvk *csfmx *gzgvdh *ncqdr *rxr *vtljml *lbfgp *pzxj *djpsmd *dpfphd *rczbvg *knnmm *xmjlsn
["nuts", "sesame"]: qrsczjv jmdg hlmvqh mrfxh ckqq thvm zmb *klx *hkqp *lqmfgp *mstc *mgxzl *cxfzhj *xxfgvz *jxjqp *ljhn *pcf *mrxg *bjvcg *vht *lbskg *tphtz *nldzpc *tjsdp *mszc *sfk *dln *ghr *mppf *lbfgp *zkzdrn *qdpbx *bnzq *qsgb *rrbndl *nggcjr *zttx *qjsbk *llgsg *srgnx *dbx *stcsp *rcr *zfml *jvvmcq *pptgt *gmc *fkh *xjdhk *pzxj *zntrfp *flhfddq *knqzf *ddrd *jmgt *fdf *thcs *lh *xmjlsn *kglr *pjqdmpm *kx *dpfphd *vqrjn *vhcnpg *rxrgtvs *pfqxsxd *nqfc *cbbkfx *dtlhh *qmmt *xlzqfb *rpmmv *jfqqgtl *gsgmdn *bcvmz *mnvq *fbcds *xjzc *gtgrcf
["soy"]: hlmvqh zmb qrsczjv zrgzf thvm ckqq jmdg *gzgvdh *vbqbkt *fjgxv *nggcjr *jvvmcq *pptgt *fmvvb *zqsc *rbvdt *llgsg *xddkbd *rfh *pjln *tzjnvp *glrc *rqqfnlc *zttx *rrbndl *qfkjsq *mppf *rxrgtvs *lvjpp *dtlhh *zfml *stcsp *zkzdrn *vtljml *qdpbx *fstgc *xlnn *sdccxkt *hkxcb *kltcm *xlzqfb *jfqqgtl *npbnj *bcvmz *rknm *ngqh *xbpb *rcr *kglr *dbx *xxfgvz *bjvcg *rpmmv *srgnx *gjqfj *tshn *gmc *vgp *dgrrm *ljhn *knnmm *qkgqv *mstc *pnglkx *flhfddq *tjsdp *zntrfp *vgjbgj *bkd
["wheat", "dairy"]: ckqq jmdg zmb thvm hlmvqh zrgzf mrfxh *qjsbk *fkh *xddkbd *fjgxv *lbfgp *rxr *tphtz *vhcnpg *klmjmz *pmtfmv *hrfmdk *dbx *fbcds *jnr *xxfgvz *pfqxsxd *qfvfzg *bxv *flhfddq *rknm *rpmqq *pjln *sdccxkt *pgb *klx *jdtzr *lxr *nthhxn *vnmfg *jgtrnm *nfnzx *zzldmh *ddbmq *nldzpc *tvqbhv *dznd *dnpgcd *cmnb *vpvj *sjgx *xjzc *hkxcb *szsbj *dcbk *pmvl *pjqdmpm *mhrm *rgdx *jfqqgtl *zttx *vtljml *cbbkfx *knqzf *mszc *jkbqk *xbpb *vgjbgj *pptgt *vfkpj *vqrjn *zhghprj *xnfhq *tshn *rcvd *xjdhk *djpsmd *rfh *glrc *rkzhxmh
["peanuts", "soy"]: ckqq jmdg qrsczjv hlmvqh thvm zrgzf zmb *mvnqdh *nqfc *bjvcg *zfcvnj *ljhn *hkqp *srgnx *zfsks *bxv *xbpb *rkzhxmh *cxfzhj *rpmqq *zdntns *dnpgcd *thcs *lvjpp *klx *jngghk *flhfddq *gmc *pjln *dcbk *cbbkfx *vbqbkt *qchnn *tshn *fhtsl *qmthj *jvvmcq *ncqdr *jmgt *csfmx *tzjnvp *rczbvg *rcr *rbvdt *gtgrcf *cnghsg *rxrgtvs
["shellfish", "eggs", "dairy"]: ckqq zrgzf qrsczjv thvm jmdg mrfxh hlmvqh *frld *mvnqdh *tphtz *bjvcg *xzcdnr *djpsmd *ttxx *dcbk *qdpbx *tshn *rczbvg *vpvj *qmmt *ddrd *dln *bxv *jxjqp *lh *mgxzl *ltvr *pbn *nggcjr *dsmc *llgsg *knnmm *pzxj *cnghsg *vnmfg *mhrm *xlnn *gjqfj *pptgt *jkbqk *htllnq *xnfhq *klx *jmgt *rxr *hnmjfl *lqmfgp *qrftr *mppf *sjgx *rvchbn *lvjpp *mstc *zqsc *gmc *kmsh *rpmmv *crnfzr *hrfmdk *kglr *cxzkmr *dvcfx
["nuts", "shellfish"]: jmdg mrfxh thvm qrsczjv zmb ckqq zrgzf *xjrpr *mjpt *cbbkfx *rpmqq *ljhn *vht *sdccxkt *ngqh *bnzq *jgtrnm *fmvvb *xxfgvz *jfqqgtl *tfmgl *bcvmz *pgqxp *crnfzr *xddkbd *zfsks *pzxj *tshn *fbcds *lbfgp *thcs *hkqp *gsgmdn *dvcfx *cnghsg *csfmx *vhqfz *rxr *bxv *xjdhk *zhghprj *dtlhh *qmthj *jxjqp *rczbvg *gmc *sfk *ttxx *ltvr *pnglkx *dnpgcd *qsgb *clqk *klmjmz *lh *rvchbn *pjln *knqzf *vnfmc *qspfqb *nthhxn *zqsc *mhrm *gzgvdh *ncqdr *ddrd *vqrjn
["dairy"]: zrgzf qrsczjv ckqq thvm mrfxh hlmvqh jmdg *rvchbn *vhcnpg *mstc *hkqp *bnzq *xbpb *fhtsl *fjgxv *ddgdhg *jfqqgtl *rpmqq *dpfphd *pcf *qrftr *ngqh *vht *dvcfx *dfrg *tphtz *mnvq *qjsbk *mvnqdh *zntrfp *xjzc *jmgt *xzcdnr *vnfmc *xddkbd *fkh *kmsh *xmjlsn *zfsks *bcvmz *ljhn *gmc *rrbndl *fmvvb *cxzkmr *lh *zdntns *pgb *xxfgvz *hrfmdk *dln *tvqbhv *cnghsg *vpgvm *mjpt *jdtzr *dgrrm *kglr *pgqxp *kqzcj *hkxcb *xgbvk *djpsmd *tshn *klmjmz *rfh *xlnn *bjvcg *qfkjsq *rkzhxmh *glrc *clqk *gjqfj *knqzf *ljmvpp *csfmx *rbvdt *zfcvnj *dsmc *fstgc
["sesame", "shellfish"]: mrfxh zmb hlmvqh qrsczjv thvm zrgzf ckqq *nthhxn *vnfmc *dsmc *vpvj *rhrc *zfcvnj *zdntns *qmthj *knnmm *rpmmv *dtlhh *qdpbx *zhghprj *xddkbd *rqqfnlc *dpfphd *xhmmt *dgrrm *pgqxp *gmc *flhfddq *zkzdrn *vhcnpg *mjpt *fbcds *ncqdr *pjln *zttx *hrfmdk *xlnn *dvcfx *fkh *mszc *klx *cmnb *zfml *mnvq *rcr *bjvcg *csfmx *xlzqfb
["eggs"]: hlmvqh jmdg ckqq zrgzf mrfxh thvm qrsczjv *xnfhq *lh *qdpbx *rpcdfph *qsgb *rpmqq *tjsdp *ljhn *gsgmdn *vfkpj *xlzqfb *qmmt *jmgt *dvcfx *bkd *pmvl *ngqh *sjgx *dpfphd *kfsfn *bjvcg *jkbqk *qrftr *mjpt *vnmfg *nldzpc *ncqdr *jvvmcq *pptgt *pjqdmpm *pjln *ddrd *csfmx *kglr *xgbvk *tzjnvp *bxv *htllnq *fstgc *zfcvnj *jxjqp *pbn *dsmc *kbtx *vqrjn *rqqfnlc *rxrgtvs *hnmjfl
["shellfish", "dairy"]: zrgzf hlmvqh mrfxh thvm jmdg qrsczjv ckqq *mvnqdh *klx *rbvdt *kx *qmthj *hrfmdk *bcvmz *fhtsl *xxfgvz *pmvl *csfmx *hkxcb *rpmqq *vpvj *jmgt *vbqbkt *lxr *zhghprj *kglr *dpfphd *xzcdnr *mszc *vgp *dvcfx *gzgvdh *ncqdr *mppf *nldzpc *djpsmd *pnglkx *lqmfgp *sjgx *jfqqgtl *dln *vhcnpg *npbnj *cmnb *hnmjfl *kfsfn *vtljml *qspfqb *xlzqfb *dcbk *jngghk *lh *jxjqp *rxr *jdtzr *qrftr *fbcds *mrxg *zzldmh *qfvfzg *dtlhh *hkqp *dsmc *qdpbx *cxzkmr *tfmgl *xjrpr *pjqdmpm *rczbvg *rcvd *lbfgp *qszmzsh *glrc *qkgqv *tvqbhv *fkh *rknm *zntrfp *cbbkfx
["nuts"]: zmb thvm qrsczjv zrgzf ckqq jmdg hlmvqh *zqsc *sfk *lvjpp *ddgdhg *qspfqb *dmxhhd *zzldmh *xzcdnr *xjdhk *dznd *qfvfzg *ljhn *ghr *bcvmz *frld *pnglkx *fhtsl *srgnx *jfqqgtl *fdf *vhqfz *qsgb *jkbqk *xxfgvz *pjqdmpm *rpmqq *fkh *crnfzr *mjpt *cnghsg *qrftr *xddkbd *rkzhxmh *pfqxsxd *mhrm *gtgrcf *fmvvb *tvqbhv *dgrrm *xbpb *qmthj *gjqfj *kqzcj *tshn *qkgqv *vfkpj *kmsh *pgqxp *ddrd *glrc *xgbvk *hrfmdk *rgdx *bnzq *knnmm *qchnn *vnmfg *ncqdr *qfkjsq *pmtfmv *xnfhq *sjgx *cbbkfx *stcsp *rbvdt *mstc *gzgvdh *kglr *dsmc *rrbndl *xjzc *rpcdfph
["dairy", "wheat", "eggs"]: jmdg zmb hlmvqh qrsczjv thvm ckqq zrgzf *rbvdt *zkzdrn *hnmjfl *gmc *pgqxp *lqmfgp *knqzf *xbpb *fmvvb *bkd *dgrrm *vgjbgj *dcbk *ttxx *dtlhh *vpgvm *xlnn *jgtrnm *dpfphd *xzcdnr *jngghk *qmmt *flhfddq *gzgvdh *crnfzr *qszmzsh *xlzqfb *dfrg *qspfqb *qmthj *rpcdfph *frld *zqsc *xjdhk *dmxhhd *ljhn *qchnn *bnzq *kltcm *gtgrcf *mszc *zhghprj *rhrc *csfmx *mrxg *klmjmz *lbskg *pzxj *nggcjr *nthhxn *nldzpc *rpmqq *dbx *mhrm *xjzc
["sesame"]: jmdg zmb thvm qrsczjv mrfxh hlmvqh ckqq *lh *sfk *jvvmcq *szsbj *fmvvb *xxfgvz *sjgx *jnr *vqrjn *gmc *cnghsg *qsgb *mppf *jfqqgtl *fjgxv *vbqbkt *zqsc *xgbvk *pgqxp *nqfc *jmgt *rfh *xlnn *rhrc *nfnzx *rpcdfph *qszmzsh *kglr *xnfhq *tbm *zzldmh *rcvd *pmvl *kqzcj *hnmjfl *nggcjr *qchnn *zmcj *rvchbn *fdf *xmjlsn *mnvq *mgxzl *rkzhxmh *bxv *ngqh *xlzqfb *gjqfj *sdccxkt *clqk *cmnb *rbvdt *jkbqk *dpfphd *kltcm *jngghk *mszc
["dairy"]: thvm mrfxh zmb ckqq zrgzf hlmvqh qrsczjv *zfcvnj *mvnqdh *gjqfj *htllnq *nggcjr *vtljml *qrftr *fstgc *xjrpr *dvcfx *klmjmz *qjsbk *rcvd *hrfmdk *rczbvg *mjpt *ncqdr *kbtx *nqfc *xxfgvz *xlzqfb *jkbqk *jmgt *rxrgtvs *qspfqb *rhrc *qmthj *mszc *ghr *fmvvb *cxfzhj *lqmfgp *vfkpj *tzjnvp *mhrm *vpvj *pgqxp *ngqh *xlnn *xnfhq *tbm *zqsc *jvvmcq *rvchbn *lxr *vgp *cmnb *pjqdmpm
["wheat"]: mrfxh zrgzf jmdg thvm hlmvqh qrsczjv zmb *qfvfzg *ngqh *rhrc *nthhxn *mvnqdh *rcr *knnmm *zmcj *nfnzx *stcsp *nzlks *qdpbx *kfsfn *nldzpc *cxzkmr *fkh *vpvj *llgsg *pgb *cmnb *ncqdr *qchnn *rknm *xjzc *zntrfp *mstc *clqk *gsgmdn *jnr *ljhn *mppf *hkqp *xlnn *xgbvk *csfmx *rpmmv *fmvvb *mjpt *zlgztsbd *dtlhh *dln *bnzq *klmjmz *tfmgl *vgp *qmmt *kglr *dbx *gzgvdh *rcvd *kmsh *rgdx *kqzcj *ttxx *tzjnvp *qmthj *zfsks *lh *vhcnpg *pgqxp *zhghprj *vht *rxr *vbqbkt *pcf *gtgrcf *zzldmh *dvcfx
["dairy", "wheat", "peanuts"]: zrgzf mrfxh hlmvqh zmb ckqq thvm qrsczjv *vfkpj *kbtx *qkgqv *bkd *srgnx *rcr *zdntns *tjsdp *kfsfn *rhrc *mstc *vtljml *zlgztsbd *rbvdt *glrc *qfvfzg *rkzhxmh *ddbmq *pbn *flhfddq *dfrg *kglr *clqk *rxrgtvs *cxzkmr *ddgdhg *cmnb *rpmmv *dln *zttx *pjln *pjqdmpm *jmgt *qdpbx *rcvd *rrbndl *vbqbkt *xmjlsn *lh *xhmmt *qmthj *nzlks *pgb *xzcdnr *mrxg *xgbvk *fkh *vgp *rqqfnlc *gjqfj *gsgmdn *tbm *szsbj *bxv *lxr *cnghsg *jfqqgtl *dbx *pmtfmv *lvjpp *xjzc *xlnn *dtlhh *dsmc *vnfmc *zkzdrn *ghr *fhtsl
["dairy", "sesame"]: zmb jmdg hlmvqh thvm ckqq qrsczjv mrfxh *nldzpc *pbn *rxr *vgp *pgqxp *zfsks *vfkpj *tvqbhv *qmmt *pjln *qfkjsq *hnmjfl *mrxg *dln *nqfc *lbfgp *rcr *kfsfn *vtljml *rxrgtvs *tbm *dsmc *hkqp *lh *jngghk *vbqbkt *fbcds *clqk *pjqdmpm *mppf *tzjnvp *xhmmt *csfmx *rpcdfph *sdccxkt *kbtx *knqzf *rkzhxmh *mszc *ttxx *klx *mnvq
["wheat", "peanuts"]: ckqq hlmvqh zmb zrgzf mrfxh jmdg qrsczjv *rgdx *tfmgl *gmc *fstgc *ltvr *pnglkx *kglr *hkqp *ddgdhg *qfkjsq *xzcdnr *jnr *xxfgvz *zhghprj *ghr *pfqxsxd *ljmvpp *cmnb *nldzpc *dznd *xlnn *lh *zfcvnj *dcbk *kmsh *xjrpr *qjsbk *nzlks *gtgrcf *kfsfn *dpfphd *rqqfnlc *mppf *zzldmh *thcs *cbbkfx *jmgt *rcr *pjln *jxjqp *fmvvb *pmvl *mgxzl *knqzf *rbvdt *gzgvdh *nqfc *vnmfg *qszmzsh *tjsdp *ljhn *qrftr *ddbmq *bkd *fbcds
["peanuts"]: mrfxh zrgzf hlmvqh thvm zmb qrsczjv jmdg *clqk *rpmmv *rkzhxmh *pbn *pmvl *hkxcb *mvnqdh *kbtx *tzjnvp *ncqdr *kmsh *dcbk *qchnn *bkd *kqzcj *cmnb *mjpt *knnmm *pzxj *frld *gsgmdn *pfqxsxd *ltvr *lqmfgp *fkh *rbvdt *vgjbgj *nldzpc *jgtrnm *dbx *qrftr *zdntns *lbskg *rpcdfph *djpsmd *vbqbkt *dsmc *jdtzr *qmthj *hnmjfl *sfk *mppf *fmvvb *rcr *xmjlsn *csfmx *dln *vqrjn *xbpb *stcsp *fdf *rxrgtvs *mstc *ljhn *npbnj *thcs *ddbmq *knqzf *dgrrm *rqqfnlc *mszc *jnr *lbfgp *qsgb *dtlhh *pgb *bcvmz *qszmzsh *rfh *gjqfj *xlzqfb *rxr
["soy", "wheat", "eggs"]: thvm zrgzf jmdg zmb ckqq hlmvqh mrfxh *clqk *csfmx *lvjpp *kqzcj *zntrfp *dcbk *ghr *vtljml *pfqxsxd *pjqdmpm *jgtrnm *flhfddq *zzldmh *llgsg *nthhxn *mjpt *pjln *dznd *mnvq *bjvcg *nfnzx *tzjnvp *vgp *dtlhh *qmmt *rpmmv *zfcvnj *xzcdnr *tbm *dbx *bxv *cxzkmr *tfmgl *mszc *ttxx *qkgqv *qjsbk *pgqxp *zfml *mhrm *vpvj *jdtzr *mgxzl *tvqbhv *qfvfzg *vhcnpg *lbskg *lqmfgp *cnghsg *rcvd *hnmjfl *zhghprj *xjrpr *xxfgvz *dln *gtgrcf *sdccxkt *kx *qspfqb *jfqqgtl *pptgt *dmxhhd *rpcdfph *fstgc *rcr *fmvvb *ljmvpp *mrxg *gmc *pgb *kmsh *cmnb
["peanuts", "eggs", "nuts"]: hlmvqh qrsczjv ckqq zrgzf zmb jmdg mrfxh *klx *nggcjr *xjrpr *zdntns *kltcm *vhcnpg *xlnn *kqzcj *dnpgcd *vht *rpmmv *bnzq *hnmjfl *lbskg *fdf *bkd *dgrrm *rvchbn *mgxzl *pgb *jdtzr *dcbk *qszmzsh *rpmqq *hrfmdk *qrftr *dpfphd *lxr *ngqh *xddkbd *tbm *vqrjn *qchnn *vpvj *mstc *pbn *jxjqp *jgtrnm *tfmgl *rqqfnlc *xmjlsn *rxr *pmtfmv *zmcj *zfsks *zqsc *crnfzr *fbcds *xgbvk *hkxcb *gmc *nldzpc *nfnzx *xnfhq
["dairy", "sesame", "eggs"]: thvm zmb jmdg mrfxh zrgzf ckqq hlmvqh *csfmx *zzldmh *dcbk *fdf *rhrc *fjgxv *qchnn *cxzkmr *qmthj *crnfzr *nqfc *zmcj *mhrm *ltvr *sdccxkt *flhfddq *cbbkfx *cmnb *qdpbx *xmjlsn *fhtsl *knqzf *bxv *nggcjr *vnmfg *cxfzhj *jdtzr *pnglkx *lxr *kmsh *vgjbgj *dln *mppf *gzgvdh *rpmmv *zntrfp *pgqxp *zfml *vnfmc *vht *pmvl *xlzqfb *rxrgtvs *kltcm *pzxj *dsmc *dtlhh *hrfmdk *qmmt *dnpgcd *bjvcg *gsgmdn *cnghsg *xhmmt *gmc *ttxx *qjsbk *fkh *vhqfz *xxfgvz
["peanuts"]: ckqq jmdg mrfxh zmb hlmvqh thvm zrgzf *jmgt *mppf *ttxx *dsmc *xnfhq *bxv *kglr *bcvmz *dfrg *jnr *mnvq *ngqh *sfk *fdf *xhmmt *fjgxv *zfcvnj *rczbvg *cmnb *xjrpr *szsbj *dvcfx *gtgrcf *knqzf *pjln *lbfgp *vnmfg *jdtzr *mhrm *fstgc *tbm *djpsmd *pnglkx *qkgqv *vfkpj *hkxcb *qfkjsq *pgqxp *xzcdnr *nfnzx *npbnj *rbvdt *jfqqgtl *qfvfzg *jvvmcq *hnmjfl *rgdx *gjqfj *zhghprj *kqzcj *rcr *tvqbhv *tshn
["dairy", "sesame"]: qrsczjv zrgzf thvm ckqq hlmvqh mrfxh zmb *rknm *lvjpp *cnghsg *sdccxkt *rcvd *rxrgtvs *stcsp *fstgc *ttxx *pmvl *rpcdfph *dznd *pptgt *mstc *rpmmv *fdf *knnmm *jnr *bjvcg *mnvq *qdpbx *zfml *rqqfnlc *zqsc *zhghprj *mgxzl *qmmt *fkh *rxr *dsmc *lbskg *sfk *xhmmt *kqzcj *vfkpj *mhrm *pcf *jmgt *ljmvpp *jfqqgtl *szsbj *xjrpr *vnfmc *qszmzsh *dbx *mszc *xlnn *qrftr *qchnn *mjpt *zttx *ddgdhg *gmc *djpsmd *zfcvnj *dln *qkgqv *rcr *dnpgcd *tzjnvp *hkxcb *zmcj *lxr *bcvmz *fhtsl *vnmfg *vpgvm
["sesame", "dairy", "shellfish"]: jmdg thvm mrfxh zmb ckqq qrsczjv zrgzf *rgdx *cmnb *fstgc *pfqxsxd *ncqdr *dmxhhd *glrc *xjrpr *rkzhxmh *fhtsl *hkxcb *pmtfmv *zfsks *knnmm *pgb *vnmfg *thcs *dfrg *ddbmq *clqk *zntrfp *nthhxn *xjzc *dgrrm *lvjpp *rpmmv *vht *lh *jfqqgtl *vgp *mszc *rczbvg *jnr *jngghk *xhmmt *vhqfz *bcvmz *tjsdp *bkd *xlzqfb *xddkbd *pmvl *ddgdhg *djpsmd *ttxx *zfcvnj *mjpt *nldzpc *qrftr *kx *xnfhq *fjgxv *jmgt *ljhn *mrxg *pbn *sdccxkt *rxrgtvs *dln *dpfphd *tbm *rfh *tvqbhv
["eggs"]: zmb thvm jmdg hlmvqh mrfxh zrgzf ckqq *rczbvg *cxfzhj *lxr *mgxzl *hkxcb *kbtx *jvvmcq *pmtfmv *jfqqgtl *jxjqp *mszc *rknm *vfkpj *qmmt *ltvr *cnghsg *pjln *gzgvdh *szsbj *pgb *dcbk *lvjpp *qchnn *bcvmz *sdccxkt *llgsg *xgbvk *mrxg *ghr *zhghprj *hkqp *thcs *zzldmh *frld *gtgrcf *pnglkx *clqk *kglr *xhmmt *hnmjfl *qjsbk *qfvfzg *dnpgcd *dbx *djpsmd *qrftr *rgdx *tvqbhv *ncqdr
["shellfish"]: zmb zrgzf jmdg hlmvqh qrsczjv mrfxh ckqq *pmvl *rxrgtvs *mvnqdh *dznd *srgnx *qmmt *pgb *dgrrm *xjdhk *klx *rcvd *cnghsg *ttxx *hrfmdk *qspfqb *pfqxsxd *fmvvb *pzxj *sfk *rbvdt *nggcjr *zqsc *npbnj *kglr *xddkbd *lbskg *lqmfgp *mrxg *zfml *rkzhxmh *jfqqgtl *vgjbgj *rpmmv *tphtz *mszc *dln *zfcvnj *vpgvm *tzjnvp *rhrc *nldzpc *rknm *tshn *jgtrnm *mppf *fjgxv *ddgdhg *vpvj *fbcds
["nuts", "sesame"]: jmdg thvm mrfxh zmb ckqq zrgzf qrsczjv *xlzqfb *nthhxn *dln *rczbvg *vgp *cbbkfx *gsgmdn *jvvmcq *glrc *klmjmz *stcsp *bcvmz *dbx *vpvj *cmnb *sjgx *rfh *rrbndl *mgxzl *jnr *rhrc *xlnn *mhrm *bxv *qrftr *lvjpp *fjgxv *kglr *cxfzhj *pptgt *ghr *kbtx *pnglkx *qjsbk *jfqqgtl *fstgc *dznd *qszmzsh *jgtrnm *tjsdp *klx *pjln *vgjbgj *vbqbkt *zkzdrn *sfk *vhqfz *hrfmdk *kltcm *vnfmc *zqsc *xhmmt *knnmm *qfvfzg *xjrpr *nqfc *jkbqk
["shellfish", "peanuts"]: ckqq zmb thvm mrfxh hlmvqh zrgzf qrsczjv *jgtrnm *bxv *fbcds *dznd *bkd *ttxx *rpmqq *pmvl *dtlhh *xjdhk *zdntns *knnmm *vqrjn *dsmc *lqmfgp *ltvr *jfqqgtl *mszc *xhmmt *szsbj *crnfzr *fkh *rbvdt *pjqdmpm *nggcjr *qrftr *bcvmz *qmmt *srgnx *xddkbd *rvchbn *cmnb *pptgt *xjzc *llgsg *rxr *bnzq *gsgmdn *zzldmh *rcvd *dgrrm *zfsks *qsgb *tvqbhv *zkzdrn *nzlks *lh *klmjmz *rxrgtvs *kqzcj *mnvq *ngqh *rczbvg *tshn *tjsdp *pcf *fdf *rfh *pnglkx *hkqp *jkbqk *sdccxkt *fstgc *vpvj *ddbmq *zttx *xlzqfb *qfvfzg *frld *zlgztsbd *xnfhq *pfqxsxd *cxfzhj *cxzkmr *tphtz *clqk
["nuts"]: zrgzf thvm hlmvqh qrsczjv mrfxh ckqq jmdg *hrfmdk *nthhxn *lh *rbvdt *qdpbx *mhrm *vhqfz *lqmfgp *qjsbk *vgp *qfvfzg *szsbj *nldzpc *vpgvm *sdccxkt *dgrrm *tfmgl *zdntns *ddgdhg *zfsks *zmcj *pnglkx *ncqdr *sfk *rqqfnlc *vht *mstc *pmvl *cmnb *gmc *thcs *bjvcg *nzlks *klx *jfqqgtl *fkh *ghr *ddbmq *htllnq *xlnn *kglr
["eggs", "nuts", "dairy"]: mrfxh qrsczjv hlmvqh jmdg thvm zrgzf zmb *fkh *knqzf *tvqbhv *hkqp *nqfc *mvnqdh *xxfgvz *gzgvdh *vnfmc *qrftr *ngqh *cxzkmr *mjpt *dvcfx *zmcj *xddkbd *clqk *rvchbn *dsmc *xjzc *pfqxsxd *dfrg *qmmt *mhrm *flhfddq *rrbndl *xnfhq *dznd *frld *jnr *djpsmd *qjsbk *ddbmq *qchnn *pnglkx *dtlhh *zhghprj *fhtsl *vtljml *nzlks *qszmzsh *lqmfgp *pbn *cmnb *rpcdfph *kx *qkgqv *tshn *zlgztsbd *xlnn
["eggs"]: mrfxh zrgzf thvm qrsczjv jmdg zmb hlmvqh *gsgmdn *zqsc *cxzkmr *xlnn *htllnq *vbqbkt *pgb *pnglkx *tphtz *jmgt *qkgqv *pjqdmpm *glrc *sdccxkt *rbvdt *vht *pzxj *fstgc *bcvmz *mjpt *dvcfx *vpvj *ljmvpp *pfqxsxd *tshn *zmcj *qmmt *pcf *dpfphd *xxfgvz *jxjqp *rczbvg *mgxzl *fjgxv *hnmjfl *rkzhxmh *cnghsg *zfml *gjqfj *tbm *lh *mppf *dcbk *zntrfp *dbx *jvvmcq *szsbj *pjln *xhmmt *rcr *nthhxn *kx *fmvvb *xzcdnr *klx *rpcdfph *djpsmd *jdtzr *mnvq *bjvcg *mrxg
["peanuts", "eggs", "soy"]: thvm mrfxh zmb hlmvqh jmdg ckqq qrsczjv *vqrjn *rhrc *pzxj *pjqdmpm *tshn *pjln *nggcjr *ljhn *fkh *qchnn *kfsfn *vgjbgj *jmgt *qkgqv *stcsp *knnmm *dznd *pgb *csfmx *fmvvb *ltvr *rknm *rpcdfph *qfvfzg *zfcvnj *clqk *kx *ghr *rpmmv *vbqbkt *tfmgl *dfrg *lxr *hrfmdk *vpgvm *zlgztsbd *rczbvg *tvqbhv *jnr *qjsbk *qfkjsq *xxfgvz *klx *dnpgcd *kbtx *flhfddq *jfqqgtl *ddrd *xgbvk *rqqfnlc *bnzq *mnvq *ncqdr *dln *qdpbx *kltcm *mppf *zttx *dbx *pmtfmv *klmjmz *vnmfg *pgqxp *nthhxn *crnfzr *dmxhhd *xhmmt *rgdx *mvnqdh *gsgmdn *nzlks *xzcdnr *fbcds *djpsmd *zfsks *dpfphd *lh *ddbmq *vfkpj *vgp
["shellfish", "dairy", "nuts"]: hlmvqh zmb thvm ckqq qrsczjv mrfxh jmdg *dsmc *rqqfnlc *dgrrm *lbskg *xxfgvz *klmjmz *jmgt *jnr *dznd *npbnj *rrbndl *fkh *vfkpj *dvcfx *hnmjfl *qrftr *pmtfmv *kltcm *xzcdnr *gtgrcf *lbfgp *bcvmz *xddkbd *vgjbgj *gjqfj *kglr *qchnn *zlgztsbd *rcvd *xmjlsn *bnzq *kbtx *vnfmc *srgnx *pptgt *llgsg *cbbkfx *cnghsg *xjzc *rbvdt *mnvq *mppf *rknm *tzjnvp *rfh *vgp *vpvj *nfnzx *hkxcb *zqsc *lqmfgp *kmsh *dnpgcd *sjgx *sfk *gmc *jfqqgtl *ltvr *vpgvm *pmvl *qmthj *klx *tbm *rvchbn *pfqxsxd *xjdhk *glrc *rczbvg *knqzf
["peanuts", "shellfish"]: qrsczjv mrfxh ckqq zrgzf thvm zmb hlmvqh *ngqh *lxr *qrftr *nldzpc *cbbkfx *zdntns *xxfgvz *srgnx *qspfqb *zfsks *tzjnvp *tphtz *lbfgp *gjqfj *xjrpr *qfkjsq *rfh *xgbvk *dtlhh *xjdhk *qkgqv *hkqp *dsmc *rczbvg *klmjmz *xlzqfb *ddgdhg *kltcm *vhqfz *kglr *jxjqp *xddkbd *htllnq *gtgrcf *lbskg *gmc *szsbj *zfcvnj *pjqdmpm
["peanuts", "eggs", "dairy"]: jmdg ckqq qrsczjv zmb hlmvqh thvm zrgzf *xlzqfb *vpgvm *flhfddq *kbtx *zmcj *vhqfz *tphtz *vqrjn *stcsp *rgdx *nfnzx *nggcjr *xmjlsn *pgb *ngqh *pjqdmpm *qsgb *nldzpc *hkxcb *klmjmz *rpmmv *xjrpr *zlgztsbd *ncqdr *rpcdfph *qjsbk *gzgvdh *xnfhq *cbbkfx *knnmm *qfkjsq *xddkbd *vgp *pmtfmv *qdpbx *cnghsg *hrfmdk *fjgxv *xlnn *xjzc *mszc *ljmvpp *zntrfp *fdf *pcf *mnvq *bkd *fbcds *dbx *fstgc *dln *pfqxsxd *mhrm *pbn *zttx *zhghprj
["sesame"]: jmdg zmb qrsczjv hlmvqh zrgzf thvm mrfxh *nldzpc *gmc *mjpt *knqzf *rbvdt *zntrfp *nthhxn *rxr *xzcdnr *kx *ljmvpp *kltcm *jmgt *gjqfj *pgqxp *xjrpr *dbx *dmxhhd *pnglkx *gsgmdn *vhcnpg *xjzc *pjqdmpm *rpcdfph *lbfgp *xgbvk *jvvmcq *qdpbx *nqfc *dvcfx *rknm *kbtx *npbnj *mrxg *klmjmz *rrbndl *xbpb *ncqdr *fdf *vpvj *kglr *pptgt
["shellfish", "nuts"]: ckqq jmdg mrfxh zrgzf thvm zmb qrsczjv *tshn *dmxhhd *qmthj *kqzcj *rqqfnlc *pcf *dgrrm *hkqp *flhfddq *qmmt *thcs *vqrjn *vht *tbm *lqmfgp *bcvmz *fbcds *rbvdt *xzcdnr *xlzqfb *vfkpj *sdccxkt *fstgc *fhtsl *qfvfzg *kmsh *dznd *bxv *glrc *pmtfmv *rkzhxmh *zqsc *xjzc *fmvvb *ddbmq *qspfqb *tjsdp *rcvd *xgbvk *gzgvdh *cmnb *pptgt *ngqh *xlnn *sjgx *mrxg *qdpbx *rknm *hnmjfl *szsbj *zntrfp *gtgrcf *fdf *kltcm *vhcnpg *pjln *mppf *dnpgcd *ttxx *srgnx *qszmzsh
removing ("dairy", "thvm")
removing ("sesame", "zmb")
removing ("peanuts", "hlmvqh")
removing ("wheat", "zrgzf")
removing ("eggs", "jmdg")
removing ("soy", "ckqq")
removing ("nuts", "qrsczjv")
removing ("shellfish", "mrfxh")
Day 21 - Part 2: thvm,jmdg,qrsczjv,hlmvqh,zmb,mrfxh,ckqq,zrgzf
generator: 358.788µs,
runner: 1.783195ms
Day 22 - Part 1: 32033
generator: 120ns,
runner: 7.289µs
```

53
2020/input/2020/day22.txt Normal file
View File

@ -0,0 +1,53 @@
Player 1:
1
43
24
34
13
7
10
36
14
12
47
32
11
3
9
25
37
21
2
45
26
8
23
6
49
Player 2:
44
5
46
18
39
50
4
41
17
28
30
42
33
38
35
22
16
27
40
48
19
29
15
31
20

View File

@ -104,32 +104,11 @@ fn find_non_allergens(foods: &[Food]) -> HashSet<String> {
});
});
// "nhms": {
// "dairy": 1,
// "fish": 1,
// },
// "fvjkl": {
// "soy": 1,
// "dairy": 1,
// },
ingredient_map
.iter()
.filter(|(_, v)| !v.iter().any(|(a, c)| &allergen_map[a] == c))
.map(|(k, _)| k.to_string())
.collect()
/*
dbg!(&allergen_map);
dbg!(&ingredient_map);
let allergens: HashSet<String> = foods
.iter()
.map(|f| f.allergens.iter())
.flatten()
.cloned()
.collect();
HashSet::new()
*/
}
#[aoc(day21, part1)]
@ -162,14 +141,9 @@ fn allergen_ingredients(foods: &[Food], non_allergens: &HashSet<String>) -> Vec<
});
println!();
});
// TODO walk over allergen_only. Find the entries with a single max value, and that's the
// allergen/ingredient combo. Then remove that ingredient from all the other entries, and
// repeat until nothing is left.
dbg!(&allergen_only);
let mut answer = HashMap::new();
let mut limit = 0;
loop {
dbg!(&allergen_only);
if allergen_only.is_empty() {
return answer.into_iter().collect();
};
@ -204,7 +178,6 @@ fn solution2(foods: &[Food]) -> String {
let non_allergens = find_non_allergens(foods);
let mut allergens = allergen_ingredients(foods, &non_allergens);
allergens.sort_by(|l, r| l.0.cmp(&r.0));
dbg!(&allergens);
allergens
.iter()
.map(|(_, a)| a.as_str())

475
2020/src/day22.rs Normal file
View File

@ -0,0 +1,475 @@
//! --- Day 22: Crab Combat ---
//! It only takes a few hours of sailing the ocean on a raft for boredom to sink in. Fortunately, you brought a small deck of space cards! You'd like to play a game of Combat, and there's even an opponent available: a small crab that climbed aboard your raft before you left.
//!
//! Fortunately, it doesn't take long to teach the crab the rules.
//!
//! Before the game starts, split the cards so each player has their own deck (your puzzle input). Then, the game consists of a series of rounds: both players draw their top card, and the player with the higher-valued card wins the round. The winner keeps both cards, placing them on the bottom of their own deck so that the winner's card is above the other card. If this causes a player to have all of the cards, they win, and the game ends.
//!
//! For example, consider the following starting decks:
//!
//! Player 1:
//! 9
//! 2
//! 6
//! 3
//! 1
//!
//! Player 2:
//! 5
//! 8
//! 4
//! 7
//! 10
//! This arrangement means that player 1's deck contains 5 cards, with 9 on top and 1 on the bottom; player 2's deck also contains 5 cards, with 5 on top and 10 on the bottom.
//!
//! The first round begins with both players drawing the top card of their decks: 9 and 5. Player 1 has the higher card, so both cards move to the bottom of player 1's deck such that 9 is above 5. In total, it takes 29 rounds before a player has all of the cards:
//!
//! -- Round 1 --
//! Player 1's deck: 9, 2, 6, 3, 1
//! Player 2's deck: 5, 8, 4, 7, 10
//! Player 1 plays: 9
//! Player 2 plays: 5
//! Player 1 wins the round!
//!
//! -- Round 2 --
//! Player 1's deck: 2, 6, 3, 1, 9, 5
//! Player 2's deck: 8, 4, 7, 10
//! Player 1 plays: 2
//! Player 2 plays: 8
//! Player 2 wins the round!
//!
//! -- Round 3 --
//! Player 1's deck: 6, 3, 1, 9, 5
//! Player 2's deck: 4, 7, 10, 8, 2
//! Player 1 plays: 6
//! Player 2 plays: 4
//! Player 1 wins the round!
//!
//! -- Round 4 --
//! Player 1's deck: 3, 1, 9, 5, 6, 4
//! Player 2's deck: 7, 10, 8, 2
//! Player 1 plays: 3
//! Player 2 plays: 7
//! Player 2 wins the round!
//!
//! -- Round 5 --
//! Player 1's deck: 1, 9, 5, 6, 4
//! Player 2's deck: 10, 8, 2, 7, 3
//! Player 1 plays: 1
//! Player 2 plays: 10
//! Player 2 wins the round!
//!
//! ...several more rounds pass...
//!
//! -- Round 27 --
//! Player 1's deck: 5, 4, 1
//! Player 2's deck: 8, 9, 7, 3, 2, 10, 6
//! Player 1 plays: 5
//! Player 2 plays: 8
//! Player 2 wins the round!
//!
//! -- Round 28 --
//! Player 1's deck: 4, 1
//! Player 2's deck: 9, 7, 3, 2, 10, 6, 8, 5
//! Player 1 plays: 4
//! Player 2 plays: 9
//! Player 2 wins the round!
//!
//! -- Round 29 --
//! Player 1's deck: 1
//! Player 2's deck: 7, 3, 2, 10, 6, 8, 5, 9, 4
//! Player 1 plays: 1
//! Player 2 plays: 7
//! Player 2 wins the round!
//!
//!
//! == Post-game results ==
//! Player 1's deck:
//! Player 2's deck: 3, 2, 10, 6, 8, 5, 9, 4, 7, 1
//! Once the game ends, you can calculate the winning player's score. The bottom card in their deck is worth the value of the card multiplied by 1, the second-from-the-bottom card is worth the value of the card multiplied by 2, and so on. With 10 cards, the top card is worth the value on the card multiplied by 10. In this example, the winning player's score is:
//!
//! 3 * 10
//! + 2 * 9
//! + 10 * 8
//! + 6 * 7
//! + 8 * 6
//! + 5 * 5
//! + 9 * 4
//! + 4 * 3
//! + 7 * 2
//! + 1 * 1
//! = 306
//! So, once the game ends, the winning player's score is 306.
//!
//! Play the small crab in a game of Combat using the two decks you just dealt. What is the winning player's score?
//!
//! --- Part Two ---
//! You lost to the small crab! Fortunately, crabs aren't very good at recursion. To defend your honor as a Raft Captain, you challenge the small crab to a game of Recursive Combat.
//!
//! Recursive Combat still starts by splitting the cards into two decks (you offer to play with the same starting decks as before - it's only fair). Then, the game consists of a series of rounds with a few changes:
//!
//! Before either player deals a card, if there was a previous round in this game that had exactly the same cards in the same order in the same players' decks, the game instantly ends in a win for player 1. Previous rounds from other games are not considered. (This prevents infinite games of Recursive Combat, which everyone agrees is a bad idea.)
//! Otherwise, this round's cards must be in a new configuration; the players begin the round by each drawing the top card of their deck as normal.
//! If both players have at least as many cards remaining in their deck as the value of the card they just drew, the winner of the round is determined by playing a new game of Recursive Combat (see below).
//! Otherwise, at least one player must not have enough cards left in their deck to recurse; the winner of the round is the player with the higher-value card.
//! As in regular Combat, the winner of the round (even if they won the round by winning a sub-game) takes the two cards dealt at the beginning of the round and places them on the bottom of their own deck (again so that the winner's card is above the other card). Note that the winner's card might be the lower-valued of the two cards if they won the round due to winning a sub-game. If collecting cards by winning the round causes a player to have all of the cards, they win, and the game ends.
//!
//! Here is an example of a small game that would loop forever without the infinite game prevention rule:
//!
//! Player 1:
//! 43
//! 19
//!
//! Player 2:
//! 2
//! 29
//! 14
//! During a round of Recursive Combat, if both players have at least as many cards in their own decks as the number on the card they just dealt, the winner of the round is determined by recursing into a sub-game of Recursive Combat. (For example, if player 1 draws the 3 card, and player 2 draws the 7 card, this would occur if player 1 has at least 3 cards left and player 2 has at least 7 cards left, not counting the 3 and 7 cards that were drawn.)
//!
//! To play a sub-game of Recursive Combat, each player creates a new deck by making a copy of the next cards in their deck (the quantity of cards copied is equal to the number on the card they drew to trigger the sub-game). During this sub-game, the game that triggered it is on hold and completely unaffected; no cards are removed from players' decks to form the sub-game. (For example, if player 1 drew the 3 card, their deck in the sub-game would be copies of the next three cards in their deck.)
//!
//! Here is a complete example of gameplay, where Game 1 is the primary game of Recursive Combat:
//!
//! === Game 1 ===
//!
//! -- Round 1 (Game 1) --
//! Player 1's deck: 9, 2, 6, 3, 1
//! Player 2's deck: 5, 8, 4, 7, 10
//! Player 1 plays: 9
//! Player 2 plays: 5
//! Player 1 wins round 1 of game 1!
//!
//! -- Round 2 (Game 1) --
//! Player 1's deck: 2, 6, 3, 1, 9, 5
//! Player 2's deck: 8, 4, 7, 10
//! Player 1 plays: 2
//! Player 2 plays: 8
//! Player 2 wins round 2 of game 1!
//!
//! -- Round 3 (Game 1) --
//! Player 1's deck: 6, 3, 1, 9, 5
//! Player 2's deck: 4, 7, 10, 8, 2
//! Player 1 plays: 6
//! Player 2 plays: 4
//! Player 1 wins round 3 of game 1!
//!
//! -- Round 4 (Game 1) --
//! Player 1's deck: 3, 1, 9, 5, 6, 4
//! Player 2's deck: 7, 10, 8, 2
//! Player 1 plays: 3
//! Player 2 plays: 7
//! Player 2 wins round 4 of game 1!
//!
//! -- Round 5 (Game 1) --
//! Player 1's deck: 1, 9, 5, 6, 4
//! Player 2's deck: 10, 8, 2, 7, 3
//! Player 1 plays: 1
//! Player 2 plays: 10
//! Player 2 wins round 5 of game 1!
//!
//! -- Round 6 (Game 1) --
//! Player 1's deck: 9, 5, 6, 4
//! Player 2's deck: 8, 2, 7, 3, 10, 1
//! Player 1 plays: 9
//! Player 2 plays: 8
//! Player 1 wins round 6 of game 1!
//!
//! -- Round 7 (Game 1) --
//! Player 1's deck: 5, 6, 4, 9, 8
//! Player 2's deck: 2, 7, 3, 10, 1
//! Player 1 plays: 5
//! Player 2 plays: 2
//! Player 1 wins round 7 of game 1!
//!
//! -- Round 8 (Game 1) --
//! Player 1's deck: 6, 4, 9, 8, 5, 2
//! Player 2's deck: 7, 3, 10, 1
//! Player 1 plays: 6
//! Player 2 plays: 7
//! Player 2 wins round 8 of game 1!
//!
//! -- Round 9 (Game 1) --
//! Player 1's deck: 4, 9, 8, 5, 2
//! Player 2's deck: 3, 10, 1, 7, 6
//! Player 1 plays: 4
//! Player 2 plays: 3
//! Playing a sub-game to determine the winner...
//!
//! === Game 2 ===
//!
//! -- Round 1 (Game 2) --
//! Player 1's deck: 9, 8, 5, 2
//! Player 2's deck: 10, 1, 7
//! Player 1 plays: 9
//! Player 2 plays: 10
//! Player 2 wins round 1 of game 2!
//!
//! -- Round 2 (Game 2) --
//! Player 1's deck: 8, 5, 2
//! Player 2's deck: 1, 7, 10, 9
//! Player 1 plays: 8
//! Player 2 plays: 1
//! Player 1 wins round 2 of game 2!
//!
//! -- Round 3 (Game 2) --
//! Player 1's deck: 5, 2, 8, 1
//! Player 2's deck: 7, 10, 9
//! Player 1 plays: 5
//! Player 2 plays: 7
//! Player 2 wins round 3 of game 2!
//!
//! -- Round 4 (Game 2) --
//! Player 1's deck: 2, 8, 1
//! Player 2's deck: 10, 9, 7, 5
//! Player 1 plays: 2
//! Player 2 plays: 10
//! Player 2 wins round 4 of game 2!
//!
//! -- Round 5 (Game 2) --
//! Player 1's deck: 8, 1
//! Player 2's deck: 9, 7, 5, 10, 2
//! Player 1 plays: 8
//! Player 2 plays: 9
//! Player 2 wins round 5 of game 2!
//!
//! -- Round 6 (Game 2) --
//! Player 1's deck: 1
//! Player 2's deck: 7, 5, 10, 2, 9, 8
//! Player 1 plays: 1
//! Player 2 plays: 7
//! Player 2 wins round 6 of game 2!
//! The winner of game 2 is player 2!
//!
//! ...anyway, back to game 1.
//! Player 2 wins round 9 of game 1!
//!
//! -- Round 10 (Game 1) --
//! Player 1's deck: 9, 8, 5, 2
//! Player 2's deck: 10, 1, 7, 6, 3, 4
//! Player 1 plays: 9
//! Player 2 plays: 10
//! Player 2 wins round 10 of game 1!
//!
//! -- Round 11 (Game 1) --
//! Player 1's deck: 8, 5, 2
//! Player 2's deck: 1, 7, 6, 3, 4, 10, 9
//! Player 1 plays: 8
//! Player 2 plays: 1
//! Player 1 wins round 11 of game 1!
//!
//! -- Round 12 (Game 1) --
//! Player 1's deck: 5, 2, 8, 1
//! Player 2's deck: 7, 6, 3, 4, 10, 9
//! Player 1 plays: 5
//! Player 2 plays: 7
//! Player 2 wins round 12 of game 1!
//!
//! -- Round 13 (Game 1) --
//! Player 1's deck: 2, 8, 1
//! Player 2's deck: 6, 3, 4, 10, 9, 7, 5
//! Player 1 plays: 2
//! Player 2 plays: 6
//! Playing a sub-game to determine the winner...
//!
//! === Game 3 ===
//!
//! -- Round 1 (Game 3) --
//! Player 1's deck: 8, 1
//! Player 2's deck: 3, 4, 10, 9, 7, 5
//! Player 1 plays: 8
//! Player 2 plays: 3
//! Player 1 wins round 1 of game 3!
//!
//! -- Round 2 (Game 3) --
//! Player 1's deck: 1, 8, 3
//! Player 2's deck: 4, 10, 9, 7, 5
//! Player 1 plays: 1
//! Player 2 plays: 4
//! Playing a sub-game to determine the winner...
//!
//! === Game 4 ===
//!
//! -- Round 1 (Game 4) --
//! Player 1's deck: 8
//! Player 2's deck: 10, 9, 7, 5
//! Player 1 plays: 8
//! Player 2 plays: 10
//! Player 2 wins round 1 of game 4!
//! The winner of game 4 is player 2!
//!
//! ...anyway, back to game 3.
//! Player 2 wins round 2 of game 3!
//!
//! -- Round 3 (Game 3) --
//! Player 1's deck: 8, 3
//! Player 2's deck: 10, 9, 7, 5, 4, 1
//! Player 1 plays: 8
//! Player 2 plays: 10
//! Player 2 wins round 3 of game 3!
//!
//! -- Round 4 (Game 3) --
//! Player 1's deck: 3
//! Player 2's deck: 9, 7, 5, 4, 1, 10, 8
//! Player 1 plays: 3
//! Player 2 plays: 9
//! Player 2 wins round 4 of game 3!
//! The winner of game 3 is player 2!
//!
//! ...anyway, back to game 1.
//! Player 2 wins round 13 of game 1!
//!
//! -- Round 14 (Game 1) --
//! Player 1's deck: 8, 1
//! Player 2's deck: 3, 4, 10, 9, 7, 5, 6, 2
//! Player 1 plays: 8
//! Player 2 plays: 3
//! Player 1 wins round 14 of game 1!
//!
//! -- Round 15 (Game 1) --
//! Player 1's deck: 1, 8, 3
//! Player 2's deck: 4, 10, 9, 7, 5, 6, 2
//! Player 1 plays: 1
//! Player 2 plays: 4
//! Playing a sub-game to determine the winner...
//!
//! === Game 5 ===
//!
//! -- Round 1 (Game 5) --
//! Player 1's deck: 8
//! Player 2's deck: 10, 9, 7, 5
//! Player 1 plays: 8
//! Player 2 plays: 10
//! Player 2 wins round 1 of game 5!
//! The winner of game 5 is player 2!
//!
//! ...anyway, back to game 1.
//! Player 2 wins round 15 of game 1!
//!
//! -- Round 16 (Game 1) --
//! Player 1's deck: 8, 3
//! Player 2's deck: 10, 9, 7, 5, 6, 2, 4, 1
//! Player 1 plays: 8
//! Player 2 plays: 10
//! Player 2 wins round 16 of game 1!
//!
//! -- Round 17 (Game 1) --
//! Player 1's deck: 3
//! Player 2's deck: 9, 7, 5, 6, 2, 4, 1, 10, 8
//! Player 1 plays: 3
//! Player 2 plays: 9
//! Player 2 wins round 17 of game 1!
//! The winner of game 1 is player 2!
//!
//!
//! == Post-game results ==
//! Player 1's deck:
//! Player 2's deck: 7, 5, 6, 2, 4, 1, 10, 8, 9, 3
//! After the game, the winning player's score is calculated from the cards they have in their original deck using the same rules as regular Combat. In the above game, the winning player's score is 291.
//!
//! Defend your honor as Raft Captain by playing the small crab in a game of Recursive Combat using the same two decks as before. What is the winning player's score?
use std::collections::VecDeque;
use aoc_runner_derive::aoc;
#[derive(Debug, PartialEq)]
struct Players {
p1: VecDeque<usize>,
p2: VecDeque<usize>,
}
fn generator(input: &str) -> Players {
let players: Vec<_> = input.split("\n\n").collect();
Players {
p1: players[0]
.split('\n')
.skip(1)
.map(|s| s.parse().expect("couldn't parse p1 number"))
.collect::<VecDeque<usize>>(),
p2: players[1]
.split('\n')
.skip(1)
.map(|s| s.parse().expect("couldn't parse p2 number"))
.collect::<VecDeque<usize>>(),
}
}
impl Players {
fn play(&mut self) {
//let mut round = 0;
while !self.p1.is_empty() && !self.p2.is_empty() {
let p1 = self.p1.pop_front().unwrap();
let p2 = self.p2.pop_front().unwrap();
//round += 1;
//println!("-- Round {} --", round);
//println!("Player 1's deck: {:?}", self.p1);
//println!("Player 2's deck: {:?}", self.p2);
//println!("Player 1 plays: {}", p1);
//println!("Player 2 plays: {}", p2);
if p1 > p2 {
//println!("Play 1 wins the round!");
self.p1.push_back(p1);
self.p1.push_back(p2);
} else {
//println!("Play 2 wins the round!");
self.p2.push_back(p2);
self.p2.push_back(p1);
}
//println!();
}
}
fn winning_score(&self) -> usize {
let winner = if self.p1.len() > self.p2.len() {
&self.p1
} else {
&self.p2
};
winner
.iter()
.rev()
.enumerate()
.map(|(i, n)| (i + 1) * *n)
.sum()
}
}
#[aoc(day22, part1)]
fn solution1(input: &str) -> usize {
let mut players = generator(input);
players.play();
players.winning_score()
}
#[cfg(test)]
mod tests {
use super::*;
const INPUT: &'static str = r#"Player 1:
9
2
6
3
1
Player 2:
5
8
4
7
10"#;
#[test]
fn test_generator() {
assert_eq!(
generator(INPUT),
Players {
p1: vec![9, 2, 6, 3, 1].into(),
p2: vec![5, 8, 4, 7, 10].into(),
}
);
}
#[test]
fn test_solution1() {
assert_eq!(solution1(INPUT), 306);
}
}

View File

@ -12,6 +12,7 @@ pub mod day19;
pub mod day2;
//pub mod day20;
pub mod day21;
pub mod day22;
pub mod day3;
pub mod day4;
pub mod day5;