From 4589a7c591f55f52f5cf38689102e4a44d308ce0 Mon Sep 17 00:00:00 2001 From: Ruediger Ludwig Date: Wed, 7 Dec 2022 07:36:08 +0100 Subject: [PATCH] day07 finished --- README.md | 3 +- advent/days/day07/__init__.py | 0 advent/days/day07/data/input.txt | 1135 ++++++++++++++++++++++++++++ advent/days/day07/data/test01.txt | 23 + advent/days/day07/solution.py | 110 +++ advent/days/day07/test_solution.py | 41 + 6 files changed, 1311 insertions(+), 1 deletion(-) create mode 100644 advent/days/day07/__init__.py create mode 100644 advent/days/day07/data/input.txt create mode 100644 advent/days/day07/data/test01.txt create mode 100644 advent/days/day07/solution.py create mode 100644 advent/days/day07/test_solution.py diff --git a/README.md b/README.md index 5eef36e..3a6cffb 100644 --- a/README.md +++ b/README.md @@ -2,12 +2,13 @@ Here are my solutions for [Advent of Code 2022](https://adventofcode.com/2022). Thanks to [Eric Wastl](http://was.tl) for the great puzzles and the great time I have solving them. -My goal is to solve each puzzle on the day it was posted. Also I want to create code that is correct (of course), but some I would also understand in about a year. So a readable solution is preferable to one that is only correct. This is why I use TDD, classes and comments where they technically might not be necessary. +My goal is to solve each puzzle on the day it was posted. Also I want to create code that is correct (of course), but which I still understand in about a year. So a readable solution is preferable to one that is only correct. This is why I use TDD, classes and comments where they technically might not be necessary. I often refine my solution after I handed it in. I use python 3.11 without any libraries beyond the standard. | Day | Time | Rank | Score | Time | Rank | Score | | --- | --------- | ----- | ----- | -------- | ----- | ----- | +| 7 | 00:34:59 | 2683 | 0 | 00:45:45 | 2943 | 0 | | 6 | 00:14:52 | 9153 | 0 | 00:17:06 | 8413 | 0 | | 5 | 01:01:27 | 11570 | 0 | 01:05:20 | 10701 | 0 | | 4 | 00:12:09 | 5789 | 0 | 00:16:03 | 5187 | 0 | diff --git a/advent/days/day07/__init__.py b/advent/days/day07/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/advent/days/day07/data/input.txt b/advent/days/day07/data/input.txt new file mode 100644 index 0000000..cf8a6c4 --- /dev/null +++ b/advent/days/day07/data/input.txt @@ -0,0 +1,1135 @@ +$ cd / +$ ls +233998 glh.fcb +184686 jzn +dir qcznqph +dir qtbprrq +299692 rbssdzm.ccn +dir vtb +$ cd qcznqph +$ ls +32148 lhsrj.fnr +dir lnj +dir mtr +dir mznnlph +dir pdtpt +24836 rsjcg.lrh +dir vrj +dir wrqcfl +$ cd lnj +$ ls +12592 tlh +$ cd .. +$ cd mtr +$ ls +118870 twdhlmp.gbw +$ cd .. +$ cd mznnlph +$ ls +240977 fmmhnhtf +dir gbhcnts +dir gsbjrrd +dir pmwcs +dir qtbprrq +286007 rhnjndsq.gst +dir twdhlmp +283716 twdhlmp.rpr +$ cd gbhcnts +$ ls +dir fctrnwb +dir gbhcnts +46017 gft.hvm +234925 gjsnzbtw.ncd +dir nvnwh +dir srslsjp +dir swtlfsv +66115 tgpmsb +64086 tqnvb +308270 tqwfpnbn.btp +$ cd fctrnwb +$ ls +112643 qhcdd +$ cd .. +$ cd gbhcnts +$ ls +26196 cmttgsmm.bdn +317410 fthqln +dir lwshph +32809 tdmfc +dir tqcllnv +dir twdhlmp +$ cd lwshph +$ ls +214023 ctqvrzs.jvr +104432 gbch +dir gpqgrw +105909 qshbtd.nml +dir rhhsfbdd +dir svvqh +161439 tqnvb +60152 twdhlmp.qzw +$ cd gpqgrw +$ ls +dir mbsgrlld +dir nhb +dir qtbprrq +$ cd mbsgrlld +$ ls +13247 tsztmlfg +dir twdhlmp +$ cd twdhlmp +$ ls +236804 mcrd +$ cd .. +$ cd .. +$ cd nhb +$ ls +86570 gtvnbsv.zbr +$ cd .. +$ cd qtbprrq +$ ls +111178 npg.qph +110775 tlh +$ cd .. +$ cd .. +$ cd rhhsfbdd +$ ls +37729 fmmhnhtf +263415 ljvwzj.btm +$ cd .. +$ cd svvqh +$ ls +185682 wlcl.fhs +$ cd .. +$ cd .. +$ cd tqcllnv +$ ls +dir cbdj +dir ccsfm +55264 tqnvb +267792 wlcl.fhs +$ cd cbdj +$ ls +128247 fmmhnhtf +dir mtnbs +240520 ngmw.clj +30569 qbqltr.lbw +188801 zwdpp +$ cd mtnbs +$ ls +dir bsfbrmh +dir ftmnrwm +$ cd bsfbrmh +$ ls +dir tltvzp +$ cd tltvzp +$ ls +312469 dnst.sbm +$ cd .. +$ cd .. +$ cd ftmnrwm +$ ls +278974 nlztftc.zhb +$ cd .. +$ cd .. +$ cd .. +$ cd ccsfm +$ ls +4017 wlcl.fhs +$ cd .. +$ cd .. +$ cd twdhlmp +$ ls +dir qtbprrq +$ cd qtbprrq +$ ls +dir tdpz +$ cd tdpz +$ ls +210400 fmmhnhtf +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd nvnwh +$ ls +dir jlpbbds +dir pphv +285452 qtbprrq +$ cd jlpbbds +$ ls +7058 vmrcqz +$ cd .. +$ cd pphv +$ ls +290310 msz.swz +$ cd .. +$ cd .. +$ cd srslsjp +$ ls +dir nnz +192902 twdhlmp.vgp +$ cd nnz +$ ls +215711 tlh +$ cd .. +$ cd .. +$ cd swtlfsv +$ ls +274236 frwncp.gff +$ cd .. +$ cd .. +$ cd gsbjrrd +$ ls +dir dnst +dir gbhcnts +61000 gqdf +175813 jvz +dir ldqjzrtp +$ cd dnst +$ ls +124352 dnst +220618 mzsqzbfz.qfd +134211 qmrvh +dir qqlm +dir qtbprrq +223840 tlh +dir twdhlmp +24794 wfb.rtf +$ cd qqlm +$ ls +113976 wlcl.fhs +$ cd .. +$ cd qtbprrq +$ ls +212775 qtbprrq.ngs +$ cd .. +$ cd twdhlmp +$ ls +308083 fzhd +63311 wlcl.fhs +$ cd .. +$ cd .. +$ cd gbhcnts +$ ls +dir dlvhzdbg +$ cd dlvhzdbg +$ ls +305798 twdhlmp +$ cd .. +$ cd .. +$ cd ldqjzrtp +$ ls +93085 dcvfpz.bjl +264488 zssvm.wdp +$ cd .. +$ cd .. +$ cd pmwcs +$ ls +125444 qtbprrq.tgl +$ cd .. +$ cd qtbprrq +$ ls +dir bjnctfv +133127 fmmhnhtf +dir gztmrrff +dir qtbprrq +$ cd bjnctfv +$ ls +dir cpwrcf +dir fdjzsfc +1223 gbhcnts.qvf +272526 gbhcnts.sgs +dir qnsdl +dir snq +dir tmjnvcbl +dir vdjqsbr +271339 wslnqh.rgr +134589 zzqrbr.fcz +$ cd cpwrcf +$ ls +143124 pdr +$ cd .. +$ cd fdjzsfc +$ ls +dir gbhcnts +dir nqpbzvpq +$ cd gbhcnts +$ ls +151265 jrdvt.fcg +11872 tlh +$ cd .. +$ cd nqpbzvpq +$ ls +dir hpwhslq +27858 ljvwzj.prq +dir nzcnb +$ cd hpwhslq +$ ls +136646 bqgj.wvw +252823 ngmw.clj +137072 tqnvb +$ cd .. +$ cd nzcnb +$ ls +99882 twdhlmp.grg +$ cd .. +$ cd .. +$ cd .. +$ cd qnsdl +$ ls +8925 fmmhnhtf +dir mnzqwfnh +206990 vqgrhqgc +$ cd mnzqwfnh +$ ls +271442 bmztfjlc.lzr +$ cd .. +$ cd .. +$ cd snq +$ ls +25995 tqnvb +$ cd .. +$ cd tmjnvcbl +$ ls +dir gclzbvt +$ cd gclzbvt +$ ls +dir jtfddbs +$ cd jtfddbs +$ ls +10564 pdf.tsj +32415 tlh +$ cd .. +$ cd .. +$ cd .. +$ cd vdjqsbr +$ ls +256668 cwbd +265036 fmmhnhtf +$ cd .. +$ cd .. +$ cd gztmrrff +$ ls +52260 bdqcl.bdw +dir lsss +120102 tlh +$ cd lsss +$ ls +13729 wlcl.fhs +$ cd .. +$ cd .. +$ cd qtbprrq +$ ls +dir bttpq +dir lcvgwpt +$ cd bttpq +$ ls +216247 nnlv.dgl +138688 wlcl.fhs +$ cd .. +$ cd lcvgwpt +$ ls +dir dth +198570 tsqgm.zht +dir zbcstsb +$ cd dth +$ ls +dir cqmbtj +120437 hdqp.vhq +dir vpzn +$ cd cqmbtj +$ ls +11882 sdngnzb +$ cd .. +$ cd vpzn +$ ls +dir jqbz +271714 plcq.bfg +$ cd jqbz +$ ls +dir qqhnfglj +136307 stncbrm +177843 tlh +168253 tqnvb +297085 wcn +$ cd qqhnfglj +$ ls +197471 twdhlmp +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd zbcstsb +$ ls +298115 bvljmpc.gss +308872 ljr.lzl +201657 ngmw.clj +170617 ppln +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd twdhlmp +$ ls +dir dbb +277215 ngmw.clj +310263 twdhlmp.wvs +dir vsfrqsnl +$ cd dbb +$ ls +258300 tqnvb +$ cd .. +$ cd vsfrqsnl +$ ls +dir gbhcnts +12285 tlh +$ cd gbhcnts +$ ls +248251 dnst.bcs +91471 gbhcnts.ntr +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd pdtpt +$ ls +164477 flcgj.zwr +dir ljvwzj +51483 ljvwzj.htl +dir pbtr +dir qtbprrq +dir rrhcsn +$ cd ljvwzj +$ ls +dir nsq +133318 qtbprrq.gqq +166365 rnfbl.ljh +130617 tlh +16112 vbw +$ cd nsq +$ ls +dir fwfcmfbz +$ cd fwfcmfbz +$ ls +71451 zcc.ngn +$ cd .. +$ cd .. +$ cd .. +$ cd pbtr +$ ls +dir qtbprrq +$ cd qtbprrq +$ ls +117780 gjqbnrv.sdl +$ cd .. +$ cd .. +$ cd qtbprrq +$ ls +269746 dld +dir fcmbv +42544 mlzvd.vcw +165396 nbtlfm.vzq +dir sbtl +dir twdhlmp +$ cd fcmbv +$ ls +202047 wdzcrg.mcg +$ cd .. +$ cd sbtl +$ ls +dir dbcdf +dir fbz +dir lvz +dir ncnwbsdh +dir rft +23523 zphlfqf.phv +$ cd dbcdf +$ ls +dir dhdw +dir dvtjfhvm +182513 lclmdwr +63921 ngmw.clj +dir qqmddq +318020 tlh +dir twdwfj +83108 vmwlfdlf +121901 wlcl.fhs +$ cd dhdw +$ ls +dir qtbprrq +dir twdhlmp +dir wbllhmd +$ cd qtbprrq +$ ls +111984 fhc.tzm +$ cd .. +$ cd twdhlmp +$ ls +277414 fwfqbb.dpj +$ cd .. +$ cd wbllhmd +$ ls +dir dnst +dir jqz +dir lbdclnfb +dir ljvwzj +dir mzfdg +96340 ngmw.clj +dir twdhlmp +dir wmcfzznt +147877 zwgvvd +$ cd dnst +$ ls +310179 fmmhnhtf +243908 twdhlmp +$ cd .. +$ cd jqz +$ ls +94739 twdhlmp +$ cd .. +$ cd lbdclnfb +$ ls +112509 ljvwzj +$ cd .. +$ cd ljvwzj +$ ls +28274 bshlmj.lzc +84072 tlh +283462 twdhlmp.ccd +$ cd .. +$ cd mzfdg +$ ls +282099 hbbrjc.jff +63535 tlh +$ cd .. +$ cd twdhlmp +$ ls +283817 jltvl.tgl +$ cd .. +$ cd wmcfzznt +$ ls +294565 fmmhnhtf +$ cd .. +$ cd .. +$ cd .. +$ cd dvtjfhvm +$ ls +292813 qgmvm.fsg +$ cd .. +$ cd qqmddq +$ ls +11670 dnst.btd +241275 fmmhnhtf +196615 fpnmptm +dir nnzscbvw +dir qnrr +$ cd nnzscbvw +$ ls +250962 dflhdfz +$ cd .. +$ cd qnrr +$ ls +dir trzj +$ cd trzj +$ ls +36993 gbhcnts.rdh +273052 tlh +$ cd .. +$ cd .. +$ cd .. +$ cd twdwfj +$ ls +162470 hfdhmbcq.hwz +dir qtbprrq +dir scjzbdsz +2609 wlcl.fhs +$ cd qtbprrq +$ ls +dir cfmglhwj +103703 cscftrsr.jbs +71160 dnst.rbw +dir nrmp +311716 qtbprrq +$ cd cfmglhwj +$ ls +dir fmcmjfg +$ cd fmcmjfg +$ ls +82998 ljvwzj.qbd +8407 nhmmwwzl +dir qtbprrq +261949 tlh +$ cd qtbprrq +$ ls +314421 hwqtl +92593 zcdvf +$ cd .. +$ cd .. +$ cd .. +$ cd nrmp +$ ls +94387 fmmhnhtf +$ cd .. +$ cd .. +$ cd scjzbdsz +$ ls +6861 dgzhldd.dhs +dir gbhcnts +dir qtbprrq +dir sfdl +$ cd gbhcnts +$ ls +dir qdsrs +$ cd qdsrs +$ ls +25165 ngmw.clj +$ cd .. +$ cd .. +$ cd qtbprrq +$ ls +151403 tswd.hpf +$ cd .. +$ cd sfdl +$ ls +308622 jcmsnj +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd fbz +$ ls +dir dgjf +dir qtbprrq +$ cd dgjf +$ ls +254198 rvf.hfq +$ cd .. +$ cd qtbprrq +$ ls +dir frlj +231222 njjfqgt.bph +dir rjsw +dir vjhzc +$ cd frlj +$ ls +dir ljvwzj +$ cd ljvwzj +$ ls +57572 ljvwzj.bvh +$ cd .. +$ cd .. +$ cd rjsw +$ ls +131875 lbcq.rlc +272908 mnfs +$ cd .. +$ cd vjhzc +$ ls +279363 fmmhnhtf +238051 zdzbb.rfj +$ cd .. +$ cd .. +$ cd .. +$ cd lvz +$ ls +289192 tqnvb +dir twdhlmp +$ cd twdhlmp +$ ls +dir wqtgwzdn +$ cd wqtgwzdn +$ ls +283475 ghvpfl +$ cd .. +$ cd .. +$ cd .. +$ cd ncnwbsdh +$ ls +dir dfrdwfgm +dir ljvwzj +dir vgh +$ cd dfrdwfgm +$ ls +279286 mrbwmws.nzd +197337 nqgq.fhf +248096 tqs.jfb +35181 wlcl.fhs +$ cd .. +$ cd ljvwzj +$ ls +250455 gmph.scm +147449 ljvwzj +100189 qfr +$ cd .. +$ cd vgh +$ ls +244540 bzwrldnz.ldt +235508 dzm +dir gbhcnts +dir qtv +dir tvtwlt +262356 wlcl.fhs +$ cd gbhcnts +$ ls +160689 srvpbf.szt +191895 tqnvb +$ cd .. +$ cd qtv +$ ls +9491 dnst.szf +268602 ngmw.clj +dir pbcrfzz +39049 rzgqqvlt.nsm +dir tfpl +79589 wwcrv.ncv +$ cd pbcrfzz +$ ls +dir stt +256685 wlcl.fhs +$ cd stt +$ ls +12650 jbdfwj +$ cd .. +$ cd .. +$ cd tfpl +$ ls +92079 dfhj +$ cd .. +$ cd .. +$ cd tvtwlt +$ ls +dir cqv +$ cd cqv +$ ls +dir vdv +$ cd vdv +$ ls +119483 fmmhnhtf +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd rft +$ ls +24341 bjhzvzp.flg +dir glwdmdt +$ cd glwdmdt +$ ls +288082 jdtlwrzh.wcj +$ cd .. +$ cd .. +$ cd .. +$ cd twdhlmp +$ ls +dir gbhcnts +154240 wlcl.fhs +$ cd gbhcnts +$ ls +217462 ddzp +$ cd .. +$ cd .. +$ cd .. +$ cd rrhcsn +$ ls +308440 dzbfl.vcg +dir jbhcpdh +238941 rnqdz +dir szljjhc +$ cd jbhcpdh +$ ls +dir bmg +dir mdqplln +dir twdhlmp +dir zbt +$ cd bmg +$ ls +dir djwfl +dir gbhcnts +dir ljvwzj +142159 mwl.psh +110681 rzmdgbng +dir zqjbb +$ cd djwfl +$ ls +dir dpfcrjl +dir rqtz +$ cd dpfcrjl +$ ls +206939 tlh +$ cd .. +$ cd rqtz +$ ls +232264 tlh +$ cd .. +$ cd .. +$ cd gbhcnts +$ ls +186364 ngmw.clj +248882 twdhlmp +306411 wjqvlzp +$ cd .. +$ cd ljvwzj +$ ls +dir dgqw +$ cd dgqw +$ ls +dir mpczlcrz +dir qtbprrq +dir twdhlmp +dir zjsltthh +$ cd mpczlcrz +$ ls +142906 gvd.nnz +$ cd .. +$ cd qtbprrq +$ ls +179566 fmmhnhtf +309800 jhwwppc.vcp +$ cd .. +$ cd twdhlmp +$ ls +dir bhqjhjvp +$ cd bhqjhjvp +$ ls +dir lmj +dir qmcqggbl +$ cd lmj +$ ls +275070 twdhlmp +$ cd .. +$ cd qmcqggbl +$ ls +dir mhgnpm +$ cd mhgnpm +$ ls +dir rnzzqr +$ cd rnzzqr +$ ls +126574 pgnlrjs.czj +7567 tqnvb +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd zjsltthh +$ ls +dir twdhlmp +$ cd twdhlmp +$ ls +198813 dnst.cqc +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd zqjbb +$ ls +dir czdvd +94020 dnst +46041 qtbprrq.pzm +dir rcfvq +dir rwj +118305 vbcpcz +48725 wlcl.fhs +$ cd czdvd +$ ls +302317 tlf +$ cd .. +$ cd rcfvq +$ ls +dir cjws +$ cd cjws +$ ls +dir dsgf +dir fvqbhq +203941 hgcbcvb +9562 qqjh.mfh +32161 qtbprrq.tgn +225251 sbmpn +dir sdhvcj +$ cd dsgf +$ ls +dir cbwzg +141466 ctpszzvn.qrq +277153 ngmw.clj +100681 vmdwgrp +$ cd cbwzg +$ ls +dir nblvrbv +$ cd nblvrbv +$ ls +129474 dlcbng.sgf +$ cd .. +$ cd .. +$ cd .. +$ cd fvqbhq +$ ls +75755 fmmhnhtf +229463 tlh +$ cd .. +$ cd sdhvcj +$ ls +306751 tqnvb +$ cd .. +$ cd .. +$ cd .. +$ cd rwj +$ ls +130415 cjbz +283701 rgsdtn +$ cd .. +$ cd .. +$ cd .. +$ cd mdqplln +$ ls +169404 dvss.mvd +105385 fmmhnhtf +222834 jhzpwscp.sqg +164293 jsqlprqn.vnp +57167 pwpjfq.bmb +dir qtbprrq +$ cd qtbprrq +$ ls +62823 ljvwzj.flm +252940 tlh +$ cd .. +$ cd .. +$ cd twdhlmp +$ ls +dir dhvgfhc +dir qrlq +$ cd dhvgfhc +$ ls +dir vpldlp +$ cd vpldlp +$ ls +279067 dnst.jfs +9050 fmmhnhtf +88586 mfbj.fgs +$ cd .. +$ cd .. +$ cd qrlq +$ ls +dir qwwftl +$ cd qwwftl +$ ls +103153 tnczww +$ cd .. +$ cd .. +$ cd .. +$ cd zbt +$ ls +99657 fsq.rzj +158138 gbfjfctj.bgg +260423 tqnvb +161379 trg +$ cd .. +$ cd .. +$ cd szljjhc +$ ls +287080 stnp.lgp +173682 wjzvglm.lfm +$ cd .. +$ cd .. +$ cd .. +$ cd vrj +$ ls +129084 ngmw.clj +250696 pdpzzbs +$ cd .. +$ cd wrqcfl +$ ls +dir bjlwb +105899 gsvm +dir jdnjpg +178665 znnmmhqt.hth +$ cd bjlwb +$ ls +207939 gbhcnts +$ cd .. +$ cd jdnjpg +$ ls +260418 tqnvb +302144 twdhlmp.ghg +$ cd .. +$ cd .. +$ cd .. +$ cd qtbprrq +$ ls +95562 fmmhnhtf +dir plf +dir qtbprrq +306396 rqqmm.wvw +dir wpfj +$ cd plf +$ ls +dir fmftrbn +20347 twb.zjd +$ cd fmftrbn +$ ls +dir rfznrm +$ cd rfznrm +$ ls +283327 rlzjcg +$ cd .. +$ cd .. +$ cd .. +$ cd qtbprrq +$ ls +313931 ztmhrjc +$ cd .. +$ cd wpfj +$ ls +3969 wrbhb.jll +$ cd .. +$ cd .. +$ cd vtb +$ ls +14260 fmmhnhtf +dir gbhcnts +dir lwcznw +dir mhp +dir pqcddzsf +272267 qgh +301727 rsjrn.wjg +101787 vqscjb +dir zvn +$ cd gbhcnts +$ ls +7627 tqnvb +$ cd .. +$ cd lwcznw +$ ls +98498 dnst.tds +dir gfh +dir jdg +dir llnl +161511 mtmrr.hvb +dir ppzwbgnz +210908 qtbprrq +dir tvhz +$ cd gfh +$ ls +169547 mjjvvlqj.jmv +$ cd .. +$ cd jdg +$ ls +dir cthptwcf +dir ljvwzj +dir vnlndl +$ cd cthptwcf +$ ls +98711 qwzwz.qct +$ cd .. +$ cd ljvwzj +$ ls +245473 zhptcmcr.fts +$ cd .. +$ cd vnlndl +$ ls +151466 ljvwzj +285091 twdhlmp.mzv +59067 vcdpbg.nmp +$ cd .. +$ cd .. +$ cd llnl +$ ls +141508 phtmjj.qzl +dir qtbprrq +105151 tlh +$ cd qtbprrq +$ ls +62020 hdzljht.fvq +$ cd .. +$ cd .. +$ cd ppzwbgnz +$ ls +298940 pzdqzrn.zlz +$ cd .. +$ cd tvhz +$ ls +96628 hrzr +$ cd .. +$ cd .. +$ cd mhp +$ ls +226604 mbdn.tbq +dir ndgqtvhg +$ cd ndgqtvhg +$ ls +55244 dnst +dir sljbrmhb +$ cd sljbrmhb +$ ls +32711 dnst +$ cd .. +$ cd .. +$ cd .. +$ cd pqcddzsf +$ ls +dir shwrrq +$ cd shwrrq +$ ls +dir dplcwvhg +dir pvtpf +dir qpsmgfjl +247965 rrw.wwv +dir vmrwpt +$ cd dplcwvhg +$ ls +242534 fmmhnhtf +202367 fzmt.qrw +197586 ljvwzj.qgm +dir stp +dir zpz +$ cd stp +$ ls +12921 mlcqtthb.jtd +$ cd .. +$ cd zpz +$ ls +235965 ngmw.clj +$ cd .. +$ cd .. +$ cd pvtpf +$ ls +319563 rdspj.slv +279577 vqpjzrdl.hhj +$ cd .. +$ cd qpsmgfjl +$ ls +131841 cqhrgc.cqz +105373 fbnp +$ cd .. +$ cd vmrwpt +$ ls +176373 phgsdlnj.ggq +$ cd .. +$ cd .. +$ cd .. +$ cd zvn +$ ls +dir gbhcnts +dir gfh +dir ppqjzln +dir qtbprrq +$ cd gbhcnts +$ ls +156292 wlcl.fhs +$ cd .. +$ cd gfh +$ ls +189836 ljvwzj.wpt +10416 zbnhzjvw.jct +$ cd .. +$ cd ppqjzln +$ ls +95088 sszd +$ cd .. +$ cd qtbprrq +$ ls +295187 hnnl +292421 qtbprrq.ppg +220281 wlcl.fhs diff --git a/advent/days/day07/data/test01.txt b/advent/days/day07/data/test01.txt new file mode 100644 index 0000000..bcbb513 --- /dev/null +++ b/advent/days/day07/data/test01.txt @@ -0,0 +1,23 @@ +$ cd / +$ ls +dir a +14848514 b.txt +8504156 c.dat +dir d +$ cd a +$ ls +dir e +29116 f +2557 g +62596 h.lst +$ cd e +$ ls +584 i +$ cd .. +$ cd .. +$ cd d +$ ls +4060174 j +8033020 d.log +5626152 d.ext +7214296 k \ No newline at end of file diff --git a/advent/days/day07/solution.py b/advent/days/day07/solution.py new file mode 100644 index 0000000..34be7c5 --- /dev/null +++ b/advent/days/day07/solution.py @@ -0,0 +1,110 @@ +from __future__ import annotations +from dataclasses import dataclass, field + +from typing import Iterator + +day_num = 7 + + +def part1(lines: Iterator[str]) -> int: + return Directory.parse(lines).get_maxed_size(100_000) + + +def part2(lines: Iterator[str]) -> int: + directory = Directory.parse(lines) + return directory.get_min_delete_size(70_000_000, 30_000_000) + + +@dataclass(slots=True) +class Directory: + name: str + parent: Directory | None + subdirs: list[Directory] = field(default_factory=list) + files: list[tuple[str, int]] = field(default_factory=list) + size: int | None = None + + def cd_into(self, name: str) -> Directory: + """ + Returns the named sub directory or .. for parent + May fail if unkown subdirectory - or already in root + """ + if name == "..": + if self.parent is None: + raise Exception('Already at root Directory') + return self.parent + + for sub in self.subdirs: + if sub.name == name: + return sub + raise Exception(f"Could not find subdir {name}") + + def add_directory(self, name: str): + """ Adds the named directory.""" + self.subdirs.append(Directory(name, self)) + + def add_file(self, name: str, size: int): + """ Adds the given file and size """ + self.files.append((name, size)) + + def get_size(self) -> int: + """ returns the size of this directory including all subdirectories """ + if self.size is None: + self.size = (sum(size for _, size in self.files) + + sum(sub.get_size() for sub in self.subdirs)) + return self.size + + def get_all_directories(self) -> Iterator[Directory]: + """ Returns an iterator of all subdirectories """ + for sub in self.subdirs: + yield from sub.get_all_directories() + yield self + + def get_maxed_size(self, threshold: int) -> int: + """ Returns the sum of all sizes of subdirectories, that are below the given threshold""" + return sum(size for size in + (dir.get_size() for dir in self.get_all_directories()) + if size <= threshold) + + def get_min_delete_size(self, disk_size: int, space_needed: int) -> int: + """ + Returns the size of the smallest directory that must be removed to created the free space + given as a parameter and the given disk size + #""" + unused = disk_size - self.get_size() + minimum: int | None = None + for dir in self.get_all_directories(): + size = dir.get_size() + if unused + size >= space_needed and (minimum is None or minimum > size): + minimum = size + + if minimum is None: + raise Exception("Could not find large enough directory to remove") + + return minimum + + @staticmethod + def parse(lines: Iterator[str]) -> Directory: + line = next(lines) + if line != '$ cd /': + raise Exception(f"Illegal first line: {line}") + + root = Directory('/', None) + current = root + for line in lines: + match line.split(): + case ['$', 'cd', name]: + current = current.cd_into(name) + + case ['$', 'ls']: + pass + + case ['dir', name]: + current.add_directory(name) + + case [size, name]: + current.add_file(name, int(size)) + + case _: + raise Exception(f"Could not parse line: {line}") + + return root diff --git a/advent/days/day07/test_solution.py b/advent/days/day07/test_solution.py new file mode 100644 index 0000000..4576dc4 --- /dev/null +++ b/advent/days/day07/test_solution.py @@ -0,0 +1,41 @@ +from advent.common import utils + +from .solution import day_num, part1, part2, Directory + + +def test_part1(): + data = utils.read_data(day_num, 'test01.txt') + expected = 95437 + result = part1(data) + assert result == expected + + +def test_part2(): + data = utils.read_data(day_num, 'test01.txt') + expected = 24933642 + result = part2(data) + assert result == expected + + +def test_size(): + data = utils.read_data(day_num, 'test01.txt') + expected = 48381165 + directory = Directory.parse(data) + result = directory.get_size() + assert result == expected + + +def test_maxed_size(): + data = utils.read_data(day_num, 'test01.txt') + expected = 95437 + directory = Directory.parse(data) + result = directory.get_maxed_size(100_000) + assert result == expected + + +def test_find_to_delete(): + data = utils.read_data(day_num, 'test01.txt') + expected = 24933642 + directory = Directory.parse(data) + result = directory.get_min_delete_size(70_000_000, 30_000_000) + assert result == expected