First day master
authorGreg Burri <greg.burri@gmail.com>
Fri, 1 Dec 2023 14:29:28 +0000 (15:29 +0100)
committerGreg Burri <greg.burri@gmail.com>
Fri, 1 Dec 2023 14:29:28 +0000 (15:29 +0100)
.gitignore [new file with mode: 0644]
Cargo.toml [new file with mode: 0644]
README.md [new file with mode: 0644]
data/day01.input [new file with mode: 0644]
src/day01.rs [new file with mode: 0644]
src/days.rs [new file with mode: 0644]
src/main.rs [new file with mode: 0644]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..088ba6b
--- /dev/null
@@ -0,0 +1,10 @@
+# Generated by Cargo
+# will have compiled files and executables
+/target/
+
+# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries
+# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html
+Cargo.lock
+
+# These are backup files generated by rustfmt
+**/*.rs.bk
diff --git a/Cargo.toml b/Cargo.toml
new file mode 100644 (file)
index 0000000..d596fa8
--- /dev/null
@@ -0,0 +1,18 @@
+[package]
+name = "advent_of_code_2023"
+version = "0.1.0"
+authors = ["Greg Burri <greg.burri@gmail.com>"]
+edition = "2021"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
+itertools = "0.10"
+regex = "1"
+clap = { version = "4", features = ["derive"] }
+rayon = "1.6"
+
+[profile.release]
+opt-level = 3
+lto = true
+codegen-units = 1
diff --git a/README.md b/README.md
new file mode 100644 (file)
index 0000000..cf6601d
--- /dev/null
+++ b/README.md
@@ -0,0 +1,27 @@
+# AdventOfCode2023
+
+https://adventofcode.com/2023
+
+
+# Running tests
+
+Example for day 1 tests:
+
+~~~
+cargo test day01 -- --nocapture
+~~~
+
+All tests:
+
+~~~
+cargo test -- --nocapture
+~~~
+
+
+# Running a day code
+
+~~~
+cargo run -- n
+~~~
+
+Where 'n' is a number from 1 to 25
diff --git a/data/day01.input b/data/day01.input
new file mode 100644 (file)
index 0000000..df08b88
--- /dev/null
@@ -0,0 +1,1000 @@
+ckmb52fldxkseven3fkjgcbzmnr7
+gckhqpb6twoqnjxqplthree2fourkspnsnzxlz1
+2onetwocrgbqm7
+frkh2nineqmqxrvdsevenfive
+four9two
+six7sixqrdfive3twonehsk
+xkvsone2
+one65
+rggxsff1seven
+djbcgrrtqdshpqqzj43rgcr
+br89fivetwoqggnxjfourtl3
+zoneight47five5sixjxd74
+4five1
+5seveneighteightzzbnzsvdjnkvndsxlttfour
+htdcmsl12ninethreepkqtdlvtl
+twocghtvtdlfchfqnjhrfour19
+rptwofiveonecvlldmppxtrvj3
+6gqsvsqpzxj
+5twomgkzsvg
+4ninedflntfsn1
+4threethree
+43two6eight9
+4gqnkntjthree9one45
+9lmjgqnkxqvfrzhbcfrlltjxjlkjfrlmb3
+ninethreejkcbplfg4kseventwo
+mbkfgktwolbvsptgsixseven1oneightzvm
+m5fvqfkkk
+tptqnsxmsevencrkdmxms55zrfmpmzv7lzqlnmbkzt
+bqccqhbdgeight7
+four7nine1eight
+8fivethndnpztzninepdkfive8
+1sixxvqdfourlnpdrfbnnx41vhqgth
+sgpkgdb9
+fivetwoq7cdprnjdjhs3three9
+1mfvptbhqshblvvvdl
+ztftqgbzld8jkcmsrdfzonemzdmbzxpfour
+dfkctqcjbmfourhszmlvtkeightthree2
+4onersrfjcskckcxcj4sevenzzzpsixeight
+1fourr5gxpone
+seven74ninersgvvmtgsix
+jvtwonefivetwosbpglbx2two
+fourfivecxgssssixtwofour4
+3zcgcjdcpbgqdfnhxtneight
+fourfour29cpbccthree44
+6six9foureight5xmfdf
+four77
+tqtnjshdmtwo3four8one27
+one52
+nine32five3six
+qcjbjrpqdtpvveightpmzs17fourjvghvl
+5293gmtdttfpmrlhvlt9
+2zonenfglkskxhn3gxbrtxtcpfive
+three5cfourfvmqlnhp4two
+three4knrdzxpr
+fmpvqkxgeightthreebdrng9tdcffvsfctwo
+jpktgx8fivegqeight5three
+7sevennine
+3two3
+nfthhzcq2
+plmbtrzbnbmt1nine
+149hvjbktkmbj8mtnrblcvfive7seven
+bfthree1
+six6kqprz86two6
+jthree6
+nine2hzrlcqrt7eight
+nnzhkhpdb8rbnqmxrfive
+rkszqnp1
+t1
+5sixlmxkgmxrgveight3
+sevenlptpdhtjpgxconedvtrrnngn8
+nlpvxbscttbbpgndnc7jvrtcjxbsxnqvfcxdcfrgtrdkjflzlrqcnmfourkznnmrv
+7kllgxpb6
+two4eightfgrsix1five7six
+one2three6hmktjgmbxhbjl
+bqjtxhntjreightsevendgcfpmkld14four
+22pgcslxtdhkhz8ninethreethreejcklznxq
+146gqthree85twoseven
+vlvxlmkfpcxsstsevencdbbdsix6
+5sixseven48
+llljbtxtrrpssrfthree9dpvrndphhn
+qkhvq5
+svrfthree8bdhjshcftdnine4
+nfqnfkpchl5pcstz
+pbx5mfkfour8
+cptwonethreeptwo9gzmlkv9
+gdpkprlzr6466fxlvfour
+dlnpklqtfivesixfptrdh9four
+onedpfskdd38qfvbjdnpglone
+4sevenseven5qf
+onepgmmhlgmtvone3c
+247tsnmkd
+threeznnnbtfive5tmdfxtwothree3ndjcszrb
+oneeight6rhfiveone
+threethreethreestvgljm4seven
+bfbrk3vqsmone39hzzxdgp6eight
+98rndphxhcbl
+57fourlntgdngzpdsjkbbxnv7
+twons4
+three4threesixtwo2hf
+lgqtcllzsevenhrrhqsmsnncmlz7
+8fnngjrxtljncbvlt7ninehfzrthree
+12mltqtqqrvjmjsbthnzpdjtwo1
+lf1onevdmn2
+3twozlqnddmrsixslphpvb
+five4nrtcjmvj
+cksgmkszrbsrgfkq7tqjxsshxxh7vngsnjt
+mfiveone7
+kkvtwone5sevenfcfnngpmjktrpxk7djgzmdthreehpp
+fxbgtcjp4pxpjv5rbfllhfcpfive8
+2gxrkjdtvxmnvs76
+npvvleightlpd354vrfh1
+zbnzdlzpqzsixnine4sevenqtddzzm6
+6cxrhdvzbmthree98
+77eightnine32four
+56tshj77one
+161xk26mspxkchfourfive
+onenineljnsmvmfb7
+6hxvmqtwo
+khzninetwo3pbtsqxlqj3
+1nine3
+6xrzjskblfq
+kbtsbckkonethreetwofour7lgcbxmjkjpnine
+fivethreecrjznine7
+8qxjdsspgn
+vdoneightsix7h9
+5bsjl
+gfllsrrrmzbfqdrlnvtdzr3
+7hs2
+1onelseventwo
+fivetwo3
+2gnxv9sevenseven
+gmmhshzvsixzssixseven6fivehbdvsjdz
+75onegckzsnpnine1xfslhfour6
+sixgjhnfvsjnrsixeightnine49
+nineseven929rlsdkcpbjrjdlptjbzp2
+9hbpplffngltfourpgk
+twoldknnqxkkvvdjldqthree373
+cceight9two
+zmeightwohkgs6
+6sevenfdmqkss4fivethreesevenfourqfnsvvsj
+4two9njeightnine
+two3gzseveneightfour88eight
+2clqj
+1ndvbhbtql
+five4sixseven5ghlgbmdgfnqpfdm
+34dt
+9sevenrl5
+dpbpqppsixngvmkflllcrtn8
+sixgvsctkrp53sbsx
+nine9qdrqfourjc
+zvppfjpqch24
+sg4txzzfoursevenninethreesqcdznksix
+one3six2
+5bgdjzxbrlsl3sixlbxtjdpgfkjmq2
+drsldhgjtrvmmz3jgrp6
+qkeightwosix95nine445cfnine
+fivetwo82scjct7onegblrqrggv9
+threepfgljkghzc9
+8qvzljppstpnpeight9
+8nine98tkxcfqtg
+sevensix4two
+2eightthree
+cvhhmcgknj6threefive87
+seveneight7dsvqnjsjsqlkeightwovzt
+71oneseven9fiveeightnh
+pdjtzxbgjxb3vzfdnjbthree
+xqpfourmpddnfcc4one5
+jnrms1fkssgpvvlrmf
+jbnkeightone6zldns85sixnine
+1fourbqfgxscdxmkvdpsrm
+eightsixone8mjbrqkplkqntjdlfourpjdcs
+lxdsp6prmfglvdfz9eight7sevensixone
+qdksixvmsevent7xlvmtzdkhb
+8spqjvhplpzldpthree2
+zqfvpq7pz22
+nnfbpfour1
+one9ninetwovrclctwo
+344six98seven
+kqkj9qqvfxn
+seven1fivethree
+shlnhgq2c3oneseveneightwodv
+eightthreepkcxlk7threeonethreetwo
+pgmbhrzzqmvkjl57fourqk8gxjmbfqcjs9
+eight5oneights
+ninenineeightvkrsrkgh8
+svnfdxxftkgzpjqxzkmbbcfourvfsg3two6twonezqn
+mnvqcmkqvjlqvtltgdpktr3dkgkbt
+sixmg29pplfzrsqhlvfeight
+glzsbmzqjj43
+1zqrnpqrcbzdsnfour67zpsxpkbbkmfgrzm
+kxbbcjjksix7sixeightnine
+zbnhsdxgt5sixsixeightlsdqrgseven
+ninezxrllznbcvmldxfbvjx5fivedtpdhsjgk8
+reightwo7
+fiveninenftgfourjbdkxtxcb38two
+sixlpck4sixzcppvhzkchmnpvqjjgffourj
+34pmfdthreetwo
+7zbnnkqone5three
+qxkmhcllcqkk5qrqseven47
+one62brghc8s
+twotwo1xvgcxbthree
+three83dfqgjlc8eight
+twofive8l1twocqmcccgdm
+two6cnine
+h2sfnczjmslpmlvdlzrs
+9nbblsvxbhdxqfour8
+kfzcsg6sixonevrbchsjtfivenbz
+mgtlqcdtwo7qxmszcqpjdplccxzccsixone5nine
+mtfpphckdn1eightpdtkssqlxdhtlmcjxb
+jbphmjjjrg2159eight
+zqskrzb1pgfouronevxscgtlccl
+lxvpgrck8fxhxm
+fournrnlfive1xt
+3nsjnb
+eight1three513nine
+39eightsevenfourbgd1mbljzone
+6two88five2pjpp
+fourjlftf7six1xsktfhcdff
+3kcntzlmnnhhmtmlftggqljkrvninetwo
+threesixonexlvxrblq24
+xpgzzrcckdlnrczxndplbpcb452
+ninembdnhhnhhzmvmtdjtkzmb9ncq9one
+4fivebrqrxftwo
+84tqzbcvgdrgpzpxjrone83zgzpsix
+99five
+mgsevenqgkckfhbfnine3
+2seventhree
+8fivethreefive2fivethreefive
+scrtqsevenjmxlvjrrbdtqgrdghfivethree7seven
+sevensix946onesevenfour
+dzn14
+nineqbxvponekvfffs96zjfhpthree
+53twoqknxnxqbcone
+fhonerone7fourpmxskkmmx7
+eightlq4fourfourdbsdrvhhs17
+nnpgtgcbvrggctbtkzht5xmkhtnnn7brpxjcxdrone
+threecxnqkmrrpmzdljstdbfmk5seven
+sdptbzqhn7sixnine8
+five7jdzdzfqfivesevengtznjmqrblkkzkgvt
+fclvllfthx47sixbhq16
+9mbmsxbn
+three82fiveseven4
+p1kzmzpbhmcthree
+eightj3681nmgt8
+2two7
+jdbjlvxhhzzsnmcqldrldeight6nine4
+2threefive
+foursevenrmfhjvzdv8bpbrvblll1onetwofive
+65cfgkcrhbjk
+6onecjxzxb72gmrblthx
+4jlrvckc9
+doneightghmjzzrfourfdzxflm51nineseven7xkxt
+r5eightone
+nkgknm1
+rxbsnnzbrs4two4
+1pqvmfh
+r2vpdpkzqcs85
+gtfzjnnhsknvjnmnine98
+zrdgv4hnbpb
+7one165vddbrzpmfhskvzxdh3
+44szfpgjmvgt4eight
+dbgttrbj6five85nsqmzscksvdxks
+ffkrhbvq2
+6fourbpjrdvlk
+38eightsix
+two4fivedzpgfbtm
+3jbk46
+slpkmrstrrvthreepl9bhctdfnfzc
+nine4two5kkfmcjgxbqkttg
+1zppnmcr5sjfsbbxh48one
+8one8fourseven5
+6three7nineeight6
+96three
+91twonelt
+5sevenone2sixthreeknhzm
+2fvhgcbvg7sevenzqdtftct7tvvtkpxbrq8
+9nvr
+eightfivetwodjg9
+7four2six
+5fkzgffzpgp3
+75sevenfive
+mxtwonexsdrpkqzgm1threejqftvl
+onekxffhsqb4dkb9fivefvtcjsd
+eightone1eighteight4
+glfeight7eight4
+eightcdfjjfiveeight4fivetwo
+npxnp32kfsfjpggdtpkm5
+seven7threevcb
+xtcvsmdx2four2twonefl
+mzkgnzstwo844dcseight
+zgoneight65z1seven3
+1two5lc
+threevsrg5vdmfvpss27qzrmvmbz
+7qbcnjg1nine1seven3seven
+5fourxdxrhmxsj
+v78
+41nine
+56fmktkxvltp4bztxkqfrdthreefive4
+fourdnq1
+ctlk31srscmmdn66sevendmjjqvgj
+b7nine8ninejqqhhdnnpx5
+ninedlxdshrzfmrnnq17
+jbneightwofiversjctwogvvtprslpgfour9xcone
+dpt5hbgbnmdlthree5sixvsvqtnmndpvv
+sevenrztpgr8nine2
+four9three1keightbmljrjgxkrbjdhbckbst
+sfmztfjh49one
+seven3three7eightwovs
+48onetwosix4four4ntvrzvdztr
+mphtwone5sevenfour7
+4lgqnbdlone
+hpnmtjbcdhfhsnxqhjhhfgteighteight8one5
+cgtdtt22
+plnbntcb8seven1gkgzngxq
+7bonethreefour
+ffoureight88
+z2four3dfggfntxjbjhdr9three
+5sixgpcm9two
+sixpnlcgbcpdsixtwofour4foursix3
+dstgjlh812
+3xfhdfrgqjfourkfjone7four8
+nine4three6sevenfourthreeeight
+njvdqthkv5seven6fourtbklhrqqsixeight6
+58rcfcjdkxcj3eightlndf
+jhnt7zblnkdvhslrhpbkzdh
+7threetrlkmmlzsmtwo4dmjf94nine
+pssrhmtcv7twotwodjxvlbmnfive58
+eightseven271onefxxrfglh
+9bmtwo
+three522
+eightseventworckvnine2
+6fourtzmlrkrztvtxfcdf5
+3six4rdchffcg7
+6threedqssixnine
+fivetwo6
+sixnpkr5xbxmjcxjznpnrf8brxtmgl
+gtvg3zzbeightkphjs69pjprvhlgl
+7kclrcjbtkcr63two5
+threehpn38fivedcmfkgqqeightwovg
+hbjcsfshsjqqfive9sevenfourthree3fzjpfjzd
+five7qzhnthree1
+nxhg17j8ninejnqlnine
+ddlnxmcg2
+rxeightwopqtpqncvd481154fiveb
+sevenvbkzgzmnine4qhpptngvhh
+bkmz6nineeight69
+tqvzkqfourrj4one
+sh15nzxzhqdxd96dqht
+6rhztqrfninefsqszx
+38cngonefourrhlljvpgz5vzhmbdjj5
+8fiveddchtllpt
+13rgzljhsdjfive2six
+sevenbdnbheightfive7qbzjvlsr3
+fivejmfvtnhz1eightkcdpjsghgtwonine9
+five3bllpvnqgtzdhvprgb
+t1vcttwo
+9953three92
+9hrgxdpf
+sevennine579seven
+threekp1onefrfjbrmmpmsdsvfour
+4threefive61rrhrtdjs5
+xbmvcfqp4onesevenmkgvsnprtl65
+379
+4966dlprfxmhmqdfour6
+9lllhz8nmqxkzsevenxmbqvgqnj8
+btkxnzonesevenjmkdcc1ff32eight
+7three65one745
+seven66ninelkbmvndm3
+4three3sixeight3
+177dcxqqbqpkxgctwo
+48cjpd47sevenzgtkrdlfq
+5ppzvklbtnine212qlmt
+89tpmnr
+dh1gfgb6threeqcm3
+five83
+fzlkpx6seven2twotjlqpgldlfour49
+fiveninefivenxpzkrslxm44
+pxxbnsfoursixeight5mjkeight
+ninefivesevenz6
+djddxtdeight2vqsvdgttxonefourfhdfxszvfd8pjcvzbgp
+253seven71nine
+eight6cb71
+gfzptdj1nine5twosvtmpphj9mkhd
+hfjcpvzeight7ggqrmkmzrhbthreeeight
+chjonetwo2lqxfrbvq
+fkfmntldvleight4threethreeeightfour
+6j81threeseventwo3seven
+seightwosvsnp4
+8bqjk75254
+6seventsmnfjtn4rthrp
+9kksdvfzzpsszffouronenrqrcnine
+5dkpp8fournine4one
+4mpbzrfvj8two9sevenonenine
+jzkdrrjsnpxzxbjhb5
+three87oneonexppvhz3seven
+two39kvrmz
+vdfive8dntsz
+mthreehzdghb3eightsevenfttmjtx
+2dlnjsxlg
+7threecrrdqksqsevensixnine
+mdxhrrrfiveone6
+8nine52
+725two
+jzpxt2vcninenjgfzddk
+three29
+zjrffvdgnpeight1sevenglpfkdb
+two3qnhqvxeight
+slqdvfmeightmlhjdcvbrmsjvrk6
+two13kfxd28rzqhcdkjtbbstnhbfive
+qhdqqnjbdk8eighttwoqpthree
+one1brxnptch263eight18
+threexntmdtwokdmhf3pdkgpthree
+2three9jrcrmjvbrm
+1mmlsfsdkzkvjtwo3b
+sfkkkncf3three4seventwoqzhmcdfbhxfl
+vfnqlnrzcrzm8fourvpzxqdqsfb
+rjkhxqdmkrfive1
+2four2nine9znp6seven
+7doneone
+9threetworqlk
+eighttpclmtv4twofour5mtxxnpthreeoneightfp
+onecfjgrbsjncmpqhqvhxtfpc21nineppone
+eightlvjxmxhfive9fb
+ninenrjlmcthree3four
+eightlxrnvljrhksxzfxzbrt644
+blmjnfgsrcms31
+zsix16xtjvrtn
+lkjfpxjh1sg57xbxlsxcrsix1
+mkmdcsbgvd19ninecsevenone9
+three1p
+4prbjfour1ninesix
+pkf7sixsb
+fiveclczl8sltncdxsix
+4ninefourseven5three
+3lpchjfgbhzjbqggsfoursixseven
+twonmcfztwoqp1one5
+87sevendbqdsevenrlzkrhoneeightone
+4three4
+2tthbbcpcr36tqvfjkfs
+rtzqgsixnine4bzqhjrq8five
+eight3fivel4kd
+1fourfourdpvvghvlzxtwothree
+2gzgzmrpbztm1cgzvvrtqt
+qdrfrkncnt1eight
+smpz4mjrbthree1ninefour
+6seventhree7
+5278nlnfjrqlone8
+nine6eight
+twoqrtdsreight2dxhknhpdzz2pdbsnlpljlxkv9eightwop
+vl6eight9eightsix1lmth
+qxsevenkckxvmjkb1
+hvhlm2twotwoone
+grtlftfthtthree331dzzzoneseven
+ftpkgvrsc85cplddgnn
+lhcbzhgfjlgmcsn66
+twofourqjrltlvcmmzv8nine3ps
+knvz5four
+threefivefoureight7four
+one9fournine5
+cr8twofive7two4tlbpgbngsp
+seven6gzn8trjmzrvjthtpzld5dcqnjmtl4
+1five1fourfour8hqjzshnszhzgcchs2
+tld78blgffjksevenninekmjnrzlvxr
+15six
+fqlmqhjslgnllgs6three
+jvhmkfjzd5
+kfkxjmbrgjzmjtwo2qnh45pxrkrcpmjd
+dh119mvxlfdft6sevenqdxb
+five5jl
+jhqp2qzkfvjdfts
+teightwo6
+kscczzhftqxmbrjtm46five5hncmntrgqz
+65341
+cxjpgfourfour98spklghbv73
+5sevengnxldmlvnrzsthree
+bsn6three
+fivesixz36
+snpmdmx65five4
+vrjbjsixfour37onesscclpgxr
+four58
+nlrflkxjzbpckmprkp435
+pp78
+rhz3dblsmbl8mvmthree3svhbzb
+qtztdn4
+rqrdr5ninefivexj
+fiveone4ninesplghqrbcnmmzll4mvklfmxv
+tj3ninekvczg3cczmhkdf
+fivelnrjmn3jvlmhplj4fourkvdceight
+five6jrbkxrvmtqfvbq7pmjmdkmkv
+6gcllrgktc
+21zffhnksmjj1rcdpkcrznine
+threegpnpftrstmfive4ninefive
+1cnsixpnvrxq
+33qghllh
+gfour1rmznkmplqfsevennksglsfdqtwotwonet
+kjqcslq3nineoneightkq
+three8oneninepjpqnzccthree
+3jpfhtrfrffournmrxrpdjm
+2svsmkptdcmpkhbpmnineczjsjvlfpkckxscfour
+dqxpjsnineonenvhptwocprtsbvcl6
+ninethreesixninesixxjjjkvtbgd5hrstthree
+fivefznprpxccnk8four3twobllsjnfjnx
+ghh2skv6
+eightninethree4jbcgrqeightfive
+4ltjfxjbthreesixbrtzlbfdx7eight
+one9mvbrcc
+three5khjdjlpl4hrzqblshkxdgseven8
+czvxncr2
+eightthreedhkkpr9hqqdtwo1
+fouronetnhxgzstdx31six
+fzcnineghrfbcbhhv263
+eightfive525onexgrzfive
+zclvsg9three6eightkeighttwo
+two35bhmnlt
+9s
+xbshssrspj643four4vrjdnlf
+nineseven4ztnchhpx92
+gpfive25dvx
+1five5
+jtcstj1kqrsbhsdsk8
+eight1sixsixbnsfouronecsv
+tgplkg2hgeight
+seveneightxsgcsfxd9dpkvltrsnlkccrskrbppmkxmpt
+pddbvnrqzznqmmonesixjgpgm9rmlxvqqmdbcqhng
+xqdbsktwothxzfsmqptrjbthreesixhqgrffqcnine2
+vxvtfjsevenfivethreethreensflthreenine6
+8one9sxrczdfg2
+mdtdgjthreethreefjzqs16
+dnvpjteight6tcn
+eightnine3cdzk
+three6tzmqbzgmdeight9fiveztwo2
+1pg6three6sevenmghhdx3
+41threenine1
+ncbrrm7six2nine
+eightxrxdsnsvzddhrqvkfmseven3ntpqhsbttqmlp
+one3fourmmrhpjmnjnqxkf4ftkxsvsix
+54zdqrrmzd
+rftdstx6hdrhmqjs9b35
+fiveseven8five5
+gzfkkqznk4
+six32ckkbh
+jpk171fivesevenhbjlddveightvcqh
+71foursix7
+2nine4onelkvplzhj7onen
+4nrvsh3twoprvpgltsix1pzbdhvfour
+skvnpjfmkhmf7547tszjzmq
+two3ctthreesix3sjflprlrcg8bnhxs
+six41nmgpztwo
+dkkhmgmjtwo4seven
+8jqcmhrbmcninehbpxdjpvbk882ktjxp
+hlbhcfivetwo77three
+19ccmrmh1lgmngl8
+5eightnhfsjzjseventhreefiveeighteight
+3dkvxfive
+39zn
+cqsklnrdhtwoeight814rdncfthrjbc7
+13pfspbxkfrr
+five7sevenfourfour42tppvrfqrvz
+nboneightfour9eight7threefournmvcrgmkx7hs
+sixoneppbone5ctdhjzzrnine
+5one1nineeight1two99
+7rjvqdvgxxmb
+sixbkdpftd6
+699
+rflvscthxb9one9jtfqd
+sixtwo2hsclsg
+8nzgpt7eightfour6zhjxqjmrq53
+pddnfour1one749five
+gbbprvrq23seven77zssgktwo
+ppc2flmdjrp7twoonerjhtlv
+vlltgb8seveneight5clqsthree6
+onetwobtgdkkxv1five6lcfvkhm9three
+two8threesixsix
+5threeeight
+onespeight9twonexpr
+pzfourseven8five9five
+9mbdbphhrfeight
+fournt14
+jlcb2
+three3eightnfj2
+6four2fgsndlslkr
+8sevensxcjl6fivefivesssevenqghn
+3xgzj66svlvqgcvzzlb5vvjvmvb
+hfhmngkv64
+263six
+oneone15qtgtksjdgz27hjl9
+1six8mrrkx6
+vdhslzfgsevenfivemseven4fourq
+vdjlnrvqjb5thsevenfiveonexskqrfourhtcl
+1ninefoursix6seven
+twobvpnjmspxmgxkv4twotjjkbxfgs4
+fivefour8kfjrpdddhr
+dvbljqpznfjjp6sevengvbdxm1bnzhqmcdgpzrd1
+34cmclpfrgrjpxpjpdv
+9xcdkhtsdmtvlrtlcbsixtrjqxg
+rdhqfcseventhree9tqggvslm
+gddfoursevenrqvqdkqbr6ninecfd
+19cjpltfxspkpxkctdhjkncnbtwoone
+mseven7six4five19hjd
+jcqlxpmmj7rsrrngnq2seven
+fssvonepgqmrgbv1
+fourfivefoursixthreegjgxhbzrgx1
+fzdfbxsths5szkgkgzdmnvtnine9nqb
+rszfmx6eightnine6eightj
+three199twol7six3
+threedmxbsevenjmdvrzlfive26
+ninehkbdkc594one
+6fsix
+fiveseven51fjlx6
+bj3fivesix1
+9vxcstvpf
+threeseven6
+ninefive4twoonetwo
+8seven6
+twopxsts95
+pzhxsxnnkthree6
+6ninem591
+7drfqdsjsnfdbqp
+p2plgbninethreesixthree
+5seventnhvjfrlkggfjbmlzxhnnnsh
+seven691rjmnfzddfive
+466mmgnh
+dsctthree7
+eightqlfourzndmzltp34xjbdmpjs1
+stmprbctwo1ninesxbzqkkdqgdqhone
+sevensixeight91sixjscqxlzj4
+vrctfpbp2bdknhtwothree68ckzlgkghponeightg
+one82lzh1m9
+5dgkljnlvnthbdfeight7x9kloneightrp
+9pdsgfourzcfour51one
+3twonltnmdqttqmj6fivefivesix
+1four8szcp
+dqbrkz8xp
+3twoftqxxgdg
+sflsixzjq1
+6nine4plhvcthree
+znzdrj4526fjtszspfour9pk
+785bttrfnrtzvninehqzthfr
+6slx7six8qhppjmbcrj
+dc1fdzzsvnb
+1xfourtwo
+1mvt283
+fivecflqkthreek2
+7gtdlvbcxvrxvx1264eight
+b1pbpcsix
+fivefourzqrmbpgnqzgpzhfour9
+seventhree5cnvjmthree
+ksblnqbkgnfone8
+8fourvkhkhlsjq
+twoqjvb9zjvpfz2onesixk
+tdjmrcvsevensix1seveneight
+5mqxkkcttfivezdbcdmlfivebchqlcktpseven
+7bzsnljccxqbtq3dsfsbrlpgqjzxeight
+one4mjgfhzsjdc3crgthhjrznd
+sixthreektx8xjbdjlq
+bgvldztfivetwo3tldvpzkmonepdvppd8
+xhzm91
+oneskfoureight23
+ppsj64
+fgrf45four5
+four2two
+798jcgzf
+93mxc
+hn5q9rm2vtksix9
+cvdldzschflc9eight
+mqdtndzvv9eightkzxlgvcggrkltzlphcfq
+beightwoone6rqjcqq7sixfourrkghseven
+two9nine9foursevenfourone
+793sixzngtcbrbtjmbjbqxzpqjkn
+1five4
+x4
+qmlvsptmqhfvbfiveonemnmzshczjgsvgsgpps2seven
+28eightmt9
+1four8hbpnktmn
+6nine5threeplcsdrn96four3
+two3vdvh6
+three7fiverkjmllclbprmqgb4
+strvnllfmqm2threesixbbrjxbjvvxvjhr91
+4dbqqbdcddldhgxjrnfivehz9
+v81nnvzv
+3ssptnqhmrzbseveneightwoxdx
+ninetthree72
+556five2three
+99175onepzqpj
+8tmbfpbsninenineglvbh7gnrd
+three8zmtvxqmksfpvkfourp9twooneightzgs
+khmcnch1tb2
+5jtcggvdfzmsppshsqlhz
+249sixtwofoureight
+6sixfourxpnt
+6threen
+16qmgfjjmqnktnxgz
+kjvbk1zzqhdkgxxghxsix77
+sndnsm1741gtszjkmvxsevennine
+kzlrrrjbtrrgf5jsbgxn
+4bnfdfbgthc
+ztghxzrdprvlfx4
+54tzqlfjfnthree7twonine
+knqkbts5ffqhdsfpmdeightnfhpjcmfmrl
+jzphxleightjhxvhdrseven5mktwo
+1fivegxdknn
+3onetpqdddbhb2seven2
+7seventhreebzcqpkdck5dc
+seven71
+eighttwo1
+dfflcrcqfiveone2seven6
+qpf8
+1seven1bjsmxzr54four5
+mmztpseven836four
+three8htqhzkrxhrfourthreebdrmjsvpfb1
+zjhljpmmdms998ffjqgxgbkdbvxxppdltbrpzcbf
+rj76
+vlxnnqxr4eight
+2twoonefourtwosevenpdpfkgdhhzlbfq
+cn5five4
+hhqzsxlm45twonine
+ncszsls1z2
+ktxkkbhcxcbnffzbsix8bf4r
+xrk1bvvrxvkreighttwoeight
+4eightqbmtpsl2six
+13jzchfndpjpone
+fivefvm1sevenhjxrnkg2bfmdnbj8
+9gcfmkhqrczseven7jkshrh
+twornrbjlvsdr1threem
+njzxgftwo4two
+threertvjcmtlr7nxhghbnvkq
+6seven8drfivecvv3cr
+fivefiveddnhmz25nine7
+2eight4nine47
+nthreetwotwo67
+4mbsqbpvf7threedp4fourvvdgkvzfkz
+sixthree1twozxldcqnvdcksfiveseven
+nh2
+4rczvpnvsptwo
+foursevenone4
+5sixkvsjjqzs32kbghctffhssmg98
+zbclnpj3ncgjrpz6tcgdvjpdmkk1
+4mmsbtfivetwodgvbhrzrlh
+sfour2fivefour
+jx9
+xltwone6
+1szbglvbcblqtdqrbdqqhbfzrrq4sixfivezfb
+two8klhvgbm97eightfour6
+szslrmeightsz61eighthnhxv1
+seven42sznlgdsdgfj
+three2eight26nine
+4sevenfmxrhgkll3fivefjsxninefour
+onenlzksgpz2ggnvsmlxxsvqsix6twodbdzvkbhhl
+mxs62zfsmkgmxzl6nbsix
+9sevenlbbt9twonet
+32tworbbmnbgqjd
+jrx7mpbcvqfhfr7sixsixkqmcj
+vcdcthreefour5bbqbhxqjkqqzkdk
+onesevenfourhxfvfoursrq4n1
+six1hglqzjxfxxd4
+4lkjljr2
+3brlmgbpdnpslgcsevenxrrftvzlxc5nine
+czhmhhnrxrbzgtmvn1mbjpnrlsevenbfbztqfp
+xnctftbbm3seveneight9kpkfour
+xsixsixh5three
+2lzslqtllcpfdq3
+six2xstqpjctsxgtwo941
+sixthree6
+636bmxvvfztzvbrxbfh1four
+h4pcllfnine
+pknldv4jzlkngvqslchstsnfj7sixsevensevenb
+78threegfclmstbxt
+9three9mnkhrrlbgonethreef1six
+2bzslfdpvoneeightthreeone3jpqjk2
+1nfjttgvlsn6eight2hznlx
+7three7sevenbdngj6threeseven
+one8qdldvhjhrfsixgscfnpvbm2
+mqlhrjksdtbrvrgvpc884ngrddthzjgtjxnjq
+kpndxtponenine97
+vcpsjrxlpfqprxz7threeeight2
+ztgckbfr5twodpznplgl32rfqjhrvhgmkd
+threehfvxnkfhdgmtwo16
+6seven36qrndxhxljgkskgtjdtscczz1
+ndcqhqnvtppkfbgljkrd3xfdvqhxkx94
+sixgonebbblkbbqvccnvm2jxpvlnrbmjnsrnqgbb
+sevenmeight2rlvbkxmxfour3nine8
+72bcdrcbzffkc3oneightnc
+onesevenfour57
+sixnmplqnfx1eightfour
+nine5bh4eightseven
+7gcqthhztknjslxfbcj19
+five2fivethreedbrkgchn8
+221565
+26three83vmtlj
+nine5threeninezgjcpssevenone
+xshxdblgf8threehxkntrdn6lghpzt9
+fdfqxmn3eight6zssbgnddcv
+eight1hrrqmzjjq
+ckhpqtwodqz9r
+zbtjjffourninesix7bqz
+jeightvfdqttxmsix3pnh5lgf
+6onerqbdslg
+fivep26two
+onetwogscnvv1
+eight1487
+threekksixnine6
+69sixoneqhhrqsg
+8sevenmtcm
+three1jlbfpfdxpqpzspgcllfv
+27one
+mlmfourseven3
+sixninercgrkdpd9
+three7kmvsztmxjsixthree3bvhmhthreesdrbq
+mk7
+jstwone8fourkrlmtfk7qjvrghcbfive5
+eightchvxseven9nine252
+five68qoneeight
+seveneightfive2threetckdpkqrnqpthreevlqlq
+jlcpvfxpq867xfcjcddvjkjdfnqtnjp1
+prxzmdmbxbfljckhd7pbc5three
+92fninenhnxjlzninenqmhmmlsfqf
+ftmljhqxjdhddkbtxlbz9five
+oneone4cfsnxltqfbnzzljseven
+gbktqjbrtgsevenninexf6seventwonine
+nine3fournine
+1fourtwo17seven
+twosixmpnpdzmjxlmjsjdnkmnhmdtdg7xrbknkplsix6
+fqzqxzkgzrlkmqfour53seven2
+8three27eight4onekgrlc
+nzrlgrvfive3vdtqcqrm6
+4qfgvppninetwoone4
+threelpmgkfxoneseven8threebmjtdl4
+slkrnqlpfxcrgxmnd9one7
+fouronekbfmdrjxvn8kz1twosevenrth
+8xbvkfqmzjg
+six4xcx97lzninefivenine
+threesixhfvnjrvpf1sixseveneightfive
+8ninethreethreepdlddhdfp
+two47threefour
+61czbc4cvklssbpt
+8712st2
+lgflr1three
+ninenine9
+ptx86five
+291
+seven82three9
+mxfhmtcjpxqqsl68hpcfvjj
+1qmvjl6four
+3six84
+fivefivefourfiveeight7eightwods
+2seven5five2d
+6five3hqbjsrzhtkv7
+4pgcsxslr6h623
+three8one
+8xnsgbjhz9
+3gtqbhdzjninetwo6thrfssxqptjbtmkkmlddhdm
+6mldxcjnxv9
+mc8one88
+h4
+fivefour2s
+9q
+fiveseven8two8lkrtvdqchbvnmzmlhgqbcx
+cpcgpg9cnbsixsix
+vglgjf9qzcspsnsbrktbnpnppzmgldtwo
+three2kllpcvmmgcseven
+twofivekvcnfpkplnv2threefivehvxpthree
+36h6hzfhhbtqgqfgthreesix
+86kkqqseven9
+7jgncdninejvmqdmone5sqjp
+seventhree4eight9three
+38knvgxrftdtwo1
+ksgjdlpxhztnlfc6hxncbgbmgzldvlvmgrjkmtwosix
+dtoneightone427
+3518msltkgqthvjhs
+75qmqvkmf5six
+85pvvthreeseven
+ckqoneight4xqqnkdnzpggmxrmhkhx171nineqgd
+76nine
+6threentcfsvvfseven1eight
+23fivetlqdfhxgg312nine
+1pjninexlqnthreeoneoneoneightx
+6one1
+lfjmdhpj9fiveonelvfivenine
+4xjmxfxxfsbxgk9sixhq
+8six8vszdsslqntzjqxx8two
+4one88995five
+nskmvtzd1five
+4tpzxkbfq1vlxpvzbxnhqtshzhfourtwo
+7six341gsl77eight
+94dvc
+qzkmxqqh6sixvn
+sevenoneone26m8
+ninedtfvl3four15eightjtpfhlzzct9
+5ninesixtvvpblfqgb
+5twoseven4onedcsqj6
+gcbtzns6eight52ccvvpsbdgfgg
+tczvbfxfvcbfxzvvxp9three
+fourkczgcb9knnpkd3
+9ninefive8nine5
+tnkpsxjm7four45bpdg
+twofour1glkvvkq
+fiveeightfive8vbqtsmhjqr5vgbmsxrkh7four
+lhncnxngfour9five
+5six36five4
+74ckc
+lkeightwol11
+five3mnlbmsg2
+hmvmgnqlhdgonedxmjxxbpbpt1four6zh
+svmmzbbj5
+3l4
+1dgfnone17
+667
+1qlcg4seven
+756ghcxrmrgtninefivegvmtjhfrj
+6twonehjv
+vpgeight7twonlcfcdspmvpcfj6five2
+76jhj4sixeight
+vcfrscgccnine6j
+mhm8kfjl33ninefivethree
+85bfqjpdmbg92rjbthcrfgvcjzqhpgb
+nine554ltcgj5
+eightfivevjszdqkf96ninemgldmdth1nine
+sixq4pcczfqc
+three7two
+eight9csevenfour
+fpnnxvcttscfrgponefive8twohgfkhbssix
+smkjtzm72vmtleightjmkxkgpfzmjpmbbd
+7two1lxvqqzzrvj31fourprzmsdzbf
+kffeightwogzcqpzdbhfvmckxmbhrgvonevcshkbctbc524
+fcsoneightnmtgzbbnflnnlk5two
+6gkxbhgzbmltwosrmone1five
+sjrfkfjszsix49
+47seven82fourfhhfmlshdsix
+sixhjqszlc6kzzbqsldk
+nineptfourrvrghq7
+4four5one148jcbvnbj6
+ninezfcrvxfnjd6nine
+bfjfbpfseven7
+bdzmktwo4fourkrjj3
+nhnfv725
+sixeightsixkkndrj7
+eightone2m246
+fourhsbdblm74fourcphtwo
+khrjxxrltbpngsmzndgsjmzvgqxfhvkct6eightzrvpmpcc3
+mlsc4qnlhqjfour
+956onefive
+1xtmbmkscvv2onefivelvlztjtctz5eightnine
+32tmphhjnlfsixskninekjdcftm
+krgp1hdhgvgpgbvbxgfngvktwo
+klpnpcplfhlztjgv17six
+5dsxngmpdvjhnlbhxmp7xqqtgdoneightdvm
+threeeight3t
+5fourlpqzq2two1oneqlq
+eightfivesixnineeightfour1
+52ppqztdggqgtphdfz4fkrkfztzzqldpg
+seven7zbone
+xg79onef6eighteight
+three6nvhnqeightgkttsvtwofive9
+rjsevenonefllcrdnbmqcmxqsq38
+twoseven2dppxgmlhr61onenine4
+sevenb3btzhscqbrxxjkhtzpv
+859two
+threetllmjmhdjr18two
+94tmvfpzmgvzsm1fmbhkhzffkzllx
+nlkndffq2three
+6ninemfour8rbxvj6
+7clxtxrt1lqg5
+onefivegjnfzkvg9
+fplrvmqjdfxvjdfivesix6rpnkfour
+5fivetwoxdgchbjjrckntlgblsxlcznfd
+eight7fourfour
+3kmtjlfbgssixmspkfzrgxtctksix4onetwones
+8five15sixthreeljsfive
+9lnn
+nine7pzrxnnkthreesdjxphsrf4hc8
+three6115nqhllcmpmzcfour
+vpqjnvmltx8fivefive
+vrlqlj5fivesixninebqhgcpgmgkmflvn
+76eighteight7
+8qkmnsjxbfhcpsvn4
+oneninexqdseven4threefive
+rpcvmnng162fivesixseven
+31628eightthree
+83d6fsfqdghztwo7bmvrlh
+gknfcdqlrs25
+9gkkth2ps
+bxnvsjxqleight9ninenine
+rsmcrqlnhsmjhspseven96vsckknrggbjd4tgtgbkxgvt
+8seveneightcxrh
+tkmfour8fivevl9one
+8mgrxk
+fourbgckqkeight6f
+threetwo3eight652pp
+ninefivetwojbhglxfxzfctwo8
+jmjtcvpsxzdbkbqthree1qmgznpbzlthree4six1
+foursix5
+6nbdzdlmqpdlgpcclc
+24
+pseven3threeeightseven
+7nine7gjdksbtqrrdsr
+5ppflb48tkcffone8six
+five2two7hstbbqzrninegbtwo2
+eightfblzpmhs4
+fbbdeightzzsdffh8jbjzxkclj
+3nine6five1
\ No newline at end of file
diff --git a/src/day01.rs b/src/day01.rs
new file mode 100644 (file)
index 0000000..94e535c
--- /dev/null
@@ -0,0 +1,86 @@
+use std::str::Lines;
+
+use itertools::Itertools;
+
+pub fn parse(s: &str) -> Lines {
+    s.lines()
+}
+
+fn calibration_value(line: &str) -> u32 {
+    let first = line.chars().find(|c| c.is_digit(10)).unwrap();
+    let last = line.chars().rev().find(|c| c.is_digit(10)).unwrap();
+    format!("{}{}", first, last).parse().unwrap()
+}
+
+pub fn calibration_sum(lines: &Lines) -> u32 {
+    lines.clone().map(calibration_value).sum()
+}
+
+fn calibration_value_corrected(line: &str) -> u32 {
+    let line_chars = line.chars().collect_vec();
+    let mut first: i32 = -1;
+    let mut last: i32 = -1;
+    let spelled_digits = [
+        "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine",
+    ];
+    let mut i = 0;
+    while i < line.len() {
+        if let Some(d) = line_chars[i].to_digit(10) {
+            if first == -1 {
+                first = d as i32;
+            }
+            last = d as i32;
+        } else {
+            for j in 0..spelled_digits.len() {
+                let d = spelled_digits[j];
+                if line[i..].starts_with(d) {
+                    if first == -1 {
+                        first = j as i32;
+                    }
+                    last = j as i32;
+                    i += 1;
+                    // We can't skip an entire word because of cases like
+                    // "twone", "nineight", etc.
+                    break;
+                }
+            }
+        }
+
+        i += 1;
+    }
+    format!("{}{}", first, last).parse().unwrap()
+}
+
+pub fn calibration_sum_corrected(lines: &Lines) -> u32 {
+    lines.clone().map(calibration_value_corrected).sum()
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    static CALIBRATION_LINES: &str = "1abc2
+    pqr3stu8vwx
+    a1b2c3d4e5f
+    treb7uchet";
+
+    #[test]
+    fn part1() {
+        let lines = parse(CALIBRATION_LINES);
+        assert_eq!(calibration_sum(&lines), 142);
+    }
+
+    static CALIBRATION_LINES_2: &str = "two1nine
+    eightwothree
+    abcone2threexyz
+    xtwone3four
+    4nineeightseven2
+    zoneight234
+    7pqrstsixteen";
+
+    #[test]
+    fn part2() {
+        let lines = parse(CALIBRATION_LINES_2);
+        assert_eq!(calibration_sum_corrected(&lines), 281);
+    }
+}
diff --git a/src/days.rs b/src/days.rs
new file mode 100644 (file)
index 0000000..c1a501e
--- /dev/null
@@ -0,0 +1,13 @@
+use std::fs;
+
+use crate::*;
+
+pub fn day01() -> String {
+    let input = fs::read_to_string("data/day01.input").unwrap();
+    let lines = day01::parse(&input);
+    format!(
+        "part1: {}, part2: {}",
+        day01::calibration_sum(&lines),
+        day01::calibration_sum_corrected(&lines)
+    )
+}
diff --git a/src/main.rs b/src/main.rs
new file mode 100644 (file)
index 0000000..7219d65
--- /dev/null
@@ -0,0 +1,72 @@
+use std::time::Instant;
+
+use clap::Parser;
+use rayon::prelude::*;
+
+mod day01;
+mod days;
+
+#[derive(Parser, Debug)]
+#[command(author = "Greg Burri", version = "1.0", about = "Advent of Code 2023")]
+struct Args {
+    #[arg(index(1), exclusive(true))]
+    day: Option<usize>,
+
+    #[arg(short, long)]
+    parallel: bool,
+}
+
+fn main() {
+    println!("https://adventofcode.com/2023");
+
+    let days: Vec<fn() -> String> = vec![days::day01];
+
+    let args = Args::parse();
+
+    match args.day {
+        Some(day) => {
+            if day >= 1 && day <= days.len() {
+                do_day(&days, day)
+            } else {
+                println!("Unknown day: {}", day)
+            }
+        }
+        // No argument -> execute all day problems.
+        None => {
+            let now = Instant::now();
+
+            if args.parallel {
+                (1..=days.len())
+                    .into_par_iter()
+                    .for_each(|d| do_day(&days, d));
+            } else {
+                (1..=days.len()).for_each(|d| do_day(&days, d));
+            }
+
+            println!(
+                "Time to execute all days: {}",
+                format_micros(now.elapsed().as_micros())
+            );
+        }
+    }
+}
+
+fn do_day(days: &[fn() -> String], day: usize) {
+    let now = Instant::now();
+    println!(
+        "Result of day {:02}: {} (time: {})",
+        day,
+        days[day - 1](),
+        format_micros(now.elapsed().as_micros())
+    );
+}
+
+fn format_micros(t: u128) -> String {
+    if t < 10_000 {
+        format!("{} μs", t)
+    } else if t < 10_000_000u128 {
+        format!("{:.2} ms", t as f64 / 1e3f64)
+    } else {
+        format!("{:.2} s", t as f64 / 1e6f64)
+    }
+}