chore: setup folders for aoc 2024
Go Bump / bump (push) Failing after 9s
Go Test / build (push) Successful in 38s

This commit is contained in:
xuu committed 2024-10-26 11:38:44 -06:00
1 parent 50af2114d4
commit 3c9af95ec4
92 files changed
+72 -1

No files matched your search

+4
View File
@@ -0,0 +1,4 @@
1abc2
pqr3stu8vwx
a1b2c3d4e5f
treb7uchet
+7
View File
@@ -0,0 +1,7 @@
two1nine
eightwothree
abcone2threexyz
xtwone3four
4nineeightseven2
zoneight234
7pqrstsixteen
+1000
View File
@@ -0,0 +1,1000 @@
xt36five77
two8five6zfrtjj
eightthree8fiveqjgsdzgnnineeight
7chmvlhnpfive
1tcrgthmeight5mssseight
eightoneqxspfzjk4zpfour
fdbtmkhdfzrck9kxckbnft
9six9
goneightczdzjk18589
41two3eightfscdmqjhdhtvsixld
t8929
fourtwoxsxqqmqf3sixfoursixmmjhdlx
bcbsfd14cjg
95three6threendpqpjmbpcblone
tdmvthreeonefive8574
5eight82sixtwonev
ninemg2shhmsqh
thmlz4
xtxjmm2tbbntrmdqxpkdjgh1vzjvtvg7nine
vf19fourddfsvmzeight9
mmg6fivegcthdonesix1eight
7rzzdknxtbxdchsdfrkfivenjtbrjj
2sdzxhxp
vzvkjvngfjsxmponep9jppnqnbt8jtwo
85fourfivetwo6xvhfxone9
fivecgtwotwo3oneighth
pbmninesixzcqs5
ztlhxfmr4mcjnd3two
nfr27zdxchz
sgljlqlcxsnjgppxgqxppqszzgbp7
five78eightthree
mleightwo68
threemnnbjncqq68fourmjdfqzqxbdqvfftggf
twofive35llpqrhptnv
pslmgrznfzt823sevennx55
72fivesevenvnxpkoneightgdm
1sixfdjtgxbflfkvv
77three9
five6skbsrr
fjvlsthreeffzbjlsm2
6dpkrlbxfdv5nine1499
jvt9one28nine29
57pbgvccprdgnine49three
qmthreekcsttzmgd1nineone7dvhsjg
eightqpfhvqnpbbrbmsz76
vvqjsevenfourhmdn45
2eightxgkdtdkfbtcjgrlthreefivekm2
rfpklsh1threenine
nrhbjqpxssmqbkdbzg2
556ghndxkrg9
3six8
zhkkgqllq9eightninebspgktnh1krfbzdcthreekzxzgszgpd
933five
sixsix5qmbqd
7sevenxckssckcrqnpmfiverqtcdclnkzpztt
5eightpdsvjknine813tnz
k81one
6threegsx48
three3xbqvcfgjjfsixfiveone779
threenjtlxnonexqhv1
5ninefourtwofsqdbchtpkfiveninencsdrnvnbf
vdveightsixthree1
2mrxnnqngfmshdz
qfourmjpltwolblkzlkdfr41vmskjgrqkv
8hbjcnseighttwoseven
28lvggdhbjgqth
nineshpzfshzm68ttlqbqxxrvdxrkvdkbcnfdkrhcqpqrfmpxtwo
9hhfninefourfiveczdbrn1
2dpzvd39eightwohjc
3zrhnzvq79fourxgldtbthree5
two1716
bgkfjkeightsevenf9gclhlprxlk3
nbf2rdglrfourthree86xfpqckg
hslr84mkdcqpl3qtszqfngthreeonenine
7bhgqcphnb2fpjrbvrlstvghqbkfive1
6lkfdcddkbsevenxsixseven2fsg2eightwos
3xjprzkdsckltdone
1qbkshbrcddjtjz4jhrdmpnrq3mmfive
27five3sevenfourjhhv
5fivevhkttflkone4
5jcthxvhglfourkjrhfour
3lbgzfkljfzkf3
9tmpczsvskqqtveight1
kfrjhgsixfive9three1
onesixpdf8onethree1
onesixnine5
1lscknhb
fourhrnmcfgpzffhdtbdcpdbxqh3
twoffcbgcjnsix667
sevenfc14
8kzzrbz2threecclhhjn1l
kqqpzbbqkchmkdl46twothree453
8two3jqxmnz
eightpszqltlncjpfrdfzffltnthree4
eight8eightsixdcgqnbvt1lbhlchdzkf8j
64nine
3twofivetwosevenfour9
lhlntlsixtwojqhsevenone74
2242eight865p
dnhfbgzcvsx5krv26
szdnjvh9
hrzczjbfphxvjqs8one19five2six
lvvkjjvgcjbkhbdnf6ninesqgqhthseventbkzhjbnrb
crmcpjhfmgeighteight316
vmfqlrnjjnv7fourkqbsfsnnqxfqsixthreesix
7sevensj9919one
hrvtbr2lqkkhn25three318
rngggthlrfoursix2twopv
3srcpjlqt43eighthscbffksixfoursix
885sixbftpfive
qpfkxbqfph9sevenc2
9zrtbhztseven
5bcgdvdtzjjbseven41nineeight
two3szknm
klfivethreenine2qdpbp4eightwoqf
1b
8llkrslcbcsfivecqclmfrxbkzfive
twoseven1
six3ninefivehtxjqjgv6onepkfgjcczft5
oneskjsh5jmnhsxhfoureightfourcml
thjptkn9rpjkbkvgm2
glpbbfjgfivep1696xhcprcqxone
5fivegnsbzt8gtxvhfmt46
fivefoursevenjkxqlcx7onenine
lfourghzdksztjmfour4threepdnfsz6
two7one
1onesixdzh
7ftphkqlonesxsrlgkczjthreefive3nine
62ninefivefkbmhvlltfourtwo2one
rgoneighttwortjczm24seven
chqxcv3fdqnjngqkkkrvlcgtdfdsvztx
three2dvfpsgjfgs16fmvninefourfrvg
five4bgbfrj52
98sixsevenfourzdsfjddbmbrffkt1two
nine9xhkcmmvb81onehsmxclb
6146four
slmhsix4hhtrdfdjpk2fiveonec
1oneightd
86sevendgdbnrvgjnmtxrmqtt
six56three2hslccxbnzpmbrctd4
seven8nine3fiveddvpdjgqrjtwovhbdmtz
five32
769three1
mdcmrbj19
threethreevc6bknnspdvbfzsevenghqnkxnhfxjf
sevensevenzvqkvvgzn12two9bfzfpxjhfslqs
8mmqrvzklbfivenineeightwohnp
zngczscnv8threesevenfourtwo
695eight8szhqcklnc1
sevenjvnfbbnnine9ninefour64two
four5threelqtwoxhvhjnkgz2
ztnzbgmtdtwonineeight3
twosxfour6xsshbnhsixsix1
threesevendmfivesevendxhsdhsevenqnrvfrgpfl5
71dbpsk4
eightxqzh1clmrdljnxh
jqjthreetwo3
23sixhsvmstwofive
mhvttrxpllkfpxzcfvjtpkfsgd21jtrcrgp
1lcqlznsbdzksklm38frfhdpt
8vjtzvxvfive
9xbcgqhdclrzdnzspllpfrqhnxztftninethree1
seven5two
fourj5ldxlnine
sixtwosix73jjtrvt
9qqbmccrg8xdgcqmnine84
fivedmsdlsfour2rmjxqthxfcsgkqgsxxqbtwonesj
one631p
6x2
93nptkkseightkkgnsnqkpfourone
173
eighteightvzvxr2pqknnccxqkznc
ftbsixnine4
fiverpz9ldmbrqhg
7pzbjtnqcfour4319eightcxpgl
tchdxgqsqeight8ftllckrz1
kz2five
scgflstwo6zzdxdcs
535svzdxtwo4
7fourone2
kqczhqqttf74seven
ninesixnttqqzmdg264
sevenfourthree2one9
eight1rnnsppqbjzv7jknltmlb2
6eighteight5cljzvzdtqq8sqftf
ninebnpxdqs1
seven2nineeight
hjnnqsnfftjstkrlknvlqlkfsdbgz8
rcbhxcfmkc3ptnt2
threesix378twostfsjjvmnseven
hllssqjbc41
six9zbkrrvmxngjone5xqjbxcrkhzr
nineone57
3pls
sfcdbhkdrpkdrtxtvlkqfiveqvbxhvm8
fourthreemeight7nine9
five5fivesfnxfour
h3two2sixgkninetwo1
53ccblnvbqhjxgbxrs1tk
twotwofxvcmsld2zbjlqzvgzkqvnthfvsftwo1
eightninevdxxdglskbfzz8sevenfour8
flhjjt6seveneightlqpfvnpxvthreesix
threefiveonegpcjjvv6fourseven
9pbxlqdkprzcxp
cblkxjmpgrfk5
qbntftctnine5five3bsevenbskhvtm
7eightsix3threehzn
5nhndlxkthreeseventwocdvnhzrcszhd
six5onekbctwo
fivezhtlpveightvdfltnxpvrzmczdzb9q
nine9xsfq8vtdpmcfgm2
onesl8mqzgdrstwofour
4onedqtrcc58ghlgxqjlbv
132zvtptdrqt
ftwone1tkzzthvdsevenseventtgvqnbzf
prxrsfvdbt73zblz6four84seven
onefive1xllptjtwothreehsdlgrmjssfgk
twofiveeight781mgjxgzlmgkv
483fbgsx5
four82onefour
229683five
2onevncxhvscnbtngbzlbbpdnnntr
275cpjnine
j4threefour7dzqleight
ddgmsvmfz7brjdxt5
sevenfzjtxjtbmj8fivefive6
tqprcctwofive8sixzmgvphmdsmjtwocbpqc
sevenseven4fourbcscfcprcr5647
tghsix8
two83six9sfp99
fourthreefive3seventwo
7threepx
oneeight69sixgdzbbmlsh
23onelrdvbzljtcdjqckntwo7
six8onefivepgs
83gnxnjgvdr2four5nine6
lgfcvptthreesixthreeeightthree23
seven8gsqznnpb3
dqr478fivezxtwo
4cgkjbl261
pnjeight84twodnhh4
zeightwozhxshspt45
8rzkpmzlvszvdvonesixeight
twotwothreeseven95threethree
sixbr293sixthreesixnine
3sixsixthree9
q17ninenineseven8
jmhbhqjxvc72qsrhzzpnljeight775
456jnrtpfseven
gjcbnbdkt94dsjrgdq1
five56g6
rvjq8dkngcfjdd
twofive43
sixzz9threektkqmfq4gkxxzbg
2four7four
four3eightsvmnfive6
ninelvxcxdrxk1mvhtptlpqvff
qrbtlxbkdrjzkznqp6
z2xdrtqzzrbt9five3five5
twoeightsevenfive83
73lzgb1
oneseventwotwothreemr4dfkjlgshjzvlxqqoneightvvr
5twonvhrbtgfxdlvxrgnpkeightzjpd1
twotwo6rdfc
six84sevenfschptts1fg7
8kzqv
hnbjfivettpzkb8six
nine8zcrzgqntworxnj2three5
1qbjtsqqrttwones
gnjmvqrhnsfive5prbzfsjteightqgfcx2one
fivefour8btcrpntwo6oneeight
kfxbxn4283kcjpkbskshjdss9
3threethreeh
bmzjktnnrl8fcmmbtgzkj
vhnine84seventwonine
gq639rhqlbzp21qbseven
6rnineptdmntjsix6cnhhbcn
sixscrdone3mhgnmflzxftwonvkxvrftqcxzcfhdgxlvreightwos
6nine6gngneightlvqmmjjtdkrklqbthffhtwothree
bsn4rrgvrjdddhdfsvsffbqnrsbvtfive
twozflqcsix53jcsc5twohdeightwofb
73rx
xldqxlmfcdrnthree47tz6
foursix6ksrzponeonepdbfpjzspp88
czvdzccj9nine7
92one
9one8three
onevfzkmmcrtwotwo2five
8eighttwo6xpfxtvvpx
83four9
3fourdmtqtvqthree2ztvvdjzmfc
8fourpb7jjlcbkxkxfthree44
9cchfourltlxpbjpdrdplrqgrqpk1
fiveeightxlxmr5
bgrczrdsfrcfrpkprdncbkd55qnhjnzkbpninekbmgnlqgmxfqgndc
6jhcjhb57sfive8oner
six6twofive3ckthree3
xfxkfourtwokqcpvhzjjzsrxjm6
four85
p3foureight3rl
f6four2eight295
1onevonelslgmbq
pzj6pmjone94
bkmcjnllrmcfpmqckl3fivenljfgeightvrjfb
kgsczqtwo8qnjhtpfltonepvfive
fourfive5pfnlnjqd
vgrsfxtkcxfstsevennine89
njkblck4phphvmq7
ghflplsgkljsfk5
rtbm32lntjflptp435twosmtb
45four
fiveone41pqgcjt
threesdnllrxbxmhtcmjvdktqqkzs1
5one14zmxblkh3
4mzzqpmsfour5pnzonerdseven
9bhcxsnxdv7
twoxxjnsxxjxfnrtnknseven29c
four54gkcrncmjtpvfbdqr
mmvgl8onekzq
tprfvqnine54rqjkchkxtcrk6gxjgbfqpxg1
threeghtxbhkkrvxxcrvslhnvczxnine5four4
bkrkeight4jvjvmnine
sevensevenmphmhvhtjxcdcrcgbdvlmcr6mczlh
eight74seveneight5eight4one
bspq9fiveklkbeighttwo
51four
sevent79zngvzhhlxjrnrbkvnine
six3threepsjhtfoureight9
44mvfhcthpbv
3fourmrdzqlvb63hrzhqxc
7fivesixcnxfourpfour
csix4
qqtjk43
eightnhqpxttth9ddbfjpqjmfour83three
slx6fdm9bspmbxdqjfmkhr
stlxrvseven1gnmnqrnlthreenine
56zjfdrb
sbcxqp8
7eightsix9eightseventwo
7twosixfour
1eight6
twor59eightfourkpsix
571fivefdpntmjqgnineftpjtkh5
two7nsdz
pmf5twoseven4prgqz
7vfmvlgtvkbxnq
eightstdrhhtctthree61fourbmcvhmxtkdhcltxpr7
fdjcssixninetdgtbkgj4snzpqlninehvvkthree
122pqtcthreesixeight8
hfztkh2ksjnj43nine
sdlnm59onekdbdrdksixktk37
4mf114
8foursixninetwoxbcnq
vbhspqrkvcvpfour68xncb3kdbr
eight841
2fdr7fivehtnvbk7nine34
eightsixone1qzp4nxzrslmzrsix
two3zdjntkkcmdpheightfive
44one
17txlqkttvtzhzkjeightcqtpqzxlktxm
two8xcvpzppmzntzr
pbqeightwoncjsvrlzrkspcnqsrrfivefour5
9foursix1onevflhjngtthree
gp3qjmnsksn3nineeight4
39fdsdqonefleightwopsp
2dfzsfssnpbzfour
stzzclzgskgbztvrfqgbrms6
5zpq81threegdg
6three9ninethreeeightsevenninehhgqhxfhlv
1tqftcgtwo
zpkrjxfpzf5jmpqvxrgp6threexbjlzclxpneightscbrsgnine
two4bmlztrzn1
seven9klmsfmjtjr7sph
sixsix4
stldx46three15four98
gthb7nine
lninethreebrzzntwo4
6fvhgpqj5sevencgmm
75two7qktbnpcxtk
fbkzzsixgshhmzdgt9
xfivenineseven1dtzsfive78
four3ptvfmkkhzjsix
j9txxgmsvxx
seven9lmxhzthbnbbxjmbqkpsntbfourone
712fourlqknine4
xlpnrk64qnjjvszbtkgktbn
lznpdmrcxmzhsjqkc2cjm3zcx
615sevensix
phgjnmqfsqgjtqvzhpc3234qpkpjmxbfr
tnrtmcdljzq1three62
bcndkzgzp5sixhflsix3lgc
dqgmbkxlv4onetwo
freightwomsix916zrcsjgkktprb91
fourbcmprdvkbl9vxzfkcjfsqdlbndmrsq
sevenninezpblthreesix2threeqrcdpjqjgm5
5jnnine
j9fivesix1zhplxlvxsninefour
dm68htnmqdsnzjvqrrj
8four9pfvjjhrbzmlvhvtseven
two256six6qdpldblvleight
ninecprgdrmc2eight91mggqdvhcf
sqbccsh81t
1twovfhbngpggbgff8eight
bxdstkqnbhkvt2three2fg29
one7threehxcttwosixfourpx
brnine1nineone
6fffrqfjprmdx6sixseven
7four4fourx8sixfour
951seveneightnine
fivefoursix5tg6dpdxrckdh
829schqjxjdxncs6
seven1twockldvjsbeight
csjv58dshcsdrkgsixrdl
nineeightstjnxcgzbxrldsevenfour857
oneqpndxmthreemnmlnqnffv7
twotwo8qkdfcxvd253bhd
sevenfour3
t2sevenfgmjjrg63fourrvlz
4six9fivelbkzffrvsoneightxsj
nkkdsbp7kkjchhfckqqxfourthree9
7eightone4fiveninevxtrmbhfbrone
onemjzfsvsbh2vmsxdmcncjlnvtsqszv
eight26
sixseven7four
cpkzctmhpmpgtwoqfeight79
vplxpx9tndmcpsone2
eightone2bqlmdmf
8sevenfivetwod5one
fxmhpcdckl5czfcmeight
9216gdptpmninetkfjszftzdfive
ninefivemrvmdt5nshfxgg5
9qclonefive91
six28ninethreefive8two
76five
njdtpktmsqvbfourv9mmonesix
5qxckljjpninedstsfdthreevfrsmtn3
tzrrbjlbq7eight
bzl5
3eightsrnlmlvhtwo
vthqnine1zfive2six6four
cseight1oneone
mgnkflp4grkdrrrtfzmjkbtblfivebgcrmgggxjgkm3
5three1vfrseveneight
seven42seven178
8bnrrzbbvghcqdbtwo
fivegxdzcmbzsix6sktwo2dp5
xqdtmb2sevenxpvdlfsqqkgfxqjqq8468
rscsljnnkd2seven
mzeightwo49ngtzr
threesk3four3five
7shzxkjkgrt71
nxcnnmkqgv1mdmxtkjtwo9bhbbfive
kdxmcg578six7nxqqbm4ddsxzxmtkq
8rjdkmqfivevpfthbjkbt9mnine
5pxfive
hgnfjtwofive2fxxeightmx
pxpqvld69
onesixtxmxttxqfour1rxfrvsgdsveight
95nine9onetwo
48ftnmcxrmxc2vqsgrsqskzs
one4threeseventhree86
one9ninensqxone5zqfvmpd6eightwozgb
527two3croneeight
sixzdzfour291eight
5vzlblhll42hnrrrjj
xzdkkpseven9one1vlsixfour
4tbzbrthree
8hceighthtd
9four4
eighteight7eight6hfthree
6fourbbx1
5onepfzgneightsixxb
xzrjpnfvxr61
two1ninenine6pbhkzzgjq6
sdltwonecbbffldnfdlkh131ggkrqqg
kxrzqltp3vfh39
nine79djhzhhgxvglg
5four1one833
1twosevenseven3three
4nineseven
three42kzqllpf
zkxflrctvsevengkpnqkrrj2
6oneleight9ncnmxbrnkf
qthreenine4vpbzzzfnine
792
hjmn85vtfjgtqv
one3sblncblnvf
ssxxddpqbdznrczqgsix64three4
2four4fourtbeighttmm
fournineeightfive1twofkjcsrklpxlsdvxnt7
lrlzz8eightmpspsk3nineseveneightnine
v4
eight9gfzone
jscpppmpnfkhcxlj1pbtbltmj6one5
8nqrmzrbvzrnine
two34m73twoklqqdlcrrh1
7fourtmpxnf
twocpbznkqnqsixt86
81sevenfsdldftgzvnhhhf
ggntprxxqrpknineeight8fourlmvsr5
sevenztwoseventfour7eight
fkcbvhmqqk1sevenseventwoseventhree
three6ltvtkkhgdpsixsixsltgdngvrttwokz
2fourv
c29fsczzfiveqmrfivejbglcqhl6
4two3
nine2kphnrztjltxgq1sevenone
lpbcgone8
vcznvhllrbfx4275
fhlsdjmppnrgqhqqxt921
4four2sqzzcvh
19nbcvlmhlkqfshhckzkzpqbxfour
seven19
6xprmkgfgntwo4bqk
threexf5threefive4
3fqone
5g2x68cfghcmtwo8
1fourq
pflnjchgnine25one5eightxvjkkxb3
twontnqpcqc17
cxdmgmvmfssevenone6onezdmnltchtnfour
cpcthreeb76zlglhtkdxrlxjsevenzmvd
sixbhjbcpfjeightjcdthzccpzeight1kknxfck
bhkplfzcdqdfsffcone3seven
ninethreeqnxmgmjct2
ninexjlfivelqznkhngnsvnqhqsqdglsix78
9zbqrkmvvnine
1ninehqtmlsd6zjmbgbhjm8
fourvmht91nine551
8eightmfgjteight4one
6eight1lhfhmqvjsixjpdgnjrzzbtbcgb
lxptvkmftqffksixtpfnvkxzvkldfpeightnhncz6
lnsvgtjs2nbsqbkjs
8twohtdv32
9cbdbvvmninekzbrfchsseven1
8onethree7
hk7fourxvqdqmnsdnine
hxbjdsk1vkjbsqn6six3nine7four
485
5four1kmbcxhjseven
2hjfhtmfg3sixonetwo3five
dvfk7sixninethree
onesix827
87seventhree
twosix16lfdfkxbmbcfive
1mssxhvgvmxfoursbjdnbrts27rllfm17
rrvpckn9fourgvrhhzppncrqqml7keightwop
knvmsveightxpbmxptkjbtmzzn3pzbl
47eight1
815vd5gnbgone
xbclfszchvone21
7ttwofourthreehjhpjmtwogrng4
twothreeoneseven9qd66
9dhbgmqgr7threekfhzkqqg
fivekvxpqrkkffc6mjrpksfcqfln9
63two97
txbn163qkbddlcgdznine9
dztphkcfnnninekjqdb89one
mqvtrtz9
7hcnmcs
foursix7nine
sevenstm9gfjvjcnmjnnhbgmrkgkccsflm
two2jgfqdmlkdndmsp1rqlrqonel
eight2qfive1oneqjnine
mtnxzx7tthreeshdxpcrhrk
vzdgktfcq1xtfxqzzfdpng693btkcqhxpsmczbxq
zbvgtnzmlghvhnklhmhjnxckone4six
98eight2seven3hhbxgvnhbg
seventwo7seventhree5ltlptmhjp
1rf75fivegx
2nineonemlhxmhdt7six3
nine6sevenlzndhbnpkxdhdtcqpzgvkskvjkhphpqnxl
qnqpnlxcjr3phkkpnccxr2sixrslhrtf2
12mrkvqsjdcc47six
onehhdveight35jgnmgvqgxdr
hgoneight5
m9eight384eight1
1p6
3sixnine41seventhree4
5dvssdf
blchhcfourgzvssbhqdxdbxt14zvbknhnll7
7twotgqrxddm5
btlkbgbtwotwo5
five63ninesnqx
fivemkvjpslfoursixfivepjvtx4
74threeeighteight6cpbxbqgzh
twoeight7bh
rgtwo7fnck7
five4sixnvjtcmx12one
ghqgdfour33
tjpdztkfour666dxgzjzlgnz
ninegnqrqpbrz8seven7sevenhfbone
npzlpklnvgone6nrjcpz8
2seven6m8
seven3fivegqvxgrjcnine2xppl
nbmvdgk9grz4
four291
tdnfgkzkxbfpkpcthreenineoneone1
7nineflqptxmdjgttpll
one1jnhcvthree1
foureightkxfcqlkp2fclpr8bzxtfbl8grdsntkrst
six16fivezqbchmjbb
zjhkd5two8
745shv
l64dqvsixthreethree
rffrrmjsfj2jblgqnl7gjfcqtszfour7
fcqcmchhc7t
twofour834ninefpvbvps
gmhhjr94svpddnmxvd98threerlljccvq
ninetwosevenb71three
eight4xllkpmjkrp4bv
zhvzsfourrkflmjpjhfourfjbd32jkvrpzqg
2frgbkngmsix9stldncmsczh
eight9three42grlbfps85
1lrshxpgxlsnrlfjlxk2
jfhmhcml8mvbfkxhmoneeight9
five8sevenlzvpzpsbjfourseven1fkcfdf
4vmldcjpbbsnfourseven4three
mfchhbqk7bdlrqhone2fiveone
hnncfrgmnkg5six
dbone55seven
geightwoonevhxbqbpfkx6two67
sixcrnq1hnrsttfxvjeighteighttwoone
fiveonetwo7six
9nqrmt5n9fkpbhd7
two1fivesixtsrq
684
ckbxntxfhthreefour7sixseventwo
stdhzqdpnxnine6tn7kjxftfbksevennhfxznjxgchm
8czxhfptlknjlhn5clhzdfgntx741
3nine64vvgsfour61pzb
rloneight7lfrfqqb8fivefour3
vnhbtkbqone4sixsevennmrgmmptvreight4
bdvjp354992jgfhzzvhv
fourp1
five7oneseven
oneone954threefivesixsfr
sixfivevmzlzdfjvq5
4bs
threetwo64ccks3
onetxqh3ljpnkr9onegsmkq
five24seven6threethreezfqzgzjztgntkcfzt
3fourv2
eightoneeight6qseven47seven
559ninexcdkqvszsq1
95sixthreetwo8fourthreesix
ksxtrn1gqxthvxjltfivejpmgvz8
ninezdkfvgceightnine7sevenfiveeight1
h43zktkckcjrg5nmzjkrzmjqsix3
44pqlgmmzvgzpslmnccdjlvq
4threefoursix87
92gnjfsxzlcn71qzcbvq6nhmgsvmbrvvjzqlndhl
hkmjkc9fourpbgjlvqxhbhnzvmlnfrqsixsixksix
mspbpsgzn31ninesix
7xqtttthreegr4fourrbflxfznfs5three
rtpknqgsix7sixthreethree1one
qqlqh8seven
six11eightkh73one
eight9mjzpmhcr999fourfive
fzeightwo7smqq
7dzzxnttq
4vfk9
ninermjmpprxmsdgrpgzmmqtjxkpfour5kscxs
h5lnhnrqhvltpsns
twosfdsxcjjhg871755
1one5
933zdzz1five2
4zxh9j
bnlmdd9
nine4xchhpgnfjtwohggvlkkxthznnf7four
3foursixhmsddvmqkgpjvone34
bjfxjlseventhreeninesevenfivethree9
qhqgxtjvslnvbvjsixjplmfq8
8ffjpthreerzkdjkjjzxvqkspsevenfive
3three4two1
fiveldkk7ninesevenmfnjfjmdgeightprjrq
4rqbz6eight3lbgbpgcveightthreefive
sixdsmvltdv2six3fourxtkzsvjdbvqfmthree
3one2xgzvczlxvfdpjqgninefourfourzft
sixcnfznvcb8four
3threethree
trzqdpslthree8
3fivefourninefivethreefive8nine
1sevensevennineninezmghprscjskqppgmh
6zfoneqkxhxmtwofour3four9
twosix6dxftmjgclkkmzxmkglmqvsrtjcp
ninejkbk8v5fivefivethree
9twoneqv
1cq51lklfoureight2
8sixfournine3one
5plgtszkt6856six
qoneqjph11hgvhhkglsreight1pkxrltrzm
nine25mlxmkmcg4xlrntfsrrxmlhdtzt1
fivetfdzmsq2
pdhnkbjrj5fiverjpgmntqkpmx
fourvgc1msdnxrbpbcjfive
14tbcfmjl3sevenvj
ninezrcfqvg9
5eighteightkkvtsbrkjlthreegspdm
99four5two9
pvlvjvhmg5krzl149sixtknbgfsgvf
44tvzgpz1
8threenmhmptmshpcsix
5rdjmjnmkcd
ctwo6
two1dhtmsdtsds
ndjd4sbzm5fourseven82
rfqsxkdhcr1twotwo
4qrt5threetwosevenffjdvtzhgfd
6421
sjgfshzjg5four
threeqpvpvdhgjhpgqxsrhhp5dqjqlr
five7ncchvpcfmglmfzstrmvhfnqndzrmvb5
fvnfmcrh684bjq63dxnnlznrn
threedccxvrtbj62bfqfzlpxms8five
893shxkgpvpfour36nine7
dtoneightbrmthree6
6seven58nine1mgqqtzfsszlrgghmlknx
four64
five5dklfour4
lgv2eightvcp
pnfkrfnncv3lgqlrznone
sgcthreegxrnfkpb731
8twothreetnxlmjtwoneb
txkrmcklpdhclrklxz41lhddmkp
rqndtwosixq8
btbndntqsllxc6vzfrdqm2sixfiveeight
rhvfourp1seven5cxcc
jlzzqkvfxqltgbnj1
24szksixthreeone62
2fourfpmjltjnqvgrgxxbggtseven6qms
78prqkfbf6sevenfivesixeight
drtwoszsevenckqrxfseven3sixseven
zbsj6four
hrcxgvdbd6
six9three4onefournnsxgvjtrdthree
441
fjnjksnvgjznxflonetwovcnmvhdgjfggfvxmmg2hppfcgjqv2
kjszbvrcqznbf4eight5four
twolmbrdmx8kpltmqznslfsixsix
6bjrfthk8
gmzzsthreensrx3
sevenz63xlscxeight
fivehmrcphp7nine53
fivepmqvjqllgthree5vkpn94nine
seventhree9sbklvfvpsixr6
one56six
pfivetmqrbqxccpxsbcc87five8
mtmnvlhfsix75ppk9rrqzbbplmbseven
547mmntlxflkztkkftxkrrk
5four9threelcqlsrlvg2
gglpjhvjnnnrcbj3n55
xgdbjcrxdf5jjdfrrkzkdzpjkrlstwogbzcjq
cfmgxkjcfq9bkcpkrpltp
fcqkjhqgpkthree4sixthree84frmfqqkrs
onetwosveight68ftgjft3four
jvlmg2eight3bdptwo4sixseven
three1bhdkfnvt
6eight12fiveseven
onedbxgcqnltfour35
sxtwone5336psninexnrjsxsix
four79one47jvmmhhggcthreecgkxhnlm
17eight2fivetzcfmrlxvd
rxlhkjlm778oneone
8one1one499nine
six2fqd
9smpkfchhzn8seventrpbvcssscseven
nbmqctcldmnvnbnzns9twofive2three
1five1two
89brvbgnine
vcbrztfjzn4
4fvmlvxjd
lsixoneplt7two9
kphbsssvsnjgjnvqjcbh2nkmfeightseven
three4xsrmfldqgpqxbpsevenfour
rzd8xzmcdch
bjffone41xzone
xkmhqhgr2lxpv4jnsrnfour
31cplcztdkhsix
6tkzzqqckvdlkxrfourrveightwoch
26vkvbdvggfcsjccrkzbh
3nr
ninefourklmqgsix3cvnr
mlnzksvhnvvbxpsfnspl6hpqkdmg
btwone1jpgjdmgbfive
817sixqtvhxpfglj5kzmbtwofive
1tworcsevennine
xseven69six11
four3sevenjmgqzf3two
mbrfzsj2
8xgsdninefourseven
six14snscgfnconeeight4
seven4fivefoureightfive1
threegjgdnqvhqlbdv24fivexdvpdthree
9ldkmtzghbtwohqzzntwofive
fourxh8
eightfkxhflcone3xscqdqqkrk
qzlbtgc2sevens7
rfjgmfbjt185hztszz111
pxsixssnfgtfour9
zxflhgjnmbgfdqtzs4twojzxbrsix
7cc153fivel8
bzoneightlrvmnrh98
threetwogd6bhdkrjhxt2three
hlrscbd8rvppfclqdtseven
twofivelbjh3gbnbdbpthtgpqjmxjlmzjq9zqll
2fczpbhqjqfgzvzzkqgmsevenone58three
fourzvmlt3sggpjzssljc8twoeighttwo
ninescglkgftppbm187
five1vll26two
czghbj5827
nine7threerngqxk
four5bjbhfglffourseveneightfourj8
djqrxfive4five8
3xzhpqc6six
1htdxrgtrhvpgz
5bkxxsccdftjmhkfjqvjzjnine
pxpdfdnnpqzspxd9xrpvrxhnsix9four3
gtxlzxdninexxhseven5
xcdkvdg7nineeightsdjvkhzgmone
zrnrrpxdfcnine2qgjxzfxcqgghbdk9
twozrckqbppsixhh7pmrmnktnrb7five
tdxpjz2kccgqzcslm8sixsixtwo
8tgcb32
eight391gxm99five8
one3fivegrpjr4trqxj5eighteight
7eightzsnndnine8fourgphhbhxn
7five8seven6mhkksix
8jvccfldpqfourgltcqbkpkfourtwohbvnnine2
rrvmvtvbrmsgnstbghfl28
66fourninekjzfzrj
seventwoninethree3plvfoureight5
fmpzrfpqqbfivenine7
nrkbbdqdthree1fkbfivefourqlksbfdsjtthplhjhlvgh
176seven
3fourfiveseven681
five88rzxk3mqgtkvgpdx
pgttnnvnhtl4rljpqjzhphmkztwokdqspbth
54eightgngggmdmnxgd
d6jnkq78cgvkrgseven
sixeight7eight1dmvvprm
72twotwo2kntsrccqkmzbn4
snctbphhl2jgpghbvhg
one5xxvhfive6twozmlxddppmb
145eight5jcpmqhkpgrdbvlzl3
two4vtlfddtzrzlmkgx15
2fourseven9pxqzdf3
6ninec3
ninefsix54
sevenbzgrdbbvfmbkvb8
vntfxdprf91rmgvxlxhntsztmggjr1
six4spdffrjfthree595four
pxfftjkdnninexkjvskrtpmjkhnncflz26
dkjmxmhpc7eight7
hsbdfeight9hhrjcn8twothreehjpnbhslcc
437kzcqvsmxkknfour
8twoone54sixvmlcjdnrgnqbmlrvdtnh
one587
4kxxsrcseven33dcvbbgkbcd4fourfour
nine56
oneeightpz4rqbrcdvjbx55
threefive33ninexrlj
3bxjdxlmlgs
gqmkpqpppfour9fouroneeightseven
492
one398threetwo6dseven
j8vlfrninebdgnineljtvbeight
nnnhx28sixtwo
fiverbgztggr6ktrsfvbtqlbtdshqjxjhj
qmdjfthzfour318hrffjj
977dpssrfgfxfxkk6
rvklzfdfour3twofour8five
czbjbfdcbs1rgkfscgntmhksixhqgbrmzvzrg
3xqlbqbcxnfq
six29
jhnfthree7
five1821
578blhpbtrjthree83qtflsj
fgzqnrvfcqkfrdmgkndmrxfctgvsbfive2eight5
feight8eight
3qmfbdztrgpb5
ck5three14lzmffcljxcr
3twoqgjqlvjeight5nddhpflj1
vvdsttjjjgnrzgfournkkhp622onesix
two7seven6
7941
28two7
ninejhxnjctz3jtxmlmjg
vmjpxvqg24pzjfsxvcg5seven2
xpqbffpvmn5
32eightseventhreekqdgtcxgjxvv1seven
2eight3tllbkklghb7
sevenfour1
tjsjfldclvqq1sxcl
mrdqvsxk15jbxstdph
9fivefivebbtcvhqjjdvvqeight
fourdtbkzvhrbvzqnnzghnpv1231
bz34five1
six26two2
bczkffnrtmsrctwoninelbnxoneeight2
sevenstvffmtkqqxg57hthreeeight
4fivesevenrdfcdrxd4
bbbrjsjrmn8px
317vncvpdrh91threetwosix
9sevenzpfivethreefivenineseven7
twodsnvkbvfbtwo62tt6
threesctkeight3vdjrnflh9nckgmzhdf4
eightsixtwo39skhnzf
foursix6
3sixzp5fdzjv
ntwone9xzspfhrthreehsgpqdone62
five9597tgrfbl9
six4rvrcbbjzfdcgctsxjxmjrpc4thmmj8
3sixmdglgdj2zzrkgsdgk2
cbfxpgftninekthreexvmhxmkx1fourf
76twoone
7six32two1fivefspjtdsix
nrcntbgdtjsevenztsmsgfmfour9thslsmhgnk2three
21ltslbrnineseven7
41
sevencdsnmzkspseven49
jbzkthreebjgvhfhcftwojbzdbmcdlff29
sevengjlph11fivexhzdrs
fzkznzxgbsfq4
gvpqjgrfdbdtrpqseven11mmjpkz5
ksfjpnchqzqone15eightsixfivenine
2skjmpvdfoursixtwones
dmtzhqfivethree3eighteightoneseven
one6fourrrrtkkjvr
229spkrxlg
4xjqzfourdtmq
mkv5six
8jdzlpqvc89two
2foursix69k
xbqrmktzfive4
five9rjrvcpfbseightfkmlgbvqkbqj
qnmkvkmckfxqmdtwosevendj6sevensixfive
mkdvknghvsgzrbbjqngbsqeight6mjxfivenineq
6two97mxm
two26jjqjs
1scslcns
pckdk4onesevenpnxq8lxxbzvftcbeightl
qczvprdbeight3twosixsevenfivenbzj
462mfgmhfseven4vmv
gqsrhltninethreedbkrjdfivetwo1
ppsix99nine8qvhbnn48
nine35fxlxqfctwonezf
four2twofive1
847dsgonethree1vkmhmtv
8gnfbqmzszxdfkv5five
22kvqd
five1sevenl59
kgshxdjdfjqzthhplhjqxbjpbxggtz1
fourbzbzvtfj8twoone6629
hn28six1
xqxknfivevxhljqpsixtwo3
hsconethree1fourthree
three5gnlgcthree36rkvlpkcvronefour
rvjqkndonenine3hbrtlzhcbfbkcfive
hhrmnbnct6rdxxtkxkcrbdfg5
6xsqkbthreerjgbzfhb
sixnlxzmblfzx5cspjqthree
4twondrxjb
4three6b
4four3three16
eight3hshdzptsq6twosfour3
eight37twotrxvpxk2ksbldctj
fourseven8fkmtqzdbfourseven
6vngvcmplx
jhr6gfplmzpr2fourfive
eightnine49twoeight2nfndmmb
three7threej4xnffjtnckltwo
onegzlnjsgzlg82mkbfhtmhfour
85vnseight5fivevcqrgvgrtp
47chxx6pkrdxvmrvvfxbl5
34ctkstrjxsnfourseven
two9zcrghthreethree
veight37
two44nine449
58eight98cspxfhftvx
cxpththree7pbmhhmkfzfvthree
8nine2hbmdnvbthree
1four6ncdvzqjqhx1
1bgqspl958lrj
7nvmqrnthreejbzgnzvzpgkr69
7576threesix
twoc83pt
fourkdnsvcq9sevendmhsdgt54threej
zrjts8sixsix237flm
8eightrndfour
two9jsix5gcxf
fivefour7nineseven1qtcdqbp1four
fourzvkqhdninetwoftscrmsd64nxsgx
q1tdsskthree
mkhttggvjh9ctzffdqdjnheightninegmxqxhqrfqgbgzt
ninep2fourf
fiveeight2zxjpzffvdsevenjhjvjfiveone
15737seven
pdrss6oneone4fournine
7b
+102
View File
@@ -0,0 +1,102 @@
package main
import (
"bufio"
_ "embed"
"fmt"
"strings"
aoc "go.sour.is/advent-of-code"
)
func main() { aoc.MustResult(aoc.Runner(run)) }
type result struct {
sum int
sum2 int
}
func (r result) String() string {
return fmt.Sprintln("result pt1:", r.sum, "\nresult pt2:", r.sum2)
}
var numbers = []string{"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"}
func run(scan *bufio.Scanner) (*result, error) {
result := &result{}
for scan.Scan() {
var first, last int
var first2, last2 int
text := scan.Text()
slice := make([]rune, 5)
for i := range text {
copy(slice, []rune(text[i:]))
switch {
case slice[0] >= '0' && slice[0] <= '9':
if first == 0 {
first = int(slice[0] - '0')
}
if first2 == 0 {
first2 = int(slice[0] - '0')
}
default:
if first2 != 0 {
continue
}
for i, s := range numbers {
if strings.HasPrefix(string(slice), s) {
first2 = i
break
}
}
}
if first != 0 && first2 != 0 {
break
}
}
text = string(aoc.Reverse([]rune(text)))
for i := range text {
copy(slice, []rune(text[i:]))
slice = aoc.Reverse(slice)
switch {
case slice[4] >= '0' && slice[4] <= '9':
if last == 0 {
last = int(slice[4] - '0')
}
if last2 == 0 {
last2 = int(slice[4] - '0')
}
default:
if last2 != 0 {
continue
}
for i, s := range numbers {
if strings.HasSuffix(string(slice), s) {
last2 = i
break
}
}
}
if last != 0 && last2 != 0 {
break
}
}
result.sum += first*10 + last
result.sum2 += first2*10 + last2
}
if err := scan.Err(); err != nil {
return nil, err
}
return result, nil
}
+53
View File
@@ -0,0 +1,53 @@
package main
import (
"bufio"
"bytes"
"testing"
_ "embed"
"github.com/matryer/is"
)
//go:embed example1.txt
var example1 []byte
//go:embed example2.txt
var example2 []byte
//go:embed input.txt
var input []byte
func TestExample1(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(example1))
result, err := run(scan)
is.NoErr(err)
t.Log(result)
is.Equal(result.sum, 142)
}
func TestExample2(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(example2))
result, err := run(scan)
is.NoErr(err)
t.Log(result)
is.Equal(result.sum2, 281)
}
func TestInput(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(input))
result, err := run(scan)
is.NoErr(err)
t.Log(result)
is.Equal(result.sum, 54573)
is.Equal(result.sum2, 54591)
}
+5
View File
@@ -0,0 +1,5 @@
Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green
Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue
Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red
Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red
Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green
+100
View File
@@ -0,0 +1,100 @@
Game 1: 1 green, 6 red, 4 blue; 2 blue, 6 green, 7 red; 3 red, 4 blue, 6 green; 3 green; 3 blue, 2 green, 1 red
Game 2: 2 blue, 4 red, 7 green; 17 red, 3 blue, 2 green; 3 green, 14 red, 1 blue
Game 3: 12 blue, 3 red, 1 green; 8 blue, 9 red; 1 blue, 1 green, 9 red; 4 blue, 1 green, 9 red
Game 4: 2 red, 10 green, 5 blue; 11 blue, 4 green; 6 green, 7 blue, 2 red; 4 blue, 9 green; 6 green, 1 red, 5 blue
Game 5: 10 green, 5 blue, 5 red; 10 blue, 13 green; 2 red, 12 blue; 9 green, 9 red
Game 6: 2 red, 3 green; 1 blue, 15 red, 2 green; 1 green, 7 red
Game 7: 16 blue, 4 green, 9 red; 6 red, 2 blue, 12 green; 2 red, 5 green, 14 blue; 11 blue, 13 red; 10 blue, 3 red, 17 green; 1 green, 12 blue
Game 8: 14 red, 12 green, 1 blue; 5 blue, 7 green, 12 red; 8 green, 1 red, 8 blue; 8 blue, 2 green, 15 red; 9 blue, 12 red, 10 green; 4 blue, 15 red, 1 green
Game 9: 2 red, 7 green, 5 blue; 1 red, 5 blue, 13 green; 5 blue
Game 10: 4 red, 1 green, 4 blue; 7 green, 8 blue, 4 red; 9 green, 3 red, 8 blue; 5 red, 2 green, 7 blue
Game 11: 4 green, 1 blue, 1 red; 3 green, 3 red, 1 blue; 3 green, 1 red, 1 blue
Game 12: 7 red, 6 green, 12 blue; 6 blue, 8 green, 3 red; 12 green, 5 blue, 4 red; 3 red, 16 blue, 8 green; 12 red, 11 green, 6 blue
Game 13: 2 green, 5 red, 12 blue; 8 green, 12 red, 4 blue; 6 blue, 7 green, 13 red
Game 14: 1 blue, 7 green, 5 red; 1 blue, 8 green, 6 red; 3 green, 1 blue, 4 red
Game 15: 11 red, 8 blue, 1 green; 11 red, 1 green; 3 green, 8 red, 2 blue; 4 blue, 11 red, 1 green; 5 blue, 5 red, 2 green
Game 16: 18 green, 4 blue, 2 red; 5 blue, 11 green, 10 red; 8 red, 2 blue, 14 green; 8 red, 7 blue, 1 green; 3 red, 5 blue, 17 green; 6 blue, 5 green, 11 red
Game 17: 3 blue, 3 red, 7 green; 4 blue, 1 red, 2 green; 5 blue, 3 green, 3 red
Game 18: 2 blue, 2 red, 1 green; 4 blue, 2 red, 7 green; 10 blue, 4 red, 3 green; 5 blue, 3 red, 2 green; 4 green, 3 red, 4 blue; 3 green, 5 red, 5 blue
Game 19: 2 red, 1 green, 1 blue; 8 red, 8 blue, 10 green; 16 green, 5 blue, 2 red; 4 red, 9 green
Game 20: 12 red, 1 blue, 1 green; 4 blue, 2 green, 2 red; 3 blue; 5 red, 8 green; 14 red, 4 blue, 6 green
Game 21: 9 red, 7 green, 1 blue; 5 green, 17 red, 11 blue; 14 red, 7 blue, 10 green; 7 green, 7 red, 10 blue; 6 blue, 6 green, 17 red; 16 red, 13 green, 7 blue
Game 22: 4 blue, 1 red; 1 green, 8 blue; 1 green; 6 blue, 1 red
Game 23: 13 red, 7 blue, 1 green; 4 green, 2 blue, 7 red; 4 green, 10 blue, 12 red
Game 24: 9 green, 10 blue; 2 blue, 4 green, 4 red; 9 green, 1 red, 9 blue; 4 green, 5 red, 12 blue
Game 25: 4 red, 1 green; 10 green, 6 red, 4 blue; 4 red, 1 blue, 7 green; 10 green, 3 red, 7 blue
Game 26: 8 red, 1 green, 2 blue; 5 green, 5 red; 6 green, 19 red; 11 red, 2 blue, 8 green; 13 red, 2 blue, 5 green; 15 red, 2 blue, 10 green
Game 27: 17 blue, 1 green; 2 red, 12 blue, 11 green; 16 green, 16 blue; 18 green, 4 blue; 10 blue, 1 red, 8 green
Game 28: 5 red, 1 green, 1 blue; 3 blue, 8 green, 4 red; 6 green, 2 red, 2 blue
Game 29: 3 green, 12 red, 11 blue; 2 green, 15 red, 8 blue; 13 red, 4 green; 17 red, 9 blue, 5 green
Game 30: 10 green; 4 blue, 1 green; 2 blue, 2 red, 7 green; 5 green, 4 blue, 1 red; 4 red, 10 green, 1 blue
Game 31: 15 blue, 2 red; 17 blue, 2 green; 19 blue, 6 red
Game 32: 1 green, 7 red; 8 red, 1 blue; 5 red, 1 blue, 11 green; 3 blue, 17 red
Game 33: 11 red, 9 green, 1 blue; 3 green, 8 blue; 10 red, 4 green, 8 blue; 6 red, 9 blue, 17 green; 15 green, 10 red, 4 blue; 1 red, 2 blue, 7 green
Game 34: 13 red, 6 green; 6 red, 14 green, 2 blue; 3 red, 19 green; 9 green, 9 red
Game 35: 7 green, 3 red; 12 green, 7 blue; 13 green, 7 red, 6 blue; 3 blue, 12 red
Game 36: 6 blue, 11 green, 14 red; 3 blue, 12 green, 4 red; 18 red, 1 blue; 7 red, 9 green, 6 blue
Game 37: 3 red, 16 blue, 6 green; 2 green, 7 blue; 8 blue, 3 red
Game 38: 16 blue, 3 green, 14 red; 8 red, 15 blue; 17 red, 15 blue, 4 green; 1 green, 11 blue, 17 red; 3 green, 10 blue, 17 red
Game 39: 1 green, 2 red, 5 blue; 12 blue, 12 green; 3 blue, 1 red
Game 40: 1 red, 2 blue, 1 green; 7 green, 1 red, 6 blue; 8 blue, 1 red, 6 green; 12 blue, 1 red, 3 green; 4 green, 8 blue
Game 41: 2 red, 2 blue, 5 green; 5 red, 8 blue; 4 green, 4 blue; 1 red, 11 blue
Game 42: 1 red, 3 green, 13 blue; 13 blue, 7 green; 13 green; 1 red, 3 blue, 4 green; 13 blue, 7 green
Game 43: 3 red, 4 green; 7 red, 11 blue, 3 green; 3 green, 12 red, 7 blue; 9 blue, 5 green
Game 44: 4 blue, 9 red, 2 green; 10 blue, 5 red, 2 green; 9 red, 9 blue, 1 green; 8 blue, 2 green, 14 red; 3 blue, 3 green, 6 red; 4 blue, 3 green, 14 red
Game 45: 1 red, 2 green, 2 blue; 2 green, 1 red; 1 green, 2 blue; 1 green, 1 red, 2 blue; 2 red, 2 blue, 1 green
Game 46: 1 green, 3 red, 3 blue; 6 green, 2 blue, 4 red; 1 green, 3 blue, 1 red; 3 green, 1 blue, 5 red; 6 green; 1 red, 1 green, 2 blue
Game 47: 18 green, 1 red, 7 blue; 6 blue, 19 green, 1 red; 5 blue, 7 green, 1 red; 1 red, 5 blue, 16 green; 15 green, 3 blue
Game 48: 4 green, 8 blue, 8 red; 13 green, 5 red, 12 blue; 9 red, 6 blue, 10 green; 18 green, 3 blue, 4 red; 2 blue, 9 red, 8 green
Game 49: 9 blue, 5 red, 9 green; 5 blue, 11 green, 5 red; 12 green, 6 blue
Game 50: 13 red, 8 green, 3 blue; 2 red, 11 green, 3 blue; 16 red, 7 green; 3 blue, 11 green, 15 red; 10 red, 2 blue, 5 green; 7 green, 2 blue, 4 red
Game 51: 2 red, 1 green, 3 blue; 2 green, 11 red, 17 blue; 2 red, 3 green, 6 blue; 4 red, 3 green, 6 blue; 13 red, 12 blue
Game 52: 1 blue, 5 green; 20 green, 6 blue; 9 blue, 6 green; 11 green, 1 red; 1 green, 1 red, 1 blue
Game 53: 8 red, 6 blue; 6 blue, 6 red, 2 green; 5 blue, 2 green, 3 red; 3 green, 3 blue; 4 green, 5 red, 1 blue
Game 54: 4 blue, 1 red, 3 green; 4 green, 10 blue, 9 red; 7 red, 3 blue, 3 green; 9 green, 9 red, 1 blue; 9 blue, 6 red, 7 green; 6 blue, 7 green, 9 red
Game 55: 15 red, 1 blue, 6 green; 11 blue, 3 red; 9 blue, 3 red, 1 green
Game 56: 8 green, 8 red, 9 blue; 8 red, 8 green, 1 blue; 7 red, 10 green, 4 blue; 10 blue, 2 green, 9 red
Game 57: 10 red, 3 green, 2 blue; 1 red, 4 green; 7 red, 1 green, 3 blue; 12 red, 4 blue; 14 red, 5 green, 4 blue
Game 58: 8 green, 3 blue, 7 red; 7 red, 14 blue, 5 green; 3 green, 7 red; 16 blue, 15 green; 1 red, 10 blue
Game 59: 3 red, 13 green, 2 blue; 10 blue, 3 green, 6 red; 3 green, 2 blue; 7 green, 2 blue, 7 red; 17 green, 6 blue, 15 red
Game 60: 2 blue, 2 red, 6 green; 11 green, 1 blue, 2 red; 1 blue, 9 green; 1 red, 4 green, 2 blue; 1 red, 2 blue, 10 green
Game 61: 3 red, 12 blue, 1 green; 3 red, 1 green, 18 blue; 5 blue, 2 red
Game 62: 4 red, 3 blue, 8 green; 2 blue, 8 red, 9 green; 8 blue, 15 green, 1 red
Game 63: 14 green, 2 red, 1 blue; 7 green, 11 blue, 1 red; 7 blue, 3 red; 4 green, 10 blue, 3 red
Game 64: 8 blue, 18 green, 2 red; 3 red, 17 green; 7 green, 1 red, 12 blue; 15 green, 2 red, 4 blue; 7 green, 8 red, 13 blue
Game 65: 6 blue, 5 green, 2 red; 1 red, 4 green; 5 green, 1 blue; 6 blue, 3 red, 2 green; 4 blue, 5 green
Game 66: 11 red, 9 blue, 4 green; 8 red, 8 blue; 9 red, 7 blue; 1 blue, 12 green, 4 red; 2 red, 11 blue, 10 green
Game 67: 1 red, 4 blue, 1 green; 7 red, 1 blue; 3 green, 4 blue, 6 red; 6 green, 3 blue, 14 red; 11 red, 1 blue, 1 green; 4 green, 8 red
Game 68: 3 red, 1 green, 2 blue; 1 red, 9 blue; 2 red, 1 green
Game 69: 3 green, 2 blue, 2 red; 1 red, 6 green; 13 red, 2 blue, 4 green; 4 blue, 13 red, 6 green; 12 red, 2 blue
Game 70: 15 blue, 2 green, 7 red; 3 red, 14 blue; 6 blue, 1 green; 1 red, 2 green, 4 blue; 2 green, 13 red; 12 blue, 3 red
Game 71: 7 red, 3 blue; 1 red, 4 blue; 2 red, 5 green, 1 blue; 6 blue, 8 red, 1 green; 3 green, 7 blue, 8 red
Game 72: 7 green; 4 green, 2 red, 8 blue; 1 blue, 5 green
Game 73: 5 red, 5 green, 2 blue; 8 red, 1 blue, 8 green; 1 red, 3 blue, 7 green
Game 74: 17 green, 9 blue, 4 red; 20 green, 2 red, 7 blue; 7 blue, 2 green, 4 red; 2 blue, 5 red, 20 green; 1 blue, 1 red, 12 green; 19 green, 9 blue, 3 red
Game 75: 1 red, 8 green, 9 blue; 7 blue, 3 green, 1 red; 2 green, 1 red, 9 blue; 5 blue, 1 red, 8 green; 2 green, 1 red, 11 blue; 5 green, 1 red
Game 76: 3 blue, 16 green, 2 red; 10 green, 3 blue, 1 red; 6 blue, 14 red, 13 green; 7 red, 2 green, 13 blue
Game 77: 7 red, 14 green; 1 blue, 1 red; 4 red, 1 green; 7 green, 11 red
Game 78: 1 red, 19 green; 10 green, 14 red, 1 blue; 3 green, 3 blue, 11 red; 7 blue, 1 green; 15 red, 3 green, 4 blue
Game 79: 7 red, 7 green, 6 blue; 3 red, 7 green, 5 blue; 7 red, 8 green, 12 blue
Game 80: 15 red, 6 blue; 1 red, 5 green, 2 blue; 1 green, 3 blue
Game 81: 3 red, 7 blue, 7 green; 7 green, 2 blue, 4 red; 3 green, 5 blue; 9 blue, 3 red, 6 green; 6 green, 1 red, 3 blue; 8 blue, 2 green, 1 red
Game 82: 5 red, 13 green; 3 blue, 13 green; 6 blue, 4 red, 10 green; 5 red, 1 green, 4 blue; 1 blue, 8 red; 4 red, 5 green
Game 83: 17 red, 1 blue, 2 green; 3 green, 3 red, 2 blue; 1 red, 5 blue, 10 green; 4 blue, 9 red, 11 green
Game 84: 13 green, 14 red, 12 blue; 14 blue, 2 red, 1 green; 4 blue, 8 red
Game 85: 3 red, 1 blue; 6 red, 3 blue, 2 green; 5 green, 3 blue, 3 red; 3 green, 5 blue, 1 red; 1 blue, 12 red, 2 green
Game 86: 16 blue, 17 green, 7 red; 14 blue, 13 green; 18 blue, 8 green
Game 87: 1 blue, 1 red; 4 blue, 1 green, 4 red; 1 green, 16 red; 1 green, 12 red, 1 blue
Game 88: 1 red, 6 green; 3 red, 2 blue, 19 green; 11 green, 2 red; 5 blue, 5 green; 5 blue, 9 green, 1 red; 2 blue, 2 red, 4 green
Game 89: 4 green, 11 red; 8 blue, 14 red; 14 blue, 8 green, 9 red; 14 green, 15 red, 10 blue
Game 90: 8 green, 2 red, 1 blue; 11 green, 4 blue, 2 red; 7 green, 2 blue; 13 green, 1 red
Game 91: 1 blue, 3 green; 1 blue; 4 green, 1 blue, 1 red; 1 blue, 2 red; 1 green, 2 red; 2 red, 5 green, 2 blue
Game 92: 16 red, 4 green, 5 blue; 9 blue, 13 green, 5 red; 13 red, 11 green, 7 blue; 11 red, 8 green, 2 blue
Game 93: 4 blue, 3 red, 3 green; 4 blue, 2 red, 1 green; 1 green, 2 red, 2 blue; 1 green, 2 red, 2 blue; 4 green, 1 blue
Game 94: 8 blue, 11 red, 7 green; 8 red, 6 green; 15 blue, 11 green, 2 red; 9 green, 6 red; 16 blue, 5 red, 7 green
Game 95: 13 blue, 1 red, 10 green; 11 green, 9 blue; 6 blue
Game 96: 1 green, 6 red; 1 red; 12 red, 1 green; 6 red, 1 blue
Game 97: 1 red, 9 blue, 8 green; 2 green, 6 blue, 1 red; 6 green, 1 blue
Game 98: 9 blue, 7 green, 8 red; 6 red, 11 blue, 4 green; 11 green, 9 blue, 15 red; 11 red, 6 blue, 16 green
Game 99: 2 blue, 1 red, 9 green; 8 red, 1 blue, 1 green; 2 red, 7 green, 8 blue; 1 red, 5 green, 7 blue; 7 blue, 10 green, 9 red; 1 green, 1 blue, 1 red
Game 100: 3 blue, 6 red, 9 green; 4 red, 3 green; 4 green, 16 red, 1 blue; 14 blue, 1 green
+118
View File
@@ -0,0 +1,118 @@
package main
import (
"bufio"
_ "embed"
"fmt"
"os"
"strconv"
"strings"
aoc "go.sour.is/advent-of-code"
)
func main() {
result, err := aoc.Runner(run)
if err != nil {
aoc.Log("ERR", err)
os.Exit(1)
}
aoc.Log(result)
}
type result struct {
sum int
powerSum int
}
func (r result) String() string {
return fmt.Sprintln("result pt1:", r.sum, "\nresult pt2:", r.powerSum)
}
type gameResult struct {
red, green, blue int
}
func run(scan *bufio.Scanner) (*result, error) {
// only 12 red cubes, 13 green cubes, and 14 blue cubes
maxCounts := gameResult{
red: 12,
green: 13,
blue: 14,
}
games := [][]gameResult{}
games = append(games, []gameResult{})
for scan.Scan() {
pfx, text, ok := strings.Cut(scan.Text(), ":")
if !ok || !strings.HasPrefix(pfx, "Game") {
continue
}
rounds := aoc.SliceMap(func(text string) gameResult {
round := gameResult{}
for _, result := range strings.Split(text, ",") {
ns, color, _ := strings.Cut(strings.TrimSpace(result), " ")
n, err := strconv.Atoi(ns)
if err != nil {
panic(err)
}
switch color {
case "red":
round.red = n
case "green":
round.green = n
case "blue":
round.blue = n
}
}
return round
}, strings.Split(text, ";")...)
games = append(games, rounds)
}
aoc.Log(games)
aoc.Log(len(games))
sum := 0
powerSum := 0
for i, game := range games {
if i == 0 {
continue
}
mins := gameResult{}
ok := true
for _, round := range game {
mins.red = max(mins.red, round.red)
mins.green = max(mins.green, round.green)
mins.blue = max(mins.blue, round.blue)
if maxCounts.red < round.red {
aoc.Log("game", i, round, "too many red", round.red)
ok = false
} else if maxCounts.blue < round.blue {
aoc.Log("game", i, round, "too many blue", round.blue)
ok = false
} else if maxCounts.green < round.green {
aoc.Log("game", i, round, "too many green", round.green)
ok = false
}
aoc.Log("game", i, round, ok)
}
if ok {
sum += i
aoc.Log("game", i, "passes", sum)
}
power := mins.red * mins.blue * mins.green
aoc.Log("game", i, "mins", mins, power)
powerSum += power
}
return &result{sum, powerSum}, nil
}
+41
View File
@@ -0,0 +1,41 @@
package main
import (
"bufio"
"bytes"
"testing"
_ "embed"
"github.com/matryer/is"
)
//go:embed example.txt
var example []byte
//go:embed input.txt
var input []byte
func TestExample(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(example))
result, err := run(scan)
is.NoErr(err)
t.Log(result)
is.Equal(result.sum, 8)
is.Equal(result.powerSum, 2286)
}
func TestSolution(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(input))
result, err := run(scan)
is.NoErr(err)
t.Log(result)
is.Equal(result.sum, 2317)
is.Equal(result.powerSum, 74804)
}
+10
View File
@@ -0,0 +1,10 @@
467..114..
...*......
..35..633.
......#...
617*......
.....+.58.
..592.....
......755.
...$.*....
.664.598..
+140
View File
@@ -0,0 +1,140 @@
...........................775.651...............887....79...946...921...493.....942..942.....151....155....................................
......240...................*.....-......................$..*...................*.......%.....+....................956.549.*290.......834...
.485...+............437......906......%..608.805.725..72.....242....745..61......440................................*..*.........515...*....
..........917.......&....146........790.....*......*....*..........*.....*...............207*......................796..116......../...924..
722...323.-................./...410.............72..748.442............384.708...............849..%............................470..........
.....*..........................*.....271..691....-...............4*...........388.................448......&........*....848&......751.....
....370..$....639.748.......*...467....*.....*........921*909.....................*...32.....................165..452.30....................
........984....*.....*...782........711.....50.172...............61&..........415.803.*.........524.......................203.......106*643.
...............57..433.........390....................&../.............*122...........674.........*.........................................
379..................../.........*........908..477...305.876..*..............297.415*......+.......94........../.....@378.......226..56*....
...*..-......82.......167...936.17..958...=....*...............196......+......*.......-...380.992.............989.........29......*....301.
..124..317.....*....................*..........839.......................191.882......231.........+......976.................+......469.....
............643................*........778............541........655..............*............*........./............*.................515
.....&............498#...&....726.774..............111....*378..................723.221.......473............752....523.638.......789...*...
.....353................518..........-.........../....*...............*88.........................*..@280..=..-....................-..297...
...........279...........................*816.....286.975.&319.....614......694.......799.......503.......861...569.............+...........
..474........*.228..............308......................................................*............207........................838..408...
...........226./....*................82.........................268/......814.........640.............../..489........719..=..........*.....
....83............88.544....250.......=...87..............199.........115*....................................*...377.@.....643........658..
........-...651.............*................&..............................*379.....411...686.397............202.*....../........217.......
.....781.......*897......630................330.....117.961..........61..543.....#...*.....*.......323.............996.603.......*..........
.......................................................*........473....*.....739.184.511..........+......43.833.................953...@.....
....110......@471...........*464....@.347......779................/.....205.*.......................681.....@.........................694...
.........................203......158.-....310./...449...726*982.............437.....+....259...................185......940*702............
.....465....*.......747....................*..........*...............................238..&......./..963...755....*........................
.....*....687..104..%.........645........959..497..732........988........733.....12...........417.176....$..........176.323....657..........
...566........*...........938*......418......*............925....*28..............-.156........*................................*..#........
.............933.......................*....988........../............................*........813.................868*674...375...839......
.....................804.......464..452...................................47......324.789..........692*288..................................
...959...........792....*10.....=......................*455.77...827.99....*.........................................166.......8...586......
.....*...607......*..............................12.764......*.......*..905....590.236...#.677...823......972..204............*......*......
..661....*........776....938..901.............@.*.........$...216...995...........*....382..*....#....546*.....#...........564........707...
......755................*.......*698......315..291.......964................-.......=.....865........................521........150........
........................323............./............973.........*35..........318.....204...........546..+667....214%..*..............973...
........143......&725...........619....149..............*235..650.........604..........................*..............195..............*....
................................*.................................926...................@240......+...433..302..672.........977....149..335.
.......880.......&...............301.512.$.....876......331.897...#..............#...............464......+...........938.........*.........
......@....942...603....&....879..........117..........*.....*.............562..905....377*862..............*56.........%........352..*165..
.726......*..........239....*.....915..............@...661...905..............*...................466....223.................730............
....*......97..839.......308.........*....115....512..........................497.392.....563........=...............448...........462*884..
....122.........*...471*...........52...&..=...................=..................@.........*...............................531.............
.........*..522...&.....274...........116......*572...........907..........................161..670@..@....................=........57*.....
.........28.*.....606.......................925...............................908...86...............78..............712.....813*......16...
....549.....512....................................825.....797.......224..660*........@.425*656.........=536..256.......*........599........
...*.............963..................842..704.............+....425..*..............................102.......$....565.179..774/........576.
...................*..........................*..............=...*....922........50...262....%............603......*........................
.......636.......349...&...224...$............899.........983..319.............#........&...663....*575..%.......95.....383*................
......=...............928........218................84.............964.........953..+...........212.........................857.............
............................179.......68......................&....*.................787.............92&.72....455..969...........846..40...
.993=..../..........110.407*...........%.............164..#....306.215...................552..............*....=...#.....69.602...#...*.....
......322..........#...........561..............968..*....913............%..........@586...=.330...........166.............*........863.....
............810...........157.*....557.....30.*.....774...................968.601*...........*....491..........557.....83*..................
.......*368.*.......842...*...435.-...........65.-................................680.....913....#.......793....*.........87.262....34.-....
....896......875.....*...........................581.957..758............$................................@..981..............#......*.844..
..................957...150.......503................@....*......89....59......261..........653....................................372......
...731...-129..+........*........-......................718.713....*.......197..*......30......+...476............872.......................
....*...........671....917.......................800.&......=....197..763....*...96......#.........*......%......*..........739......290....
.....234..............................814*251....../.755.............../...375.....................309.914..816...877..=.......$......$.....
.........543.378.....74.%608.25...755..........237..............834..................431..................../..........585..................
....408...&...*..............*................*.............214*.....................*.........89.475*.......................@..939..824....
...*..........526..........713..&.....132...899..108.75..#..................521....428....97../.......603.....248.........878...&...*.......
....383...............873......1....................*....850....862....%......#.=................533.........*.......................863....
.............852.........*................578%....................*..492.........905.145.927........*........437.107.....@....29............
......604.......#./531.179..&........56.........921..233.......943......................*..........174...........*.......271.*...32.........
........*..619.............588......*............*...*..............918*837.....120.128......508...........536...............558...*638.....
523....794...-....................451..544....648..365.778.....@.............@.....*............$..%414...*............453#.................
..................&......124*...........*...............*...259........696...424...........*...............322..534................*519.....
........201*.30...474........567.526..363............%.963......287+......*.........939.964.....994.............*.....-........287.......657
........................709*......=.........854...527................50..591...859....%..........*....196.......188..395..157...*...........
.281*....878................354.......*221...*............308....309...*.........$..@...72#......577.........................*...734.....481
.....9....*.............658........235......767..12..548...=...#.......585..830....609........................603.130.....884...........*...
........324........@...*........................*....*........628.............................................*...$...........=......658....
..................139.206....$.....768*........986....311..........967...15...174....100-.....7$..............962....=.........561..........
......521.....154.............318......622...................-.............%...@.................856.......60.........24..481.......520.772.
.825..#.......*.............................180.............228.11.....173.......128......428.........405.+...68...........=..882......*....
....*.......657...........27....798*460...................@............-..............31.*.....840...........*................@.............
.965...931............974...*...........................798.................455*.........856......*...809...97..934.740$..570...............
........*..511.$427....../..652..-297............296........$........552..........884..................*........%........*........128.......
..........-..........207............................=....641.........+..........-..*....43..........329................990...........*......
.10...................=..11....&............................./.143........875..732....&.......&............................349.....265...858
...*......222....495%...*...618..322.......%.........116...833....*........*.........776....288....760.........-............-...............
....291......*..........453.........*...811...398..............515........365..445....................*.....961.........433......743...$....
.............33..................543.........@..........................=...../.....793*...........266..............668...........#.....804.
................701....................17*.................449*741.....961......814..........................*245......*...809*.............
.......206......*....668..728$............529..........*93........................-...833.713..............69.......292........157...224*...
..........*585...969............810..522............866..............254.....570........*....*.....588..................+113.......-.....752
................................/......../......257.............119...-..844...*..979..442....169.....=.259......+.............752..401.....
...726...967........&.234.................326.....*....590*636...*............130.../.........................933.....652*439...*...........
.....*......*12..332...-...........500#..........944..............747.......$.....................203....513.......................%864.....
....389.&....................*...............938.......893....970.........864........538.755&.258..*........#...............717.96......+...
.65.....180...&.............864.....169.........*................*...390............*.........*....904.........................*...354...478
....620......472.726.931...............*.......150../.......@....960....................*928.812...........................428......*.......
...*................*.................463..........323.....478..........964..........175.........324%........=827......66.......193..303....
313.......................@...705.214.....174&........................-.....271........................818...............*.........+........
........171+..830...328..158...*..%..................17....721.....568......../...........949.............*.............608.....90......570.
....327..........*....*.......44......................*..................193-.......67.................970......966.503................#....
669*..........386..306....+............105............443...........................*........490..130...........*....$..........$62.........
......454...............&..954...38....*..........229....................643......388.671....@.......*...8......506....66*148.........$.....
......*................259.........*.................*756.......596.........*........................638..+....................%....854.....
...700......895..............................757................*.........847..............630*612..................854..606....38..........
...............*.....93.....573......274........*...952..336...................562..................+...637............*.*..................
945........../.814..=..........*....*...........38..=............-....&........*..................118......*.........745..855.........367...
......676..688..................604..153...............671......513...690....891.%.....101.728..........767......28...................../...
.........=.......700..222.443............114.....................................458...../....#...................*.........=...............
...........660.%...&.....*.....98.232.......*............308.......650..267/..........$............................417.....806.....502......
.......276*....500............@.............63.......621*.....520...-........913.....225.........620.597...709*632.............663*.........
...................232...149............65.......................&........................228.....%.....-................467............800.
..........118........+....*....@.........-.458...737.....-247.........425................/..................574......424*.........421..*....
......158.-....*........564.599......128......*...#..........................419.............764*156.............................*......996.
............577.563.....................*...777.......................508..............*827............................*465.....306.........
.........................*..............848......996*......688....154...*.......%...780......51...410......357.148..856.....................
...648.............835.713....*...609.......................&........*..885....494..........*..........661....*.............................
...-.....477./693..*........938.....*./...........642..149......465.502......$............=.523.........#.......892................=824.....
....................296...........44...707..........+.....*...................462......476........@...............*..........388............
.....58...321..............127................................446...............................965....446........114.........*.............
.........*........951...3....*.................623.263.............=.-....122..........................=....519*...........692.......%313...
........943.......*......$....990.......795..../......*..135.....815.483....*..937*.............................634..............771........
............460....757.....@......511/..*............564..-..............340.......109.206.......%785..148...21....................*....&...
.47.........&...............102........265......555..................182......12*.........................*...%.................788..200....
.../............=..................#82..........$.......207.............*863.....751.........251.....641.702.......141..640.................
..........23..902.......174...............*.............=.....314...........................*..........*.....*667...........*...............
.........*...............*.......*766..842.35.......243..........*......@..................57..435....501.285.............964.....*.........
..165...100.@512.........292.......................%......79..@...726....341.511*.............*...................573..........602.74.......
...*..................................596#...&...............769........................314.397..&31................%..855..................
...6.....673....................898..........836.......827.......+.....-..............................133*766..........*..............290...
..........*.........799........*.........629.......634........%.188.103.......594......464.799*295.............895...930.........-....$.....
.....908..504.......*......603..800..936...*......*.........768..........973...*.......*...............904*16.*................358..........
.....@............825..%......&.........*...963.294.74...........%........*....102...967...-343.................#..................94.698...
.810...................968..............429...........*....950..313..482..397...................33.........@..297..198...114.......*...*....
.....-............................554..................................-.......245.$...............991..282.........-...*....161..894..78...
..705.....177.....*..872@.285........*.../813.........235....729..........*287..*...472.788.645........................144..................
.............*..984.......*........722............496*..........*990....79......715........*............456...................812..470......
............518......@.....950.........712..............981...........................238....579.533........373.466...615/......$.....*907..
..716..907.......761..471..............*......../...........823..+............978*......=.....*.....#......&....*...........................
....*...............*........990.331...46....871...........*.....447.723...@...............594...............801......................#757..
...312...*.........211..........*.................90.860...970.........*...375...........*.....-....*779.........&..........................
.......692..............602.............................*.............595.............841...166..327......-444....154.......................
..............$....316..=.............+978.843........42....135/.+332.........454.........................................707.../......295..
.........$....743..../.......-................+........................*990..................343......#.....*...............*....684........
......651.....................644....................887.812........187.................783........749...928.291...........131...........293
+128
View File
@@ -0,0 +1,128 @@
package main
import (
"bufio"
_ "embed"
"fmt"
"strconv"
aoc "go.sour.is/advent-of-code"
)
func main() { aoc.MustResult(aoc.Runner(run)) }
type partNumber struct {
number int
row int
col int
end int
hasSymbol bool
}
type symbol struct {
symbol rune
row int
col int
adjacentParts []*partNumber
}
type symbolTab map[int]map[int]*symbol
func (tab symbolTab) hasSymbol(row, col int, p partNumber) bool {
if cols, ok := tab[row]; ok {
s, ok := cols[col]
if ok {
s.adjacentParts = append(s.adjacentParts, &p)
cols[col] = s
}
return ok
}
return false
}
func (tab symbolTab) scanSymbol(p partNumber) bool {
rowStart, rowEnd := max(p.row-1, 0), p.row+1
colStart, colEnd := max(p.col-1, 0), p.end+1
for i := rowStart; i <= rowEnd; i++ {
for j := colStart; j <= colEnd; j++ {
ok := tab.hasSymbol(i, j, p)
if ok {
return true
}
}
}
return false
}
// 553079
// 84363105
type result struct {
valuePT1 int
valuePT2 int
}
func run(scan *bufio.Scanner) (*result, error) {
parts := []partNumber{}
symbols := make(symbolTab)
symbolList := []*symbol{}
row := 0
for scan.Scan() {
text := scan.Text()
row += 1
slice := make([]rune, 0, 3)
var col int
for i, a := range text {
col = i
if a >= '0' && a <= '9' {
slice = append(slice, a)
continue
}
if v, err := strconv.Atoi(string(slice)); err == nil {
parts = append(parts, partNumber{number: v, row: row, col: col - len(slice), end: col - 1})
slice = slice[:0]
}
if a != '.' {
cols, ok := symbols[row]
if !ok {
cols = make(map[int]*symbol)
}
s := &symbol{row: row, col: col, symbol: a}
cols[col] = s
symbols[row] = cols
symbolList = append(symbolList, s)
}
}
if v, err := strconv.Atoi(string(slice)); err == nil {
parts = append(parts, partNumber{number: v, row: row, col: col - len(slice), end: col - 1})
slice = slice[:0]
_ = slice
}
}
sum := aoc.SumIFunc(
func(i int, p partNumber) int {
ok := symbols.scanSymbol(p)
parts[i].hasSymbol = ok
if ok {
return p.number
}
return 0
}, parts...)
sumGears := aoc.SumFunc(
func(s *symbol) int {
if s.symbol == '*' && len(s.adjacentParts) == 2 {
return s.adjacentParts[0].number * s.adjacentParts[1].number
}
return 0
}, symbolList...)
// fmt.Println(parts)
// fmt.Println(symbols)
// fmt.Println(symbolList)
fmt.Println("part1:", sum)
fmt.Println("part2:", sumGears)
return &result{sum, sumGears}, nil
}
+43
View File
@@ -0,0 +1,43 @@
package main
import (
"bufio"
"bytes"
_ "embed"
"testing"
"github.com/matryer/is"
)
//go:embed example.txt
var example []byte
//go:embed input.txt
var input []byte
func TestExample(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(example))
result, err := run(scan)
is.NoErr(err)
t.Log(result)
is.Equal(result.valuePT1, int(4361))
is.Equal(result.valuePT2, 467835)
}
func TestInput(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(input))
result, err := run(scan)
is.NoErr(err)
t.Log(result.valuePT1)
is.Equal(result.valuePT1, int(553079))
t.Log(result.valuePT2)
is.Equal(result.valuePT2, 84363105)
}
+6
View File
@@ -0,0 +1,6 @@
Card 1: 41 48 83 86 17 | 83 86 6 31 17 9 48 53
Card 2: 13 32 20 16 61 | 61 30 68 82 17 32 24 19
Card 3: 1 21 53 59 44 | 69 82 63 72 16 21 14 1
Card 4: 41 92 73 84 69 | 59 84 76 51 58 5 54 83
Card 5: 87 83 26 28 32 | 88 30 70 12 93 22 82 36
Card 6: 31 18 13 56 72 | 74 77 10 23 35 67 36 11
+202
View File
@@ -0,0 +1,202 @@
Card 1: 73 92 13 35 18 96 37 72 76 39 | 82 14 66 57 25 98 49 28 3 95 81 85 31 30 16 79 7 12 55 19 97 45 9 58 2
Card 2: 41 93 82 81 96 56 46 13 44 79 | 13 28 47 49 46 94 84 87 96 45 41 79 35 43 31 34 81 82 64 93 8 56 9 44 55
Card 3: 22 26 55 46 94 88 3 17 91 95 | 95 97 44 25 46 91 17 20 43 94 22 34 62 73 31 55 60 79 88 90 3 80 33 89 26
Card 4: 78 32 27 65 64 28 43 81 50 93 | 95 37 77 46 29 55 98 88 94 72 53 80 43 41 7 63 92 33 32 66 2 35 31 24 65
Card 5: 74 21 96 20 45 88 18 10 53 73 | 80 87 86 81 28 11 77 16 70 44 8 22 72 85 27 35 42 36 84 37 59 9 41 56 3
Card 6: 70 48 93 10 63 97 20 77 72 42 | 19 7 12 1 47 31 72 88 36 82 69 17 29 62 22 8 32 86 52 76 96 41 51 55 44
Card 7: 79 43 87 42 8 74 51 69 3 44 | 30 27 19 42 99 28 68 43 5 36 54 24 92 97 34 44 96 2 50 82 35 69 25 45 18
Card 8: 11 39 32 62 93 41 75 94 23 29 | 40 31 95 41 17 21 81 90 34 13 4 5 48 24 20 80 50 26 27 43 54 61 8 73 89
Card 9: 75 99 39 45 32 35 55 87 76 21 | 34 14 80 3 93 46 71 78 23 22 87 82 42 49 76 94 10 51 44 58 11 4 91 26 43
Card 10: 34 53 9 36 52 30 70 60 65 96 | 85 31 29 41 4 88 63 93 9 52 11 37 23 61 51 71 97 26 70 15 38 72 94 64 95
Card 11: 41 92 42 94 63 89 85 25 86 98 | 3 20 70 74 93 34 21 82 37 55 9 79 85 41 14 99 2 92 90 26 40 57 67 89 31
Card 12: 50 37 85 46 56 44 2 42 60 66 | 69 78 30 59 71 87 6 51 9 81 75 45 24 16 31 61 44 96 41 86 23 17 42 27 40
Card 13: 24 46 50 29 89 77 49 25 53 65 | 63 66 43 86 11 9 40 70 38 79 78 27 12 20 84 42 67 73 22 8 68 35 6 4 69
Card 14: 72 68 9 78 90 40 55 37 16 52 | 27 98 76 63 58 70 8 44 48 90 6 92 3 20 96 88 59 31 95 15 45 47 30 65 64
Card 15: 15 28 38 87 24 61 26 13 18 94 | 63 56 51 29 17 47 21 62 19 14 69 32 60 41 11 10 54 89 7 35 71 16 96 20 27
Card 16: 11 24 42 76 99 12 45 94 33 10 | 36 94 72 31 12 28 24 18 11 99 61 33 79 10 53 35 76 42 43 22 78 27 62 59 45
Card 17: 72 40 35 28 16 51 2 89 83 39 | 68 79 67 15 77 35 12 34 57 16 10 75 72 39 89 60 27 29 19 17 32 45 37 38 14
Card 18: 13 68 25 92 79 95 67 87 50 7 | 29 23 1 59 91 51 17 80 12 84 27 66 69 61 39 16 34 44 54 37 4 11 9 45 14
Card 19: 62 14 80 15 40 69 26 65 83 32 | 72 18 66 83 59 48 65 50 37 93 80 14 67 60 40 68 32 69 27 85 30 31 62 15 26
Card 20: 4 20 48 56 11 13 8 83 98 96 | 87 25 5 99 19 3 51 79 36 35 39 43 45 63 80 40 20 75 24 64 54 98 95 68 72
Card 21: 13 67 19 78 79 47 49 69 8 9 | 44 9 47 62 50 78 19 76 8 57 77 13 39 11 43 67 49 18 79 94 69 55 58 7 70
Card 22: 21 39 6 99 81 57 22 53 95 90 | 80 46 74 15 69 72 14 16 87 10 99 20 45 81 6 27 51 21 40 89 90 95 65 57 50
Card 23: 27 36 95 10 68 52 30 43 51 70 | 62 52 51 95 68 25 11 30 65 10 55 49 27 81 34 37 63 43 9 56 96 70 1 36 58
Card 24: 31 57 94 2 78 82 63 27 97 70 | 97 58 46 37 70 2 98 57 11 29 36 94 51 90 56 27 13 31 39 28 60 71 96 78 26
Card 25: 96 13 61 89 70 80 93 57 9 28 | 13 27 29 50 9 94 59 80 16 7 40 89 91 3 60 75 17 18 36 86 15 28 26 61 57
Card 26: 53 96 15 97 36 13 31 22 19 35 | 61 55 1 92 93 65 19 41 52 3 85 24 22 78 13 70 66 54 31 95 71 96 58 97 35
Card 27: 56 75 28 85 82 52 58 59 13 33 | 2 31 12 10 81 94 9 80 5 95 43 55 83 60 66 79 61 58 49 34 29 57 99 92 88
Card 28: 4 21 19 94 95 47 92 52 78 73 | 72 96 85 7 26 44 56 86 49 6 63 35 1 66 4 70 13 40 71 17 62 8 69 76 32
Card 29: 44 13 92 57 70 83 96 63 6 76 | 51 30 71 38 42 76 77 99 10 64 26 81 21 50 89 59 31 8 79 83 85 2 5 75 44
Card 30: 59 26 61 78 20 5 11 32 87 23 | 97 41 35 31 27 80 83 51 42 2 17 48 69 6 37 62 43 29 18 73 8 95 82 79 45
Card 31: 80 30 36 54 1 81 95 16 45 62 | 99 73 91 43 93 23 4 51 71 30 84 28 80 63 46 53 49 55 74 31 25 2 52 3 21
Card 32: 10 9 5 18 68 47 81 1 93 65 | 55 80 77 33 50 94 56 9 58 22 86 31 51 2 88 44 98 99 26 21 3 30 20 52 93
Card 33: 16 48 32 5 1 96 11 2 14 46 | 80 10 79 87 19 5 71 72 30 29 93 13 39 67 8 49 22 48 76 28 52 23 58 38 81
Card 34: 70 24 23 27 67 55 95 96 80 92 | 54 5 42 37 93 49 10 7 74 80 50 34 78 40 2 28 39 52 3 83 62 21 91 71 73
Card 35: 70 96 75 73 29 58 88 16 77 71 | 68 42 64 11 65 63 5 79 38 52 34 41 86 35 25 44 48 93 20 60 78 4 90 80 21
Card 36: 17 59 71 39 41 83 86 51 4 23 | 88 96 35 17 91 16 34 26 27 92 75 97 46 78 39 80 32 60 70 9 81 28 50 95 18
Card 37: 52 75 8 64 39 42 10 34 71 73 | 62 34 29 80 46 64 2 42 81 45 55 44 17 33 66 26 12 50 52 8 94 4 43 85 48
Card 38: 61 74 68 26 97 31 86 96 41 98 | 95 56 70 49 3 86 21 8 90 39 96 26 30 16 46 31 97 89 61 68 53 41 98 54 74
Card 39: 3 18 75 56 73 41 43 82 34 33 | 70 26 42 78 6 56 90 41 17 75 18 47 82 32 13 60 81 39 5 52 54 55 12 48 98
Card 40: 96 25 22 84 95 72 50 40 90 69 | 48 91 77 78 16 17 55 26 1 28 14 31 23 79 51 24 82 97 62 47 13 93 12 4 20
Card 41: 71 54 24 39 7 51 95 46 90 17 | 96 44 64 69 8 62 97 39 48 2 76 71 37 84 90 54 95 81 46 63 7 51 50 24 47
Card 42: 48 94 44 43 57 58 55 7 17 11 | 2 12 84 40 96 57 73 17 55 94 43 87 90 95 35 21 11 42 34 26 25 10 74 60 41
Card 43: 75 8 12 87 36 35 33 62 11 39 | 25 73 71 64 46 99 60 57 15 24 80 10 74 67 12 23 63 69 56 55 20 53 1 52 81
Card 44: 66 71 25 56 8 65 96 38 68 41 | 41 33 18 60 66 72 37 87 59 94 56 96 5 7 17 21 14 25 93 39 74 79 46 71 11
Card 45: 27 8 93 49 24 48 23 78 98 51 | 71 37 96 47 74 21 9 40 12 45 49 70 84 76 58 53 50 91 34 85 13 7 5 29 55
Card 46: 84 42 44 27 98 64 19 28 93 74 | 17 15 4 47 75 52 73 90 89 57 55 36 80 81 54 71 88 53 1 56 21 32 66 91 38
Card 47: 53 21 4 28 65 58 49 98 10 23 | 25 20 19 64 10 67 15 78 80 7 83 13 35 38 75 86 33 28 98 27 73 70 59 79 14
Card 48: 37 12 5 10 95 45 70 11 72 97 | 16 89 35 32 24 78 71 91 14 52 9 63 53 36 17 8 82 97 69 27 26 12 81 67 43
Card 49: 54 4 71 83 72 50 95 78 35 36 | 46 87 98 18 36 72 74 75 66 70 69 16 21 58 90 33 93 68 41 59 7 23 92 5 11
Card 50: 70 93 33 38 27 36 61 55 74 94 | 40 20 58 70 78 12 14 31 95 29 19 65 81 17 90 16 45 51 13 97 72 63 53 41 88
Card 51: 27 14 41 6 24 48 96 66 43 18 | 11 1 81 92 8 29 26 13 35 73 3 78 93 52 98 77 60 99 62 79 22 54 9 21 30
Card 52: 1 28 54 70 24 22 50 37 63 87 | 22 11 71 87 50 25 24 70 37 14 95 28 40 80 3 54 63 58 82 1 34 41 13 10 75
Card 53: 33 96 53 80 60 6 35 77 32 83 | 35 5 43 67 32 80 18 79 58 91 28 96 23 53 6 83 77 86 71 50 21 33 60 30 24
Card 54: 45 76 84 5 12 3 44 2 81 59 | 6 76 63 81 16 2 12 3 87 44 21 24 45 19 59 84 5 17 68 80 66 36 15 99 31
Card 55: 5 67 46 50 68 64 14 94 11 4 | 45 34 62 53 97 65 37 27 68 36 22 44 20 60 75 77 89 55 33 9 13 28 63 31 47
Card 56: 51 96 40 33 39 81 74 60 62 65 | 70 90 69 76 32 62 40 65 56 80 28 33 74 81 82 94 60 12 49 7 39 96 8 63 51
Card 57: 24 71 51 97 23 89 41 46 6 56 | 62 52 20 4 67 24 38 5 92 50 11 63 59 17 55 83 98 21 48 87 97 32 23 53 66
Card 58: 63 72 78 10 64 46 65 54 95 9 | 8 77 4 58 32 82 42 49 97 47 40 2 87 24 9 94 63 61 17 27 56 55 12 75 39
Card 59: 62 67 17 58 45 46 91 94 81 93 | 46 40 52 26 74 81 17 41 82 61 12 50 35 97 62 94 28 58 38 45 92 63 67 93 91
Card 60: 81 21 13 88 69 2 49 17 59 51 | 64 4 59 28 95 21 2 17 49 88 48 13 82 51 18 65 54 81 42 10 22 69 32 85 60
Card 61: 50 51 58 20 22 31 61 89 84 7 | 1 68 27 88 52 39 13 23 2 3 42 5 55 29 77 38 44 95 63 34 46 75 4 60 16
Card 62: 62 84 76 41 71 86 25 15 55 42 | 71 32 35 76 42 41 84 15 1 43 30 88 48 86 25 70 98 62 93 3 13 46 77 97 50
Card 63: 34 20 1 29 7 61 31 97 81 85 | 26 8 78 2 29 61 23 59 60 7 10 86 12 64 1 87 24 56 58 30 19 53 36 81 34
Card 64: 3 82 28 70 49 95 9 52 45 38 | 27 28 65 81 57 15 29 71 32 60 48 52 4 73 38 72 67 10 88 7 3 5 78 91 18
Card 65: 85 74 52 87 60 24 82 72 67 93 | 72 4 87 52 86 48 39 67 18 15 99 41 78 38 60 84 36 75 79 23 2 42 54 16 69
Card 66: 33 54 78 76 24 29 62 20 2 98 | 76 98 51 99 75 2 30 83 33 72 28 3 29 62 20 84 54 61 59 94 1 16 63 24 78
Card 67: 59 78 56 63 44 35 10 94 13 4 | 46 63 56 1 94 86 55 80 20 28 50 67 4 53 6 59 13 58 93 10 22 19 84 12 8
Card 68: 87 12 41 7 75 43 62 68 63 81 | 4 95 20 24 91 37 70 56 67 49 90 82 6 21 59 30 71 64 41 65 58 96 8 25 13
Card 69: 89 39 8 86 62 97 53 84 72 74 | 11 48 25 89 72 59 7 85 15 19 65 80 54 1 21 38 29 30 40 58 56 49 3 83 52
Card 70: 75 49 73 78 29 12 47 36 24 88 | 92 84 50 75 12 34 73 28 97 86 29 56 78 8 69 47 17 44 32 68 81 15 16 26 37
Card 71: 44 41 24 40 59 85 74 36 4 92 | 33 48 32 49 78 34 35 29 45 93 36 37 18 98 16 17 58 69 40 61 66 94 60 59 75
Card 72: 9 21 83 27 2 23 99 7 6 59 | 73 74 81 25 65 33 29 14 27 44 24 63 49 43 12 37 69 79 36 54 52 82 55 78 94
Card 73: 71 70 3 47 31 76 78 72 86 98 | 95 20 70 33 45 89 85 29 52 88 42 90 6 80 25 58 79 13 48 67 41 49 24 27 39
Card 74: 22 39 58 70 56 59 3 98 61 97 | 13 84 72 47 11 52 4 35 46 49 5 24 62 43 9 40 63 16 99 93 33 83 30 91 14
Card 75: 29 48 85 95 64 61 35 99 15 46 | 98 97 9 76 5 14 74 87 38 75 82 54 4 63 20 53 79 40 62 96 2 85 31 36 80
Card 76: 70 94 3 1 46 48 87 5 16 74 | 52 14 22 6 24 65 4 8 42 36 66 43 9 45 93 69 51 57 19 44 81 98 77 35 79
Card 77: 77 8 29 21 11 31 93 74 72 71 | 67 8 43 72 62 40 11 77 71 29 61 92 74 12 52 37 78 93 56 31 14 21 63 39 35
Card 78: 66 48 5 4 63 54 91 74 76 77 | 48 54 36 95 11 61 76 52 46 65 18 67 66 63 62 19 5 74 77 64 4 42 9 91 55
Card 79: 57 19 65 23 69 74 28 97 89 41 | 89 15 41 99 58 53 8 17 23 81 28 94 43 57 1 46 71 38 87 6 49 59 80 85 75
Card 80: 64 39 19 41 14 6 91 8 61 46 | 66 94 39 82 43 92 33 8 30 1 40 55 18 95 6 86 7 80 91 65 97 9 12 61 2
Card 81: 26 28 44 29 78 30 14 68 22 40 | 38 8 25 72 51 31 16 71 45 37 87 23 85 64 7 6 34 44 90 9 13 15 82 49 32
Card 82: 47 26 6 33 32 1 37 42 96 29 | 68 20 10 56 6 27 13 22 83 15 41 37 24 79 52 93 80 94 45 92 50 46 2 78 42
Card 83: 33 32 63 1 19 69 29 3 64 10 | 69 43 8 32 9 67 40 23 64 20 96 27 1 42 11 19 3 10 63 33 22 29 55 6 49
Card 84: 25 47 44 53 22 60 77 89 37 67 | 99 48 44 53 60 6 9 8 22 70 37 96 50 47 25 89 11 49 67 90 29 32 77 40 66
Card 85: 30 60 57 86 93 88 18 27 48 82 | 94 10 57 86 59 88 48 52 78 29 20 41 82 77 90 87 64 6 60 81 44 51 2 68 45
Card 86: 8 29 97 92 91 69 48 82 51 67 | 40 81 10 97 57 94 7 65 84 17 96 38 5 76 98 55 39 34 88 27 12 18 3 26 9
Card 87: 29 21 65 98 26 23 40 94 90 51 | 42 53 95 94 62 75 86 55 29 49 92 21 87 37 56 40 13 68 65 23 26 98 38 31 69
Card 88: 30 79 14 43 73 41 36 83 19 17 | 3 73 70 55 99 34 90 38 26 5 85 22 81 97 66 16 24 88 2 33 21 63 96 58 41
Card 89: 81 41 29 97 76 57 30 79 25 52 | 76 37 89 90 38 17 87 46 7 93 99 54 41 62 79 43 82 95 70 61 29 58 48 12 60
Card 90: 26 94 39 29 48 22 16 98 66 64 | 52 66 61 50 45 64 80 27 5 14 68 13 58 37 7 26 39 82 16 72 33 8 48 99 88
Card 91: 87 17 19 24 64 7 45 28 36 23 | 54 16 64 83 48 49 61 31 95 66 92 15 85 41 3 82 63 67 55 57 9 68 18 32 43
Card 92: 48 41 8 81 26 60 65 73 1 88 | 39 65 51 63 69 88 25 41 3 13 66 98 18 31 73 71 86 12 10 96 6 93 20 9 82
Card 93: 79 2 21 93 97 59 62 43 83 73 | 26 9 28 84 47 46 44 2 83 5 13 95 7 4 36 35 11 10 72 82 90 65 73 98 87
Card 94: 74 86 50 28 11 2 94 47 54 77 | 1 69 35 40 22 19 16 61 66 68 28 56 29 85 10 51 83 7 50 59 92 71 9 86 67
Card 95: 96 12 56 26 91 15 64 61 82 40 | 52 14 50 70 93 83 54 42 84 19 43 80 82 25 73 3 44 45 81 5 87 41 8 16 78
Card 96: 80 38 2 91 44 92 19 43 10 64 | 11 45 21 28 31 71 23 88 93 62 17 27 7 78 33 32 54 84 5 72 15 52 63 68 91
Card 97: 32 54 71 38 5 89 28 47 75 42 | 98 34 57 25 9 80 37 71 61 62 94 6 65 13 92 84 11 2 72 90 17 67 4 1 46
Card 98: 39 57 6 68 64 91 90 51 78 10 | 56 30 1 12 62 44 21 69 53 65 84 32 96 25 94 92 38 60 14 47 77 13 71 93 20
Card 99: 6 89 48 77 90 57 21 72 87 73 | 39 48 45 73 87 79 14 25 57 72 66 89 31 30 77 50 74 6 34 36 21 23 90 10 49
Card 100: 33 40 16 54 58 60 30 47 22 6 | 31 47 30 76 48 67 33 68 22 57 54 5 16 6 58 43 3 64 55 15 40 60 77 13 4
Card 101: 19 52 71 42 34 73 35 89 62 46 | 9 73 26 49 72 14 19 46 99 32 4 88 84 10 87 17 27 89 30 98 40 7 75 78 90
Card 102: 2 79 8 73 25 16 82 47 20 52 | 71 88 82 79 2 51 52 3 54 20 56 19 69 10 97 66 45 28 36 39 47 61 40 13 42
Card 103: 77 28 11 32 36 23 39 88 76 51 | 26 36 99 55 25 19 31 42 18 66 39 11 59 46 4 74 23 71 77 16 84 58 28 32 53
Card 104: 22 90 17 19 96 62 98 55 41 49 | 90 91 74 23 98 84 77 31 81 16 41 67 49 55 56 86 22 24 73 52 99 62 93 32 34
Card 105: 41 91 2 4 18 81 52 93 89 87 | 3 47 6 77 60 24 97 26 70 19 37 36 51 82 48 21 31 99 73 88 59 15 46 35 32
Card 106: 48 54 60 39 80 50 13 61 43 51 | 24 66 90 38 10 74 28 29 89 16 5 25 2 54 15 34 70 7 44 47 14 48 69 78 13
Card 107: 10 20 81 62 85 75 4 49 58 1 | 32 89 48 79 90 96 15 59 36 14 49 55 38 34 30 11 62 28 53 72 17 77 41 80 66
Card 108: 79 94 49 89 78 71 20 7 48 56 | 11 53 35 90 22 29 4 71 48 94 70 8 72 78 27 45 7 21 49 16 55 56 73 42 81
Card 109: 32 73 98 31 4 46 57 11 40 88 | 36 40 89 47 18 87 98 48 45 84 21 1 80 33 67 32 64 28 61 3 51 10 86 97 62
Card 110: 45 51 97 87 23 48 19 50 63 55 | 19 20 15 22 27 24 38 93 55 54 98 23 28 97 82 59 73 11 8 1 18 64 50 63 48
Card 111: 38 1 49 22 26 96 3 88 24 70 | 79 58 20 74 70 80 55 68 35 77 88 3 24 40 87 53 50 47 38 54 82 26 49 7 2
Card 112: 79 90 9 20 94 36 88 31 48 42 | 25 68 69 52 24 98 76 63 97 41 67 94 61 90 32 87 18 13 75 38 84 60 64 86 89
Card 113: 7 32 6 52 76 72 39 24 46 79 | 67 19 31 94 50 26 66 11 45 80 86 68 88 22 65 3 99 12 90 79 38 14 4 73 54
Card 114: 80 54 9 2 58 26 44 63 15 21 | 5 60 76 47 87 33 89 23 4 55 17 42 62 46 97 48 90 91 95 82 34 64 30 19 31
Card 115: 51 34 88 42 20 98 75 79 39 48 | 76 94 13 58 12 66 50 72 2 89 68 21 96 25 10 45 30 7 99 15 46 59 90 9 53
Card 116: 43 32 82 89 9 63 78 57 55 77 | 19 47 23 27 70 22 18 52 28 93 36 76 80 65 21 8 67 20 84 9 12 90 92 97 5
Card 117: 71 50 45 29 32 75 10 96 82 43 | 96 46 83 47 10 11 16 39 36 3 89 9 67 5 72 53 2 27 19 7 8 24 61 37 4
Card 118: 37 44 20 31 43 47 13 46 51 39 | 8 70 7 66 48 50 18 82 84 96 73 12 6 97 62 75 17 49 26 22 4 24 54 94 61
Card 119: 36 75 46 25 47 69 95 8 94 81 | 48 91 62 11 99 10 9 7 26 15 1 79 54 45 49 27 53 78 64 65 33 31 59 17 5
Card 120: 37 96 65 31 64 95 9 55 92 29 | 71 62 77 18 86 52 33 19 8 93 30 74 17 84 59 11 69 4 41 67 76 10 66 43 38
Card 121: 39 99 21 22 11 13 61 72 49 29 | 98 79 29 42 27 73 12 40 96 13 88 45 14 18 4 36 99 80 11 22 49 23 67 21 72
Card 122: 74 88 60 36 94 18 99 55 70 16 | 91 77 18 6 93 84 97 68 45 13 63 94 14 21 31 10 65 16 61 54 70 51 30 46 36
Card 123: 67 91 97 35 11 3 8 69 81 15 | 14 45 66 15 8 29 69 24 68 67 10 59 35 18 17 53 11 3 91 12 43 72 97 81 89
Card 124: 64 61 94 18 21 17 42 80 86 43 | 25 83 69 59 57 51 87 38 91 54 56 46 4 75 99 90 73 37 20 86 49 98 21 58 81
Card 125: 51 79 20 71 43 42 46 36 77 7 | 55 46 22 24 76 86 34 95 73 36 98 63 49 43 54 28 58 10 26 62 79 97 39 60 32
Card 126: 44 51 42 27 1 84 56 38 18 91 | 27 67 1 51 42 44 19 18 73 84 16 12 56 24 91 21 97 47 99 88 90 25 6 38 65
Card 127: 85 92 63 8 17 51 43 61 52 78 | 37 81 65 43 88 97 17 79 46 51 39 23 44 78 95 2 28 49 32 85 63 84 61 8 92
Card 128: 36 40 7 30 79 76 4 37 97 27 | 97 29 30 58 84 71 4 98 78 27 6 76 43 22 37 40 36 32 7 23 70 92 53 79 48
Card 129: 98 81 33 49 20 93 32 82 39 48 | 39 65 7 78 52 87 79 53 33 60 63 81 71 93 55 92 12 30 82 32 38 27 90 95 84
Card 130: 29 59 99 28 65 42 80 87 19 85 | 87 65 59 82 28 29 64 99 79 33 9 31 19 75 53 1 20 42 97 39 72 80 8 85 63
Card 131: 88 58 37 3 66 87 67 60 84 5 | 84 86 40 82 37 16 34 55 54 70 80 65 22 77 31 48 78 11 68 18 12 52 69 17 32
Card 132: 50 23 57 31 27 1 25 2 38 21 | 52 61 75 38 15 71 90 50 76 66 22 39 99 68 13 37 78 18 87 43 63 40 53 84 2
Card 133: 3 59 60 91 93 68 65 45 86 20 | 13 32 74 8 90 68 58 94 67 38 93 97 75 2 71 20 31 37 59 30 39 44 28 34 64
Card 134: 42 6 64 28 96 55 43 58 24 40 | 36 99 10 79 2 9 42 61 84 58 35 7 77 38 85 21 64 32 78 6 96 74 89 40 55
Card 135: 38 15 49 59 73 40 13 60 41 25 | 46 80 2 60 42 59 51 57 56 27 40 62 76 37 84 16 89 18 25 73 5 22 45 70 81
Card 136: 18 17 68 43 77 76 91 13 4 79 | 11 67 10 73 23 71 8 46 87 79 5 51 58 47 62 66 24 29 55 82 93 20 80 32 42
Card 137: 60 51 99 79 67 59 66 40 25 87 | 44 53 76 5 77 75 65 90 9 41 55 22 60 23 71 30 1 86 88 15 54 66 59 13 68
Card 138: 78 65 89 48 62 88 3 12 87 99 | 11 19 39 38 69 81 12 75 17 52 26 56 29 77 91 23 93 53 50 66 15 16 85 80 71
Card 139: 34 12 48 47 25 98 32 37 21 54 | 13 62 79 43 90 72 47 11 20 82 38 29 69 10 66 35 1 84 7 52 27 42 46 91 58
Card 140: 61 27 68 51 7 58 43 89 26 59 | 2 17 44 87 36 15 6 35 57 29 62 13 56 81 40 19 53 9 85 5 10 46 64 86 88
Card 141: 40 28 9 81 37 43 18 77 83 23 | 13 59 2 31 52 30 47 6 42 89 70 69 86 92 19 93 58 49 36 8 29 99 60 63 67
Card 142: 25 6 69 2 14 44 13 93 89 95 | 13 33 76 2 14 68 95 25 18 23 44 43 89 6 93 11 4 24 9 45 38 69 36 15 17
Card 143: 3 87 14 59 7 5 69 35 20 17 | 5 16 21 69 38 50 64 97 72 30 53 77 73 13 33 55 79 70 4 10 95 59 3 41 42
Card 144: 94 63 13 51 62 72 33 9 64 22 | 11 90 13 28 47 56 10 4 93 30 7 70 33 69 62 36 72 96 24 22 71 63 52 86 73
Card 145: 76 1 41 88 97 18 10 11 52 20 | 18 11 41 1 71 52 12 94 74 44 58 70 69 73 79 97 20 45 59 76 78 88 4 10 64
Card 146: 93 1 18 44 21 66 28 60 98 9 | 13 42 18 46 28 23 96 16 12 55 70 53 98 56 64 50 15 61 25 72 24 35 8 43 97
Card 147: 67 27 79 43 7 74 11 15 64 75 | 17 57 90 7 41 36 93 29 62 14 77 5 38 33 68 70 32 13 23 6 25 30 55 45 9
Card 148: 59 62 37 5 52 53 43 29 98 2 | 33 62 93 52 29 68 43 23 11 35 87 14 76 53 59 77 4 89 48 13 2 15 49 72 99
Card 149: 38 74 24 93 50 21 19 65 95 5 | 93 82 57 95 67 11 9 55 5 74 46 2 96 19 21 92 56 14 38 33 77 58 32 43 37
Card 150: 8 99 26 38 47 48 96 20 82 92 | 80 46 13 97 66 22 40 36 85 73 63 32 1 70 49 60 90 88 43 2 48 5 76 34 50
Card 151: 41 69 32 12 5 72 3 29 2 79 | 28 41 11 64 69 71 3 87 45 40 5 15 50 95 90 53 19 55 26 98 82 12 6 77 14
Card 152: 96 20 94 19 7 68 24 56 88 97 | 54 70 63 84 26 73 35 24 39 99 6 79 44 20 64 12 38 87 1 43 46 42 11 60 8
Card 153: 60 9 99 62 93 22 16 11 34 28 | 57 43 38 98 82 89 20 58 71 40 79 53 86 1 69 4 27 19 36 85 83 33 59 90 96
Card 154: 45 75 27 11 76 24 1 4 21 99 | 96 51 54 55 78 69 24 31 77 18 92 17 89 86 3 11 19 15 88 64 49 47 68 36 14
Card 155: 97 56 99 89 82 6 17 15 52 29 | 23 26 85 70 13 47 72 1 51 64 90 44 53 45 42 77 88 32 74 25 58 68 37 21 79
Card 156: 28 78 54 72 36 25 84 47 87 30 | 75 49 44 5 83 48 16 17 82 33 60 15 12 94 41 66 23 51 43 39 6 55 34 77 32
Card 157: 44 74 36 93 15 96 25 12 19 40 | 84 44 54 96 80 48 59 79 78 55 42 27 11 69 76 19 93 2 35 83 77 43 40 85 99
Card 158: 74 73 99 41 17 45 92 80 21 85 | 85 51 97 91 69 81 74 73 88 80 28 14 6 95 99 92 50 29 17 5 77 89 76 21 41
Card 159: 7 2 83 33 51 95 96 18 75 52 | 52 96 21 27 47 98 51 83 29 77 75 53 2 64 7 33 57 82 50 14 95 34 79 44 18
Card 160: 46 54 7 84 37 42 60 9 47 10 | 84 34 9 85 24 29 80 8 88 10 1 46 43 59 47 76 81 26 68 60 30 42 7 56 37
Card 161: 18 88 61 65 90 29 1 20 22 25 | 25 84 28 2 45 61 39 71 35 32 16 18 65 1 29 23 49 5 22 83 78 24 20 88 90
Card 162: 78 93 50 17 75 29 69 31 65 85 | 31 18 45 12 28 85 65 69 81 15 32 64 22 40 33 23 50 17 29 97 7 37 63 93 78
Card 163: 66 47 30 99 34 45 60 82 72 43 | 73 98 29 36 35 54 49 61 17 1 52 95 81 56 31 27 15 96 24 20 32 33 65 55 82
Card 164: 45 23 93 75 49 1 3 12 36 67 | 77 79 15 82 12 93 49 23 45 31 8 62 66 75 32 48 6 30 78 67 64 3 36 1 94
Card 165: 75 62 57 30 69 52 35 84 17 32 | 9 17 46 33 69 29 35 34 84 55 57 83 56 70 10 7 30 75 27 99 52 62 32 47 77
Card 166: 2 79 15 96 51 77 38 98 36 74 | 1 54 12 73 39 75 87 24 49 74 43 53 56 16 34 99 26 30 50 40 86 94 35 66 65
Card 167: 41 77 3 17 78 56 92 33 87 52 | 98 37 44 68 43 53 76 13 74 59 49 71 66 90 54 82 46 5 95 16 15 62 96 58 25
Card 168: 23 61 30 69 41 58 21 49 97 16 | 26 74 24 40 58 30 20 38 34 87 72 46 15 77 50 2 57 1 75 81 84 70 23 69 11
Card 169: 9 17 32 25 1 65 22 46 8 99 | 84 19 66 27 28 15 34 90 42 2 43 87 78 6 81 46 24 13 63 3 48 20 86 70 73
Card 170: 32 86 96 77 56 40 66 46 89 2 | 87 1 50 91 59 96 29 70 92 93 33 10 20 45 12 60 63 21 14 54 36 80 56 19 75
Card 171: 70 36 51 80 5 24 40 87 72 30 | 30 52 71 81 84 97 22 95 72 53 46 55 44 51 24 19 98 63 73 56 6 80 90 59 77
Card 172: 97 74 79 52 85 56 40 2 30 54 | 66 40 49 94 16 47 57 85 24 45 53 63 51 74 69 38 46 90 50 91 75 97 28 31 62
Card 173: 72 49 45 75 23 20 90 50 48 94 | 38 34 28 33 91 65 87 19 37 30 9 18 64 14 53 70 49 39 90 79 88 51 12 57 48
Card 174: 48 39 78 41 80 49 43 87 61 22 | 68 39 65 84 67 79 10 29 78 81 36 73 62 6 44 72 27 1 19 66 93 4 16 46 50
Card 175: 96 91 10 82 43 98 30 65 3 83 | 49 77 40 78 70 23 52 34 16 2 64 72 69 61 15 33 79 32 39 74 7 92 24 46 36
Card 176: 29 21 33 68 60 35 11 99 82 61 | 81 13 97 71 32 40 23 36 59 53 66 54 62 47 89 93 44 33 87 55 26 18 31 64 67
Card 177: 97 45 62 55 76 34 66 54 14 68 | 94 42 28 30 32 58 33 48 46 80 7 15 92 98 95 81 90 17 71 24 26 16 39 13 93
Card 178: 99 45 47 89 4 17 36 14 86 96 | 40 33 56 89 17 93 94 45 75 4 5 99 37 36 47 98 70 44 86 65 14 73 96 8 22
Card 179: 30 63 6 25 4 85 41 17 83 11 | 44 92 25 71 95 61 50 11 27 4 6 30 9 85 63 67 87 13 17 83 18 53 41 10 52
Card 180: 70 89 32 66 15 30 76 8 42 36 | 36 16 89 13 45 42 31 77 76 30 71 27 8 95 98 32 35 14 66 70 26 85 72 33 15
Card 181: 74 81 12 28 22 21 14 54 3 5 | 32 59 69 67 15 35 42 12 34 11 5 71 79 2 73 14 55 87 56 65 28 17 30 99 9
Card 182: 79 41 90 19 21 15 66 2 55 59 | 2 93 34 65 67 63 72 79 15 5 59 14 55 95 70 83 90 21 68 66 19 7 41 92 3
Card 183: 6 8 44 39 74 78 10 2 61 59 | 6 61 75 44 62 92 77 29 8 39 78 20 73 18 68 4 60 66 74 59 49 3 2 5 10
Card 184: 68 32 10 82 15 95 56 89 28 42 | 25 56 28 73 6 11 43 37 95 2 70 18 19 90 45 89 26 42 10 32 7 98 82 15 68
Card 185: 66 74 17 3 71 21 51 28 14 48 | 80 34 77 37 45 74 84 20 44 14 31 66 51 48 17 86 12 43 71 56 35 13 4 93 27
Card 186: 79 33 25 28 86 18 57 7 76 40 | 26 16 59 99 31 62 77 21 23 70 7 25 35 49 81 18 72 45 65 58 86 51 88 80 76
Card 187: 1 2 73 43 13 64 69 21 3 46 | 65 37 53 92 82 13 12 28 3 58 71 46 64 1 56 19 98 21 73 43 60 2 57 29 69
Card 188: 85 77 35 15 22 67 79 18 66 99 | 42 46 93 19 28 4 89 32 95 75 11 57 6 40 39 30 22 43 41 24 8 78 58 69 48
Card 189: 13 48 6 61 55 38 75 96 76 42 | 42 32 61 81 55 13 26 41 9 77 70 68 56 35 58 89 20 75 6 72 91 38 90 93 96
Card 190: 19 78 50 35 32 14 45 70 16 77 | 32 92 71 86 75 77 9 8 19 68 16 6 67 33 15 78 43 57 55 85 69 35 73 50 14
Card 191: 71 62 7 72 70 4 89 95 94 59 | 36 94 40 6 71 59 45 28 90 12 89 95 16 85 83 88 4 48 72 62 76 7 13 70 11
Card 192: 52 15 61 83 18 67 29 75 34 36 | 8 65 43 93 67 53 88 83 52 75 81 37 49 29 6 39 76 91 92 36 19 98 50 41 33
Card 193: 78 94 7 48 25 16 91 38 13 5 | 22 77 76 84 17 40 41 36 93 56 50 35 64 59 23 95 89 49 61 30 42 85 37 92 44
Card 194: 66 92 16 37 42 62 86 76 98 36 | 46 60 34 31 79 40 11 19 16 74 75 36 71 43 13 2 90 76 50 29 85 55 54 10 35
Card 195: 66 23 45 62 30 95 38 5 97 39 | 96 65 37 89 95 73 69 75 25 45 51 22 62 7 33 13 94 78 34 35 36 56 55 70 24
Card 196: 15 45 70 41 97 27 80 64 25 28 | 88 93 65 83 36 16 35 92 6 71 82 24 17 64 66 33 37 69 78 60 56 49 91 19 61
Card 197: 46 35 2 60 75 99 6 42 47 21 | 91 93 70 8 46 6 35 50 55 72 71 64 47 82 39 94 25 67 41 60 86 83 87 90 7
Card 198: 71 62 73 96 79 63 41 17 56 68 | 95 77 16 70 29 68 66 63 98 80 20 18 31 34 52 5 42 22 49 6 25 38 51 75 50
Card 199: 70 84 46 98 44 45 16 36 29 99 | 78 21 92 77 32 91 22 90 76 74 42 55 51 69 94 64 26 65 41 97 10 34 15 35 9
Card 200: 96 60 87 21 80 48 44 69 3 49 | 2 65 66 94 55 62 72 52 86 15 30 71 45 82 49 47 81 33 14 42 4 1 51 75 34
Card 201: 55 53 33 19 1 70 17 61 2 72 | 62 6 30 86 45 71 46 33 15 90 73 37 18 12 68 87 89 49 8 60 52 22 51 25 74
Card 202: 5 47 96 53 54 14 77 29 12 3 | 26 71 91 86 59 70 78 8 83 92 35 64 9 79 84 34 36 93 90 40 16 44 51 6 4
+100
View File
@@ -0,0 +1,100 @@
package main
import (
"bufio"
_ "embed"
"log/slog"
"strconv"
"strings"
aoc "go.sour.is/advent-of-code"
)
//go:embed input.txt
var input []byte
type card struct {
card int
winner []int
scratch []int
copies int
}
func main() { aoc.MustResult(aoc.Runner(run)) }
type result struct {
points int
cards int
}
func run(scan *bufio.Scanner) (result, error) {
cards := []*card{}
for scan.Scan() {
pfx, text, ok := strings.Cut(scan.Text(), ":")
if !ok || !strings.HasPrefix(pfx, "Card ") {
continue
}
num := aoc.Atoi(strings.TrimSpace(strings.SplitN(pfx, " ", 2)[1]))
cards = append(cards, &card{card: num})
buf := make([]rune, 0, 4)
winner := true
for _, a := range text {
if a >= '0' && a <= '9' {
buf = append(buf, a)
continue
}
if a == ' ' && len(buf) > 0 {
num, _ = strconv.Atoi(string(buf))
buf = buf[:0]
if winner {
cards[len(cards)-1].winner = append(cards[len(cards)-1].winner, num)
} else {
cards[len(cards)-1].scratch = append(cards[len(cards)-1].scratch, num)
}
}
if a == '|' {
winner = false
}
}
if len(buf) > 0 {
num = aoc.Atoi(string(buf))
buf = buf[:0]
_ = buf // ignore
cards[len(cards)-1].scratch = append(cards[len(cards)-1].scratch, num)
}
}
var sumPoints int
var sumCards int
for _, card := range cards {
m := []int{}
for _, w := range card.winner {
for _, s := range card.scratch {
if w == s {
m = append(m, w)
}
}
}
if len(m) > 0 {
sumPoints += 1 << (len(m) - 1)
for i, c := range cards[card.card:min(card.card+len(m), len(cards))] {
c.copies += 1 + 1*card.copies
slog.Debug("cards", "card", card.card, "wins", i+1, "with", card.copies, "copies, wins", len(m), "giving", 1+1*card.copies, "for card", c.card, "total", c.copies)
}
}
sumCards += 1 + 1*card.copies
slog.Debug("cards", "card", card.card, "wins", len(m), "as", 1, "+", 1*card.copies, "for", 1+1*card.copies, "copies. total", sumCards)
slog.Debug("points", "card", card.card, "match", m, "score", sumPoints)
}
return result{sumPoints, sumCards}, nil
}
+34
View File
@@ -0,0 +1,34 @@
package main
import (
"bufio"
"bytes"
"testing"
_ "embed"
"github.com/matryer/is"
)
//go:embed example.txt
var example []byte
func TestExample(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(example))
r, err := run(scan)
is.NoErr(err)
is.Equal(r.points, 13)
is.Equal(r.cards, 30)
}
func TestSolution(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(input))
r, err := run(scan)
is.NoErr(err)
is.Equal(r.points, 23235)
is.Equal(r.cards, 5920640)
}
+33
View File
@@ -0,0 +1,33 @@
seeds: 79 14 55 13
seed-to-soil map:
50 98 2
52 50 48
soil-to-fertilizer map:
0 15 37
37 52 2
39 0 15
fertilizer-to-water map:
49 53 8
0 11 42
42 0 7
57 7 4
water-to-light map:
88 18 7
18 25 70
light-to-temperature map:
45 77 23
81 45 19
68 64 13
temperature-to-humidity map:
0 69 1
1 0 69
humidity-to-location map:
60 56 37
56 93 4
+250
View File
@@ -0,0 +1,250 @@
seeds: 1263068588 44436703 1116624626 2393304 2098781025 128251971 2946842531 102775703 2361566863 262106125 221434439 24088025 1368516778 69719147 3326254382 101094138 1576631370 357411492 3713929839 154258863
seed-to-soil map:
2056129205 3495540274 7275274
2093671499 2217398614 16037515
144190400 1167267743 4402289
685148999 560842720 46363553
148592689 1382926008 71816170
241575914 1243634776 139291232
1686196783 543577846 17264874
2601917866 2486088541 222990187
1703461657 1454742178 45658441
4200618033 2052611543 79792525
2063404479 2445531749 30267020
3026695548 4113017544 181949752
73663477 607206273 70526923
3412143232 2195535041 20126067
1381626519 809568775 38912495
4280410558 3277485604 9635485
1285511345 435930218 30230711
2009679577 4060471919 23976534
491535670 129136847 193613329
3016405776 2475798769 10289772
2035393617 2709078728 12153762
1760083914 1171670032 71964744
3988522413 2233436129 212095620
2824908053 4084448453 28569091
799335774 434222608 1707610
2109709014 3568263067 492208852
2047547379 3502815548 8581826
1275917650 466160929 9593695
731512552 475754624 67823222
380867146 698900251 110668524
1315742056 1500400619 65884463
801043384 848481270 151647344
3208645300 3292042342 203497932
952690728 0 129136847
1081827575 1000128614 167139129
0 1731434235 73663477
1749120098 423258792 10963816
2853477144 3511397374 56865693
1585688167 322750176 100508616
3432269299 2721232490 556253114
1420539014 1566285082 165149153
2973473810 2009679577 42931966
220408859 677733196 21167055
4290046043 3287121089 4921253
2033656111 2215661108 1737506
1248966704 1805097712 26950946
2910342837 2132404068 63130973
soil-to-fertilizer map:
3192416630 3819045895 47516706
39972266 597632895 4546595
2584201752 2580457211 100644566
2272135078 174545609 40291463
2819419661 2681101777 89335599
3239933336 3528823147 72816699
44518861 2232362178 145175982
2519969464 2377538160 64232288
1852478702 2770437376 313570784
2166049486 2441770448 106085592
4133995881 3866562601 160971415
1626150228 975660836 106177604
2908755260 422379995 175252900
3312750035 4178991584 115975712
1142288544 1324281099 483861684
833150172 1928293653 304068525
1732327832 1808142783 120150870
2684846318 39972266 134573343
3133663001 4027534016 58753629
189694843 602179490 373481346
3758375673 4086287645 92703939
3428725747 3199173221 329649926
1137218697 2547856040 5069847
4068485661 3133663001 65510220
590707513 1081838440 242442659
2312426541 214837072 207542923
563176189 2552925887 27531324
3851079612 3601639846 217406049
fertilizer-to-water map:
153835826 1814144363 127150990
1926426485 1614900585 14868868
2139872846 3136260217 42408895
3310771078 2202805875 59788141
83898078 1578023222 36877363
652411041 1574694502 3328720
2080480520 3785135933 59392326
3370559219 3272622808 82257970
3132498144 2037809941 164995934
2678755579 3455437189 65205729
3674754588 3844528259 234175097
2182281741 3520642918 59000325
570340096 1492623557 82070945
2779822218 2446205321 138940597
2037809941 2703025450 42670579
3515202222 2342244856 103960465
3998026660 4136896949 144793347
955105072 0 84792564
3452817189 3073875184 62385033
77176799 1459627033 6721279
4142820007 4078703356 58193593
280986816 1091602584 230166265
1701766245 1321768849 78671169
2987155826 2872940965 145342318
2418013523 3615504153 169631780
2587645303 2262594016 79650840
2667296143 3354880778 11459436
2743961308 3579643243 35860910
1880850385 1046026484 45576100
3297494078 4281690296 13277000
2918762815 2804547954 68393011
1854575140 1466348312 26275245
3908929685 3366340214 89096975
511153081 1400440018 59187015
655739761 864167436 181859048
120775441 1629769453 33060385
2241282066 2745696029 58851925
2300133991 2585145918 117879532
4201013600 3178669112 93953696
837598809 84792564 117506263
1039897636 202298827 661868609
3619162687 3018283283 55591901
0 1736967564 77176799
1780437414 1662829838 74137726
water-to-light map:
279076302 606101520 367597147
3291538704 3736283841 125013874
0 1709355698 279076302
2106348780 1988432000 822929157
2929277937 0 362260767
890514202 2811361157 924922684
3416552578 973698667 444745137
1815436886 1418443804 290911894
646673449 362260767 243840753
light-to-temperature map:
208346365 819874354 29069132
731840321 689055790 58614896
4186248520 4104876526 108718776
3429769554 3384048873 23936103
1459123931 2691296758 217855736
790455217 952719646 105546549
1416544830 2047230764 42579101
0 1202755810 208346365
1399364673 1598820754 17180157
2576491919 747670686 452381
901868462 2408707242 282589516
3626168682 4259315983 35651313
341191657 748123067 71751287
2721433915 1411102175 187718579
3822370242 3740998248 198425166
3245552556 4213595302 45720681
1676979667 100628240 254569707
896001766 2041364068 5866696
3291273237 3245552556 138496317
3661819995 3580448001 160550247
2063025564 380090092 308965698
4020795408 3939423414 165453112
237415497 848943486 103776160
1931549374 1909887878 131476190
2576944300 1058266195 144489615
717031505 2089809865 14808816
412942944 2104618681 304088561
1209350123 0 100628240
1309978363 1820501568 89386310
3453705657 3407984976 172463025
2371991262 1616000911 204500657
1184457978 355197947 24892145
temperature-to-humidity map:
4116612848 1770461885 178354448
475467700 3077125572 130863723
1272723717 1181397963 5578998
3758341401 495891106 279864899
1687813623 1591451985 2235236
2530388822 2518678506 215908033
2282034531 2032693852 208761140
1471990450 379604394 116286712
1817301926 3588566075 238614487
3086830522 2960704657 28309403
3692580145 2002277669 19886809
616860797 3221548716 360840790
3115139925 1226570112 16611162
336172750 170230298 133118381
977701587 1693223682 77238203
1366414227 775756005 105576223
2055916413 2734586539 226118118
4038206300 2287329439 78406548
3712466954 2241454992 45874447
3556277513 2516499157 2179349
1278302715 2989014060 88111512
1588277162 1593687221 99536461
2746296855 3827180562 340533667
469291131 3582389506 6176569
1054939790 1960273136 42004533
1247816059 3207989295 13559421
2490795671 1186976961 39593151
1261375480 1948816333 11348237
36107015 881332228 300065735
1096944323 2365735987 150763170
3131751087 303348679 76255715
3558456862 36107015 134123283
3208006802 1243181274 348270711
606331423 2022164478 10529374
1690048859 4167714229 127253067
1247707493 1960164570 108566
humidity-to-location map:
3760908805 3662107228 155796250
1580497895 3884288658 144897726
3166374808 442179790 213926492
121876139 656106282 138383174
393463083 2300882189 128101885
2948945727 3512929162 110263469
521564968 2652674020 210495874
1940349169 3864399213 19889445
1197505529 794489456 93759960
904168980 2539693608 75416982
1725395621 3623192631 38914597
2881030575 888249416 49678445
2116891732 1943237764 146499392
979585962 2615110590 37563430
3143485439 3262014106 22889369
791255257 4029186384 109003936
4209132419 4140663408 85834877
1764310218 192277746 165625801
2023373170 2466550792 73142816
4140663408 4226498285 68469011
2269931546 1003317103 611099029
1291265489 0 119152028
2930709020 3243777399 18236707
732060842 1884043349 59194415
1410417517 1614416132 170080378
1960238614 937927861 63134556
1929936019 2089737156 10413150
3380301300 2863169894 380607505
3916705055 3291443897 221485265
355896365 2428984074 37566718
2254686 3817903478 46495735
2096515986 2280506443 20375746
1017149392 2100150306 180356137
0 1001062417 2254686
260259313 1784496510 95637052
48750421 119152028 73125718
3059209196 357903547 84276243
2263391124 3284903475 6540422
900259193 1880133562 3909787
+234
View File
@@ -0,0 +1,234 @@
package main
import (
"bufio"
"fmt"
"os"
"sort"
"strconv"
"strings"
aoc "go.sour.is/advent-of-code"
)
func main() { aoc.MustResult(aoc.Runner(run)) }
type result struct {
minLocation int
minRange int
}
func run(scan *bufio.Scanner) (result, error) {
log("begin...")
var seeds []int
var seedRanges [][2]int
lookup := map[string]*Lookup{}
for scan.Scan() {
text := scan.Text()
if strings.HasPrefix(text, "seeds:") && len(seeds) == 0 {
seeds, seedRanges = readSeeds(text)
log("seeds", len(seeds), "ranges", len(seedRanges))
}
lookup = readMaps(scan)
log("lookups", len(lookup))
}
find := NewFinder(
lookup["seed-to-soil"],
lookup["soil-to-fertilizer"],
lookup["fertilizer-to-water"],
lookup["water-to-light"],
lookup["light-to-temperature"],
lookup["temperature-to-humidity"],
lookup["humidity-to-location"],
)
return result{findMinLocation(seeds, find), FindMinRangeLocationMulti(seedRanges, find)}, nil
}
func readSeeds(text string) ([]int, [][2]int) {
var seeds []int
var seedRanges [][2]int
for i, n := range aoc.SliceMap(aoc.Atoi, strings.Fields(strings.TrimPrefix(text, "seeds: "))...) {
seeds = append(seeds, n)
if i%2 == 0 {
seedRanges = append(seedRanges, [2]int{n, 0})
} else {
seedRanges[len(seedRanges)-1][1] = n
}
}
return seeds, seedRanges
}
func readMaps(scan *bufio.Scanner) map[string]*Lookup {
var cur *Lookup
lookup := make(map[string]*Lookup)
for scan.Scan() {
text := scan.Text()
if strings.HasSuffix(text, "map:") {
if cur != nil {
cur.Sort()
}
cur = &Lookup{}
title := strings.TrimSuffix(text, " map:")
lookup[title] = cur
}
numbers := strings.Fields(text)
if len(numbers) == 3 {
rng := make([]int, 3)
for i, s := range numbers {
n, _ := strconv.Atoi(s)
rng[i] = n
}
cur.Add(rng[1], rng[0], rng[2])
}
}
return lookup
}
func findMinLocation(seeds []int, find *Finder) int {
seedLocations := make([]int, len(seeds))
for i, s := range seeds {
seedLocations[i] = find.Find(s)
}
return min(seedLocations...)
}
func FindMinRangeLocation(ranges [][2]int, find *Finder) int {
results := 0
for _, r := range ranges {
results += r[1]
}
seedLocations := make([]int, 0, results)
for _, s := range ranges {
for i := 0; i < s[1]; i++ {
seedLocations = append(seedLocations, find.Find(s[0]+i))
}
}
return min(seedLocations...)
}
func FindMinRangeLocationMulti(ranges [][2]int, find *Finder) int {
worker := func(id int, jobs <-chan [2]int, results chan<- []int) {
for s := range jobs {
res := make([]int, s[1])
for i := 0; i < s[1]; i++ {
res[i] = find.Find(s[0] + i)
}
results <- res
}
}
numWorkers := 16
jobsCh := make(chan [2]int, numWorkers)
resultsCh := make(chan []int, len(ranges))
for w := 0; w < numWorkers; w++ {
go worker(w, jobsCh, resultsCh)
}
log("started workers", numWorkers)
go func() {
for i, s := range ranges {
log("job", i, "send", s)
jobsCh <- s
}
close(jobsCh)
}()
results := 0
for _, r := range ranges {
results += r[1]
}
log("expecting results", results)
seedLocations := make([]int, 0, results)
expectResults := make([]struct{}, len(ranges))
for range expectResults {
r := <-resultsCh
seedLocations = append(seedLocations, r...)
}
return min(seedLocations...)
}
type Range struct {
src int
dest int
len int
}
type Ranges []Range
func (r Ranges) Len() int { return len(r) }
func (r Ranges) Less(i, j int) bool { return r[i].src < r[j].src }
func (r Ranges) Swap(i, j int) { r[i], r[j] = r[j], r[i] }
type Lookup struct {
ranges Ranges
}
func (l *Lookup) Add(src, dest, len int) {
if l == nil {
return
}
l.ranges = append(l.ranges, Range{src, dest, len})
}
func (l *Lookup) Sort() {
sort.Sort(sort.Reverse(l.ranges))
}
func (l *Lookup) Find(n int) int {
for _, r := range l.ranges {
if n >= r.src && n <= r.src+r.len {
diff := n - r.src
if diff < r.len {
return r.dest + diff
}
}
}
return n
}
type Finder struct {
stack []*Lookup
}
func NewFinder(stack ...*Lookup) *Finder {
return &Finder{stack: stack}
}
func (f *Finder) Find(n int) int {
// fmt.Print("Find: ")
for _, l := range f.stack {
// fmt.Print(n, "->")
n = l.Find(n)
// fmt.Print(n, " ")
}
// fmt.Println("")
return n
}
func min(arr ...int) int {
if len(arr) == 0 {
return 0
}
m := arr[0]
for _, a := range arr[1:] {
if m > a {
m = a
}
}
return m
}
func log(v ...any) {
fmt.Fprintln(os.Stderr, v...)
}
+100
View File
@@ -0,0 +1,100 @@
package main
import (
"bufio"
"bytes"
"testing"
_ "embed"
"github.com/matryer/is"
)
//go:embed example.txt
var example []byte
//go:embed input.txt
var input []byte
func TestExample(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(example))
r, err := run(scan)
is.NoErr(err)
is.Equal(r.minLocation, 35)
is.Equal(r.minRange, 46)
}
func SkipTestSolution(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(input))
r, err := run(scan)
is.NoErr(err)
is.Equal(r.minLocation, 199602917)
is.Equal(r.minRange, 2254686)
}
func TestLookup(t *testing.T) {
is := is.New(t)
find := &Lookup{ranges: Ranges{
{98, 50, 2},
{50, 52, 48},
}}
is.Equal(find.Find(79), 81)
find = &Lookup{ranges: Ranges{
{77, 45, 23},
{45, 81, 19},
{64, 68, 13},
}}
is.Equal(find.Find(77), 45)
}
func TestFinder(t *testing.T) {
is := is.New(t)
find := NewFinder(
// seed-to-soil
&Lookup{ranges: Ranges{
{98, 50, 2},
{50, 52, 48},
}},
// soil-to-fertilizer
&Lookup{ranges: Ranges{
{15, 0, 37},
{52, 37, 2},
{0, 39, 15},
}},
// fertilizer-to-water
&Lookup{ranges: Ranges{
{53, 49, 8},
{11, 0, 42},
{0, 42, 7},
{7, 57, 4},
}},
// water-to-light
&Lookup{ranges: Ranges{
{18, 88, 7},
{25, 18, 70},
}},
// light-to-temperature
&Lookup{ranges: Ranges{
{77, 45, 23},
{45, 81, 19},
{64, 68, 13},
}},
// temperature-to-humidity
&Lookup{ranges: Ranges{
{69, 0, 1},
{0, 1, 69},
}},
// humidity-to-location
&Lookup{ranges: Ranges{
{56, 60, 37},
{93, 56, 4},
}},
)
is.Equal(find.Find(82), 46)
}
+5
View File
@@ -0,0 +1,5 @@
32T3K 765
T55J5 684
KK677 28
KTJJT 220
QQQJA 483
+1000
View File
@@ -0,0 +1,1000 @@
A2T63 467
4854J 948
TJTT3 229
69664 839
ATT9A 340
69959 997
39666 4
JJA59 528
A7799 27
T8JTA 71
3333J 50
43Q48 897
66266 574
65TTT 572
TT222 608
JAAQT 98
9Q959 610
27573 537
J2228 504
AJ555 447
KJK6K 283
2J57T 183
4444Q 500
66696 353
J7988 941
79TJK 744
24244 107
K9625 958
4A2AA 814
6Q566 494
7QA77 586
9KTK9 510
44QQQ 101
Q9T9Q 746
A9299 272
Q656J 536
29999 874
Q2T49 811
777T7 928
28288 198
44634 249
5Q96T 484
Q257J 83
63636 568
58J59 174
QQAQQ 633
3J84J 73
2TTJT 684
898A9 751
J9638 917
5546J 118
JJ897 738
AA33A 927
77JTT 603
79799 439
23J23 228
7QQ6T 33
92585 468
98998 685
TT2TT 378
K999K 327
88A59 163
46666 60
37TT7 957
7QJ35 209
33934 333
TTTT8 154
3932K 813
QA6AT 791
66T34 128
39939 277
J34J4 175
9KA99 964
94444 763
JJK4A 236
67AJK 28
4QTQT 299
8TK4Q 526
KAK4K 253
3K7A2 918
49399 112
TTQQQ 845
J999J 418
K44KK 677
4AK2J 61
9J959 475
J8838 387
66676 102
T63A6 264
34483 865
QKQKQ 692
J6669 952
K286T 436
666JT 472
J9872 303
ATTTT 543
22J52 577
A447Q 493
74TQ3 698
68T88 759
5TT5T 668
777KA 470
AA3AQ 104
76Q6A 902
T536Q 784
5Q66T 2
7A72A 765
T5455 462
TT39K 629
J73JA 419
T77T7 993
22K78 357
83Q33 13
54T84 531
44AA4 167
QTJ38 100
6665J 70
5957T 313
J884A 56
T6T99 944
TKK6K 265
265K7 850
22325 109
QQQ55 195
7TATT 513
4999Q 575
56TQK 688
62266 553
27252 663
K87A3 311
J2AAJ 647
77737 19
Q4T4J 979
2QK7Q 852
Q2Q42 7
89J77 924
QT66T 992
288A8 593
QQQQ2 509
58329 622
5JAAA 356
97364 999
38576 806
55K67 491
KKK8K 215
T2TT4 398
6666K 412
Q9829 583
385K8 348
88A48 235
76K8K 656
K4K44 204
A42TQ 712
49K4K 245
22266 297
T3AAA 177
72294 636
TTQTT 907
5JQ95 762
KK777 824
4Q294 835
T9722 79
55Q6Q 683
666JK 726
27A64 457
494J4 561
52255 230
37335 675
T9383 911
8543K 247
67QA8 659
QJ886 886
2QJJ7 261
K29K9 339
64Q84 497
6T6TT 203
K88K8 25
AA5AA 882
59925 256
K995T 382
K7777 734
55888 371
A7J28 710
JTATT 480
T7JKJ 817
A4Q46 887
KJ4JK 827
JJ8JJ 589
4A766 878
36596 511
A4QQ6 266
5JK32 669
7J372 521
K949J 325
3A633 218
25Q6K 110
44K48 406
69668 893
2QJT6 864
4QQQQ 216
5K555 184
TA969 616
3T573 876
A5K9J 160
J22KA 637
48575 316
75997 391
38558 903
35535 793
J2J42 933
J74A5 92
9K457 771
T57K7 111
TJ926 978
89K4A 274
2Q344 153
TJTTJ 199
994AA 259
3Q724 421
66366 34
Q444J 909
3QQQJ 188
9AAAA 769
A974K 35
99959 922
99646 159
22225 46
9A3JJ 257
T2J9A 133
7527A 171
88868 36
23322 341
T99J7 797
QQ8A7 461
AJ2A3 138
55AJ2 16
AAAQA 254
57332 623
A3333 22
T37K9 597
44QT4 713
J7T6T 516
Q888Q 896
Q22QQ 222
2783Q 11
75779 959
642J5 842
T9TT4 580
6JQ95 392
A355A 649
53676 271
3J353 643
Q28Q4 499
44J5J 702
Q97K2 833
433A5 570
99979 459
AJT44 652
663K6 789
63399 994
AATJT 65
4J8J2 212
KQ353 373
A53K4 180
J9797 846
TTT98 686
7KKKA 868
88J3J 372
9T5KQ 482
J5Q8A 514
9588K 695
JA73Q 752
97TTJ 779
QT888 405
QJ9Q5 293
T3489 481
AAAAT 940
KK4KK 662
84A9Q 841
2Q224 278
A2K84 548
66569 232
4T4QQ 5
AAAA8 17
K95AK 617
97858 892
88A2K 72
42J2Q 448
993K3 740
7T97T 150
444T3 393
333JA 700
J7Q4A 90
4KQ3Q 402
T3TJ9 844
44864 820
J29AA 913
23293 651
Q9939 777
666Q6 191
A2288 745
8338K 796
3J9Q7 241
48854 85
J6266 305
9QQ53 821
AT497 655
ATAA8 943
6AA66 627
9Q999 895
A563K 24
22722 221
7J35J 336
76687 826
6A79A 487
94944 148
22A28 223
J55TQ 829
39K92 306
86667 178
QQQQ3 8
93A33 413
JQ777 930
K8TQ8 440
JJJJJ 666
68T72 432
577J4 828
72275 926
9K85T 975
T4J27 618
J882Q 725
23323 308
T55TJ 977
23272 408
48QQQ 260
J5565 45
Q98Q9 262
444T4 540
88K48 424
3J3J3 890
TQ353 786
9Q222 201
5T443 142
AA6A6 14
Q7447 136
7T55K 196
79433 818
3QT3J 602
Q7QQQ 114
77877 410
33955 485
474A7 193
7KA7K 530
33993 626
6QQQQ 694
2J248 956
62A28 639
TJ9QQ 696
6JK52 569
42844 76
44322 519
Q22J2 840
J6J66 805
Q5Q5J 185
QAJA6 750
48896 95
2T2TT 57
243J7 182
49279 231
99J99 377
JQ324 243
55984 407
QJ68T 290
5Q47K 324
A349Q 170
8Q8QQ 469
K2JJK 625
TTJTT 501
J4444 81
47A44 812
2TJ23 594
Q622A 873
JJ8AK 587
5T5TK 197
899Q7 606
8TJK9 380
K68Q5 454
KQTK6 335
6K668 207
QQ6T6 164
38J37 682
2JJ2K 506
72277 650
7J728 934
883T8 62
Q2T72 985
J25T9 464
85657 429
J2AA2 780
66668 206
KAKAK 291
3KKKK 279
5K33A 234
82228 757
J6QQ4 251
Q3Q57 973
QT342 80
33Q8Q 869
28546 515
443KK 296
44785 172
JKT56 438
27A47 179
64789 925
Q6KQ5 642
227J2 488
5264T 86
2A57A 628
A64TK 369
4T42T 77
6595J 108
38247 91
J5K8K 730
5AQJQ 723
K8KKA 604
92226 705
2J2AQ 676
6AQQA 870
TTTK9 147
A28K3 984
K2K2T 670
2TT35 135
JQT42 546
JA696 9
K3K39 815
89T2J 880
4J3TT 132
K4K62 560
8742Q 242
K75K5 403
5J55T 301
33733 718
7Q777 507
878JT 355
8J53J 598
2J442 512
AAJAJ 26
69966 252
6AJ2A 654
A5A55 329
578A3 214
QTJT9 955
86838 525
78KAJ 843
66J79 557
J22T2 573
K77T7 141
6Q568 1000
KKKK5 741
8426K 921
2K69Q 539
6AKT2 258
Q33Q6 559
T627Q 389
Q2489 856
44544 456
AQQQ7 116
Q6J76 965
TQTQT 808
QQ35K 838
37T5Q 155
KKKKJ 281
4Q4JK 632
8A8A8 384
98T82 365
33JKT 404
2A868 474
3J8J2 505
2K22Q 145
9T9TT 74
78888 298
86A5Q 571
6K56T 648
24727 263
KK9AA 809
6T6T6 638
67K9A 319
22T22 415
A92QQ 127
8J9J9 400
Q59QQ 862
73337 75
QQQQJ 761
8JK42 233
3K6K3 15
5T737 381
2QT24 395
88J8Q 93
AK747 37
42747 798
92666 54
K6AKA 490
QQ235 782
AA4AQ 139
J22TT 954
66JTJ 68
K9A5T 792
9Q56Q 837
63365 889
K53A8 82
28886 810
46626 47
AJ443 442
TJT33 386
A4822 338
K22J2 238
99323 961
J632Q 479
Q6222 848
3JQQ3 119
9QQQQ 703
22388 900
333J8 803
88333 950
73K47 280
67KJ4 30
7QA7A 716
J864Q 974
Q5T75 565
777JJ 787
99899 288
76Q77 971
29442 679
TTTT7 126
A448T 317
97Q4K 347
729JQ 200
T8T8T 664
77747 894
K6AA6 55
88848 48
8QQQJ 743
KQQQQ 310
J78TT 43
66K6K 323
23J39 292
7Q49A 937
32T95 951
A3A92 211
3QJ5J 12
77KAT 304
44763 715
8QTT7 366
45JQT 320
QQ6KK 620
3T7JT 465
Q866J 538
J6T94 409
2222J 270
38982 321
JJ2QT 332
ATT8A 69
QQA4J 542
TKJKK 801
5A5T5 884
TT9TT 23
7K343 719
33453 96
K82QK 349
Q6KTT 859
477TJ 674
QQAAQ 754
4J5AK 105
2JA22 224
QJJAK 449
QKT4A 929
KKA9K 968
J399J 788
J333T 162
A394A 699
QQTAJ 783
2976Q 949
75575 658
J4KKK 137
Q44TT 309
5555A 872
4A444 78
5KJ5K 385
3AK32 967
Q55J7 898
222A3 428
76787 158
52623 1
72Q8A 267
55Q55 756
36363 282
4444K 661
6KJ44 857
9KKJK 220
9T7AJ 165
44QQ3 970
67746 794
5A2K2 736
75559 582
88988 166
58533 720
77792 51
6Q22J 665
TA77T 275
2K86A 478
566QK 799
9KJ79 289
55646 120
AAAKQ 383
3A23J 942
54225 646
8AAA8 103
6T256 946
82J66 240
T69J7 463
555T5 202
99888 219
75936 64
37K99 747
43A44 58
652TQ 981
2JJ43 947
4A25K 520
K9J99 989
22223 144
4433Q 225
2KKK5 352
53577 226
888TT 581
KKKQQ 244
JQ5QJ 129
7KKK2 822
66976 595
74774 708
T23QA 49
68A6A 529
A3Q3A 885
4Q8J4 39
3JK44 547
A4KAK 755
QT736 414
QQTQQ 527
77757 342
KJKKJ 161
T4TA4 541
Q2583 417
88K2K 605
ATK5J 89
88T77 315
K54K7 441
Q3994 276
J3666 370
89K89 861
3564A 831
AK394 194
6J76K 709
2T748 343
4KJ69 550
TKKTT 653
K5K55 399
T6T75 192
6T226 248
KJ665 330
5J55J 853
Q7577 552
74Q4Q 115
JA8AT 879
KKQJQ 285
33633 599
586KK 434
4334J 374
4785K 987
K45K5 963
J3T4Q 915
JT498 32
88828 492
JA87T 766
TAA3T 443
J4729 210
7369Q 584
64446 94
33T33 146
35Q5Q 190
82878 972
8QJ55 566
8888J 326
KT2QQ 640
3JAA3 273
J787J 564
74KQJ 904
87K36 237
KKAKK 697
35335 854
66556 590
KA575 998
6495A 758
K99QQ 181
3223K 635
Q6444 189
9QKA5 563
6Q6Q6 609
2KJQA 156
92292 176
7QQQ7 804
82TA4 816
J6A6A 67
TQJ8T 693
56KJK 518
89589 966
6QA8J 396
93333 450
QQQQ8 851
QKKKK 722
A4AJT 778
7J7T7 667
JQQJQ 836
7T4T4 430
8QTJA 671
353A7 125
66343 871
556Q5 431
388J3 522
T6636 704
2TKJ3 140
77KJ8 800
56AA6 217
T349A 205
KKK22 770
J6AKA 379
JT2TJ 496
TQ69J 832
9KK9K 916
3524J 691
JAQQA 124
33Q66 362
J7A4A 149
6846A 753
88838 613
6QQ96 914
2888J 908
QJQ4Q 819
89K7K 742
5J86A 995
55559 113
2JKJ4 41
68866 524
22999 375
4533T 486
27975 991
22A22 795
KQKAK 781
JTKT3 363
9T943 919
58585 714
54J45 143
Q4664 657
JK663 416
28Q22 517
65KK3 168
KQ7JQ 477
QKQJA 455
62T97 458
Q2KJK 938
23K7J 678
36796 721
79268 612
9Q5QA 567
89Q88 768
KTJTQ 681
KA639 97
32J85 134
J96A5 532
88885 269
T69JT 823
KQ6Q6 733
AT2AA 63
2QJ69 84
99A9A 748
TAQJK 830
K5T88 446
42449 790
33335 578
96J24 10
J8K4T 358
548J5 615
339A8 855
AJAA6 498
37J32 508
666J8 735
3A7JA 760
KAK57 729
J226J 899
28JKQ 591
7J75Q 312
Q282Q 66
6J222 545
727A7 775
55KKK 433
868JJ 29
6JK87 186
9KKKK 641
4T4J2 727
79JK4 556
J99A9 923
TTJJK 21
TJ685 345
QA9QQ 645
66323 3
66665 910
73A7J 388
KJ3K2 732
77793 660
QTA6T 988
66888 920
Q3393 208
J4TJT 600
88J8J 701
82T3J 53
KK7A8 772
J77KK 425
K7TTT 337
K58Q3 802
6T4T4 737
KKKK7 453
K9599 99
AAAA7 476
TKATT 728
3QQ3Q 346
49A98 123
95599 286
7K7Q4 38
AA644 634
J9J8T 40
4JJ48 246
77J22 986
6J633 906
ATA6A 376
646A3 359
KKQT7 535
Q22Q6 785
6J666 502
28755 607
852K5 44
AA2TJ 213
A6TJT 847
J6A44 452
9T982 687
6K8K8 59
TT6AT 87
63222 776
39JK3 849
J5575 834
8JAQA 503
49JAK 614
3T34T 544
87788 451
3475Q 351
836J7 990
8Q585 866
48389 368
2AAAA 534
786K4 489
785Q2 689
A9A59 706
9KJ22 891
T4698 621
63TQQ 334
264A5 596
4T3AQ 394
655A4 331
45TQ9 52
A5999 630
77337 858
KT479 707
58778 152
79869 881
JKQ84 344
279T7 495
8388Q 551
3QJ38 877
T3TTA 445
6Q6QA 905
94426 619
79669 576
75577 774
8T888 962
46J44 773
74J88 268
AA23A 690
9666Q 996
A8T82 969
Q54Q5 932
32942 420
777J7 173
J452K 466
T85T8 322
6556A 807
22727 287
2J22J 250
3264Q 401
Q7366 939
4QKK4 875
53528 295
99963 294
K5AQ7 20
7A9JQ 523
2779Q 437
K2J44 300
AK4Q5 426
2A9AK 471
77997 239
22422 549
3T338 151
5T4J4 42
3K23K 680
82J28 901
AQQQ8 423
KKK29 427
T8TJT 187
23333 314
84JA7 931
Q5TJT 122
2222Q 169
K2937 888
6969J 980
QQ2Q7 328
K7436 435
AJAAA 724
7Q5QQ 302
TKKK3 131
K5QKJ 673
45229 588
33J32 982
2AK9K 558
8A88K 444
T26K9 411
Q9653 117
QJJJT 860
37Q33 554
396KT 130
68262 983
44J4J 672
77827 106
266Q6 367
842AJ 749
76363 644
448A6 631
22622 121
QJ39A 361
73376 318
ATAAT 354
A2KAA 390
93T3T 562
76TKA 307
JAK83 18
2684T 825
K7T36 284
7J3A3 483
49TA8 953
Q343Q 6
JJQQK 592
55255 945
K8K8K 867
53555 717
AA36A 227
69A48 555
K8885 767
9929J 364
64999 460
J9333 157
49994 397
JTKJ6 764
TTT4T 422
3K334 935
5J555 711
JK863 960
Q8J9K 624
Q5QQQ 473
9988J 88
AA99A 976
54542 611
4Q8Q9 31
9AJ89 912
5T52J 533
K4K22 360
54555 579
53993 255
44446 863
J373Q 731
22525 601
Q7JQQ 350
5J597 883
QAQQK 936
42434 585
6TT6J 739
+1000
View File
@@ -0,0 +1,1000 @@
TQA26 14
66656 612
JK3JT 442
A6QQA 214
Q3777 131
J2K8J 180
J56KK 578
33699 532
999K4 605
4J445 884
59A5A 381
86686 419
7T5KJ 92
47883 178
749K3 2
7K6J3 675
8J22J 869
47463 168
2A5K3 597
27332 465
4AQ9K 236
59TJ5 883
5TTTQ 333
A8QAJ 208
JAJ95 380
8688A 265
34K62 525
KT7J7 709
A5A5A 890
7347J 935
6TQ57 973
888K8 345
J5456 33
8T8T4 456
3J942 88
QJJJA 727
75333 479
K6622 369
T468J 608
835A7 107
67AA7 390
QTJ9Q 25
Q56Q3 579
7K245 227
36857 327
8J7K9 524
7AAAJ 277
JKK4K 352
43974 576
2QJ22 482
99JJ9 484
AJAQQ 341
8222K 976
JA57Q 84
A593T 725
9T494 581
TKTTT 941
KJ55A 439
9444J 137
4423T 504
K9J96 944
6K9JQ 656
2Q34J 48
8T87Q 679
5J955 27
Q3T4T 416
J8888 972
5Q298 257
64463 937
44K4J 708
KQQQQ 622
TJKTT 800
9394J 63
TJ639 660
K4JAQ 119
9838Q 788
76K4A 38
J86KA 768
3AQ3A 617
J2592 40
QAK68 761
98999 620
J4T34 963
2A979 483
95JA8 336
A33AA 54
TTT33 518
QT759 212
A7A3A 999
KJ6AK 485
99339 921
TJ3A4 968
2TKTT 573
28626 844
9KK8K 79
7QT7A 57
66777 493
JJ355 676
AJAAA 176
AAQA3 522
T4KJ4 308
375K3 658
J7K75 864
JA275 669
76T45 507
AJT92 975
K5434 346
942Q2 598
JA33A 495
3JKK4 39
2AAJA 399
6555T 296
7962T 787
KJK2K 764
684JJ 998
6JJ36 52
64K66 838
JA8K3 901
3Q7Q3 774
9JK99 666
3TK6J 355
KKJ25 503
86658 584
T4T42 268
Q4238 530
T632K 700
TJTTJ 571
T7Q38 747
AJ6KQ 150
2QT22 885
KJA4A 784
87667 859
63994 570
Q82A6 331
TK9T6 124
J5K5K 140
TKAJA 211
59AAA 683
89J57 694
TQTT9 122
59996 715
73TQA 397
AJT3T 420
85882 777
AA4AT 175
4K4K7 670
8JA79 19
QKKJ8 340
9TTTA 243
77QQ7 314
22237 22
656QK 911
8K79A 847
4K466 734
77979 924
4J848 949
J72K4 388
77JJ7 741
77477 724
8558K 444
668K9 441
448T4 820
AQA7A 629
Q93J3 732
4344J 582
JA2JA 623
44422 735
3444Q 652
5TQQQ 929
A5T6J 216
855JK 808
Q7QKK 887
3J433 297
QJQ77 742
6JJ99 492
2QA2J 717
326AA 704
JJJJJ 194
3QQQJ 550
4J424 445
64A53 201
9J5AA 718
A8747 438
33788 989
3K399 255
T4343 400
444J4 382
3J3J3 12
J7552 228
352Q8 812
8A833 762
89638 940
42AQK 577
6TT68 326
AAQAA 102
4A37A 647
TAJQ7 991
85585 395
66366 406
9Q9AQ 177
K6K6K 785
2T228 143
K9Q4Q 109
T7999 462
28294 978
2T3J7 515
A2AJ6 886
AATAA 508
KJ73J 86
7AQ26 376
6K97T 163
A4AA6 537
JK555 726
2TTK5 356
98AQ8 601
2JJ4K 771
K2386 791
55888 254
555JJ 690
799KK 378
44A62 786
4338K 246
338J3 688
Q39J2 139
22J52 338
6KAJ5 933
95J98 332
67K4J 317
4K545 592
9Q929 852
68872 157
59535 548
AAKJK 615
36K97 758
TQQTT 394
QQ8QQ 926
Q5K9Q 75
JJAQ6 637
JTJ32 275
22TQA 729
KQK3K 203
43J86 104
A6663 11
9QJT6 908
AT3A6 430
56245 827
6Q334 604
77T7T 841
TQK68 668
22A2A 773
62TK6 892
8K898 912
Q3Q26 411
59678 26
43924 451
AT3K3 952
78788 16
24229 71
J947T 849
5K5Q2 897
92332 42
TT3T4 32
47995 686
99T99 749
K8QQQ 408
82889 846
A6A22 93
4A76J 590
62222 795
TTTT8 316
7QJ68 696
K9J9J 913
944JJ 135
77757 722
65J66 707
J7838 4
2T895 802
2AAAA 325
Q855Q 619
95223 148
87989 706
K4A79 96
22T86 60
A5AAA 43
Q6666 339
54445 320
88JJ8 262
36AA9 461
6J6JQ 121
8K7T6 114
9A863 377
T7TA8 126
JJJTT 415
64JTK 289
K39K3 757
54K89 737
73377 372
T5389 365
4949K 304
87787 763
KQ33K 367
Q75TK 721
999QQ 934
46647 433
88886 803
7J2AK 888
KKTKT 10
222T2 440
JA78A 239
J6KKK 610
AAA8A 166
65J62 545
57355 455
5AQ43 240
KKTKJ 59
3J337 170
J5AK4 872
TTQQJ 811
TTT7T 627
Q8877 588
T5368 337
A4K3T 662
9AAAT 136
TJ5K5 402
332A8 89
T6T6T 280
T6985 603
966Q9 681
88444 458
27JJ8 473
66669 5
4JJ48 881
44426 335
88A8A 85
A5A36 323
7QQ57 984
464T6 745
636QA 155
88TAQ 879
62874 421
535T5 50
4Q444 470
83432 501
24444 586
47774 539
KJKJ9 53
A4355 920
QTKKK 290
333A3 540
TTTAT 965
28622 611
35QA9 387
94J48 797
699T8 123
66266 422
QQ44Q 919
8J9KK 974
Q9Q76 685
66J66 945
7ATTJ 334
66KTK 904
TT484 932
52557 792
2828J 995
JJ9JK 635
9745J 55
22299 549
92QJK 222
QAA7J 531
7A5J8 358
22KK2 544
27Q23 273
AJ88A 602
33A6A 459
22T26 232
4AATT 174
T5342 743
55255 979
Q88QQ 284
222A2 680
3QQ33 554
K2KQ2 950
AAA6J 650
5Q333 62
7J574 37
38KK8 360
K2K2K 760
4T9TK 463
6Q67J 472
66686 778
44J4J 990
Q3993 655
77J27 389
TTQ27 35
277K8 446
27J42 428
KK4J4 798
QTK6J 199
4344A 457
TQTKQ 977
8833J 237
99TJK 147
6Q9Q4 313
TTJKK 98
33833 460
83T3A 805
TJJ22 754
5TAJK 632
T293Q 191
55757 70
2TT8T 851
7Q575 61
22K4K 828
8T288 204
A8AA8 928
KJ68J 697
45AAJ 213
8QJ75 693
23KKK 319
Q2Q22 969
224J4 821
44Q33 583
34KJ3 342
4JA57 687
88T2Q 354
989A6 51
AAQA9 631
5A57J 311
62266 77
2A84A 132
99JKK 234
88899 776
K3395 6
968JA 830
6J444 282
QA55Q 251
39K99 209
4A69Q 790
77K57 562
T5QT5 115
56455 134
T3TQQ 283
46A6A 413
62T67 626
5757A 371
98A47 642
2T653 813
2888A 322
TTQ8T 454
93333 876
28AAA 580
QA63Q 196
2Q5QK 184
48TTJ 300
9JT79 306
77T77 930
6K666 957
6J696 417
8J588 703
666TJ 673
QKKJ7 233
577AA 286
8J775 781
939KK 866
34444 558
4A4AA 221
523QT 630
8K259 651
2T34K 716
6K2T5 8
88T83 551
Q34AK 142
4444T 7
JTKT2 621
JQJJQ 288
38344 599
99292 74
Q36AA 206
52255 871
33J92 188
K27QA 318
66268 513
29QA6 613
74J74 815
5KK6K 895
Q9J9Q 511
6J33J 158
QAQQA 903
KTQQQ 305
2T759 958
A796K 108
63266 568
KTT7K 691
Q5A5A 186
47787 267
6T6TQ 58
56472 891
K7953 648
99A9A 486
Q78K2 249
99799 705
2K62A 671
6TTJT 392
4T44T 878
44KKK 410
KTAQ7 423
222Q2 244
4J324 401
63636 575
9K54J 856
K7K77 755
2K222 160
3J644 711
3355J 259
A9995 664
43586 909
A4744 574
Q7337 309
7QQ27 161
J8575 374
9K99K 636
7TJT4 674
79888 505
K3AJ5 730
K4QJK 427
99TJ9 263
6963T 905
3K3J5 474
TJ4J8 806
5TA38 437
866J6 807
2T454 44
63A4J 865
879T8 527
A5282 217
53737 951
44Q9Q 634
TTJT9 210
QK67K 192
33A3A 915
88Q8J 125
QJ2QQ 256
2888J 20
2786T 391
J27J7 938
2AAT5 521
544Q4 528
A4645 30
AKAA2 526
44535 835
KQ33Q 585
66JJ6 818
9979J 138
TKKKK 661
KA225 278
Q8888 794
K27QK 916
83323 494
39969 684
53359 986
77J73 299
5TK9J 782
222JJ 713
3Q383 753
46466 298
QQQJJ 875
Q2394 860
QA5QA 988
8K5K9 877
7Q78Q 68
AA6A6 923
J565K 29
52766 301
8598Q 159
KKK8K 824
8KTQ5 49
66486 41
45459 842
67676 223
44283 971
22T5T 836
88857 164
8K492 250
939J9 900
K5J9K 779
5Q692 145
8T88T 907
55535 31
8K822 609
9TQK9 67
6762J 435
T5T5T 780
4K442 152
657J6 202
44494 349
78377 925
32858 882
276Q5 359
49526 509
2J623 918
4222A 914
TTTTJ 939
255TQ 179
KJ42T 898
79268 404
648K7 189
6T7J7 488
37Q63 538
K366J 469
KKK67 156
998K6 242
QQQ7Q 560
33223 231
9A999 167
28228 961
JJK2K 141
KKK46 633
KT3KA 845
A2Q2A 667
AA9AA 471
A663A 76
J966Q 996
77J76 127
74JJ7 748
6QQQ7 303
8AJ44 18
J2J34 480
A289Q 195
8335Q 266
QQ2Q2 385
45K4J 870
48JK6 1000
T9949 294
2585K 272
7J77K 809
J53KK 657
AAAT5 347
72J8K 476
TQ77T 910
29Q7T 767
4TTTT 663
642AA 292
37QQQ 171
86Q74 97
96J88 34
QQ7QJ 618
77772 546
99559 23
AJ666 295
AAKAK 964
K8Q32 120
8QAK5 563
A9K9K 45
3475K 362
95999 739
482TQ 36
5Q555 452
854Q3 894
QTQQQ 561
55755 99
899AJ 235
QAQ22 502
75353 638
K6A87 572
J2KT7 366
KA39K 144
8AAAJ 409
66753 766
TT626 510
AJ999 418
42222 983
5J577 994
262KK 330
99992 701
4K334 825
96J96 536
774K7 229
A9362 351
KA8KJ 982
J2552 594
TTT2T 810
KK24K 640
23222 162
K36Q7 321
QQJTJ 519
33384 606
5A834 500
Q35Q2 379
A7888 434
595J2 47
2K7AA 728
AA66J 9
AKKKA 373
53335 328
447J4 514
KT7K7 21
785TT 253
3J783 720
7J2AQ 405
56Q5Q 447
Q647K 94
28488 207
694T2 714
KJKKK 78
8T866 130
274Q5 672
89992 312
J2242 350
QQ988 899
3T3T3 464
Q2226 752
55222 639
7T9T9 271
Q8884 832
2Q92Q 516
46886 817
77J7T 829
AAA9J 80
35J97 555
358K7 692
ATT6T 678
K2465 698
A2A59 46
58T24 956
8ATA2 804
AAK3K 751
28897 649
QAQKQ 854
7T776 353
26226 426
5566T 13
8KKTK 857
TT44J 512
QA29K 172
A3AAA 28
6TTQT 993
8TTJT 922
44TT5 942
K67QT 699
AA77J 927
J8JJJ 153
4T474 73
4QJ8T 475
86386 796
AA2QK 218
86A4K 205
78J84 481
27K3T 260
AAKTQ 641
6QQ33 467
3K333 279
62888 889
8Q388 185
Q88QK 490
9494J 24
5T888 783
36633 769
8T484 258
82878 987
J3336 643
TKKAK 276
822AJ 429
72727 917
254JK 113
58888 843
AK537 624
QQQJ8 659
J3366 274
ATTJK 468
5KKK2 72
AAAKA 533
5525J 962
Q6QJ6 165
5K424 607
94KK9 66
43544 487
JJ38T 712
6K6KJ 90
J7788 936
75522 625
K6KK9 955
AJ7J7 765
K7QTQ 407
37333 837
82J83 523
2A526 543
99TJJ 238
33343 997
44446 361
8868K 432
9J989 82
49999 65
5TQ78 966
AAA48 534
76J5J 946
J9J25 187
5T973 744
KK562 816
486A4 324
569TQ 269
3AAT4 343
TQTTT 386
T56A9 449
Q844Q 535
T8T25 281
QJ5J5 858
AKTK8 364
33532 315
92959 943
999A2 198
TAQ6J 770
29295 616
AKA7Q 833
55A5A 896
KK49A 396
ATJ84 197
73K87 383
6A56A 478
7KQT3 775
49A93 110
2928A 736
5JK35 95
53JQA 261
TT399 443
57779 287
77296 220
3T334 436
54K87 756
45455 393
647J4 868
5555J 498
K877K 173
646JJ 589
2JJAJ 960
7T5T6 293
T3K3T 118
TJA63 855
7K7AK 403
68754 614
J5628 822
J93TT 245
JQJQ9 874
32JT2 823
7AA77 948
AQTQA 56
48986 252
9K382 116
TJ9T9 230
Q7632 193
998K9 750
KK99K 491
Q57J2 219
T58T9 596
66T6T 424
QK354 953
66652 863
23J33 151
7J337 653
3J247 215
A7KJ5 302
A555K 654
KQ9TT 363
99Q49 370
2JJ65 587
7TAAJ 553
KKK68 826
77755 850
J74T2 959
2TQ2Q 954
ATJ3Q 344
45448 557
5JJ5J 738
T3278 595
465AQ 520
97Q82 665
99779 183
KQJAA 91
KQTJT 746
Q2542 453
99J99 414
39T99 368
AA4AJ 906
8TK28 529
5A55J 819
TT4T4 853
JQAQQ 100
57T4A 970
AJAA3 834
9JTT7 291
9AK6A 902
96J94 181
3J944 593
94KQ4 375
KKKK2 556
88J99 567
JAAAJ 840
9J9Q9 128
74447 81
28288 719
32K88 225
53535 87
74555 224
6972Q 628
7JQJ8 893
2T25J 190
92226 552
Q3QTQ 591
A666A 814
26247 103
4KTKK 981
J22K2 133
3KKKK 873
KJK7K 689
6A6K2 985
3AAAT 425
22J27 839
8888T 677
6A666 569
8887Q 497
696Q3 799
99646 695
KKK5K 69
3A332 106
Q7TTT 831
96622 566
4JAA6 564
22572 600
92AKJ 931
TA8AA 848
73373 112
6666T 182
AJKJ7 645
7A7AA 496
T5555 740
J22JJ 967
24AAA 146
956AQ 412
66A9J 329
46644 477
A9939 105
Q5Q5Q 702
588Q5 384
63AAJ 466
254KA 947
8KK88 565
KQ29T 541
36K66 759
7JAQQ 431
8QTT4 992
3333J 731
44447 793
T355T 489
39723 862
828QQ 270
96999 15
333Q2 733
T774T 559
55K55 1
9J955 264
K2KQK 682
QKQKQ 801
222J2 247
97J79 3
42TT3 499
2KQ69 129
4764T 450
72K2K 83
3Q334 644
TTT88 348
2Q223 310
J43A3 880
J4229 64
4QJ8A 17
43434 285
92222 772
T59K6 448
66674 248
34334 241
JK529 547
T7TT3 517
22QJQ 117
96J6J 861
QTJT4 101
Q444J 307
T2Q8K 357
93T24 789
T7K57 398
2K94A 111
9J942 200
T7J8K 646
55665 980
56555 169
79777 149
82A93 710
Q989Q 226
J2T55 542
763K2 723
QQQJQ 867
QQQQA 506
J7777 154
+247
View File
@@ -0,0 +1,247 @@
package main
import (
"bufio"
"fmt"
"sort"
aoc "go.sour.is/advent-of-code"
)
func main() { aoc.MustResult(aoc.Runner(run)) }
type result struct {
valuePT1 uint64
valuePT2 uint64
}
func run(scan *bufio.Scanner) (result, error) {
var game Game
for scan.Scan() {
var cards string
var bid int
_, err := fmt.Sscanf(scan.Text(), "%s %d", &cards, &bid)
if err != nil {
panic(err)
}
fmt.Println("cards", cards, "bid", bid)
game.plays = append(game.plays, Play{bid, []rune(cards), &game})
}
game.cardOrder = getOrder(cardTypes1)
product1 := calcProduct(game)
game.cardOrder = getOrder(cardTypes2)
game.wildCard = 'J'
product2 := calcProduct(game)
return result{product1, product2}, nil
}
var cardTypes1 = []rune{'A', 'K', 'Q', 'J', 'T', '9', '8', '7', '6', '5', '4', '3', '2'}
var cardTypes2 = []rune{'A', 'K', 'Q', 'T', '9', '8', '7', '6', '5', '4', '3', '2', 'J'}
func calcProduct(game Game) uint64 {
sort.Sort(game.plays)
var product uint64
for i, play := range game.plays {
rank := i + 1
fmt.Printf("play %d %s %d %s %x\n", rank, string(play.hand), play.bid, play.HandType(), play.HandStrength())
product += uint64(play.bid * rank)
}
return product
}
func getOrder(cardTypes []rune) map[rune]int {
cardOrder := make(map[rune]int, len(cardTypes))
for i, r := range cardTypes {
cardOrder[r] = len(cardTypes) - i
}
return cardOrder
}
type Game struct {
plays Plays
cardOrder map[rune]int
wildCard rune
}
type Play struct {
bid int
hand Hand
game *Game
}
type Hand []rune
func (h Play) HandType() string {
hc, _ := h.HighCard()
switch {
case h.IsFiveOfKind():
return "5K-" + string(hc)
case h.IsFourOfKind():
return "4K-" + string(hc)
case h.IsFullHouse():
return "FH-" + string(hc)
case h.IsThreeOfKind():
return "3K-" + string(hc)
case h.IsTwoPair():
return "2P-" + string(hc)
case h.IsOnePair():
return "1P-" + string(hc)
case h.IsHighCard():
return "HC-" + string(hc)
}
return "Uno"
}
func (h Play) HandStrength() int {
_, v := h.HighCard()
switch {
case h.IsFiveOfKind():
return 0x700000 | v
case h.IsFourOfKind():
return 0x600000 | v
case h.IsFullHouse():
return 0x500000 | v
case h.IsThreeOfKind():
return 0x400000 | v
case h.IsTwoPair():
return 0x300000 | v
case h.IsOnePair():
return 0x200000 | v
case h.IsHighCard():
return 0x100000 | v
}
return 0
}
func (h Play) IsFiveOfKind() bool {
_, _, _, _, has5 := h.game.hasSame(h.hand)
return has5
}
func (h Play) IsFourOfKind() bool {
_, _, _, has4, _ := h.game.hasSame(h.hand)
return has4
}
func (h Play) IsFullHouse() bool {
_, has2, has3, _, _ := h.game.hasSame(h.hand)
return has3 && has2
}
func (h Play) IsThreeOfKind() bool {
has1, _, has3, _, _ := h.game.hasSame(h.hand)
return has3 && has1
}
func (h Play) IsTwoPair() bool {
_, has2, has3, _, _ := h.game.hasSame(h.hand)
return !has3 && has2 && h.game.pairs(h.hand) == 2
}
func (h Play) IsOnePair() bool {
_, has2, has3, _, _ := h.game.hasSame(h.hand)
return !has3 && has2 && h.game.pairs(h.hand) == 1
}
func (h Play) IsHighCard() bool {
has1, has2, has3, has4, _ := h.game.hasSame(h.hand)
return has1 && !has2 && !has3 && !has4
}
func (h Play) HighCard() (rune, int) {
var i int
pairs := make(Pairs, 5)
cnt := h.game.Counts(h.hand)
for r, c := range cnt {
pairs[i].c = c
pairs[i].r = r
pairs[i].o = h.game.cardOrder[r]
i++
}
sort.Sort(sort.Reverse(pairs))
value := 0
for i, r := range h.hand {
if r == 0 {
continue
}
value |= h.game.cardOrder[r] << (4 * (4 - i))
}
return pairs[0].r, value
}
type Pairs []struct {
r rune
c int
o int
}
func (p Pairs) Len() int { return len(p) }
func (p Pairs) Less(i, j int) bool {
if p[i].c == p[j].c {
return p[i].o < p[j].o
}
return p[i].c < p[j].c
}
func (p Pairs) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
type Plays []Play
func (p Plays) Len() int { return len(p) }
func (p Plays) Less(i, j int) bool { return p[i].HandStrength() < p[j].HandStrength() }
func (p Plays) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
func (g *Game) Counts(cards []rune) map[rune]int {
m := make(map[rune]int, len(g.cardOrder))
for _, c := range cards {
m[c]++
}
if g.wildCard != 0 && m[g.wildCard] > 0 {
var maxK rune
var maxV int
for k, v := range m {
if k != g.wildCard && v > maxV {
maxK, maxV = k, v
}
}
if maxK != 0 {
m[maxK] += m[g.wildCard]
delete(m, g.wildCard)
}
}
return m
}
func (g *Game) hasSame(cards []rune) (has1, has2, has3, has4, has5 bool) {
cnt := g.Counts(cards)
for _, c := range cnt {
switch c {
case 1:
has1 = true
case 2:
has2 = true
case 3:
has3 = true
case 4:
has4 = true
case 5:
has5 = true
}
}
return
}
func (g *Game) pairs(cards []rune) int {
pairs := 0
for _, n := range g.Counts(cards) {
if n == 2 {
pairs++
}
}
return pairs
}
+74
View File
@@ -0,0 +1,74 @@
package main
import (
"bufio"
"bytes"
"fmt"
"testing"
_ "embed"
"github.com/matryer/is"
)
// AKQJT98765432
// dcba987654321
//go:embed example.txt
var example []byte
//go:embed input.txt
var input []byte
func TestHands(t *testing.T) {
is := is.New(t)
var game Game
game.cardOrder = getOrder(cardTypes1)
h := Play{0, []rune("AAA23"), &game}
is.Equal(h.HandType(), "3K-A")
h = Play{0, []rune("JJJJJ"), &game}
is.Equal(h.HandType(), "5K-J")
is.Equal(fmt.Sprintf("%x", h.HandStrength()), "7aaaaa")
h = Play{0, []rune("KKKKJ"), &game}
is.Equal(h.HandType(), "4K-K")
is.Equal(fmt.Sprintf("%x", h.HandStrength()), "6cccca")
h = Play{0, []rune("QQQJA"), &game}
is.Equal(h.HandType(), "3K-Q")
is.Equal(fmt.Sprintf("%x", h.HandStrength()), "4bbbad")
}
func TestPower(t *testing.T) {
for i := 1; i <= 13; i++ {
for j := 100; j < 800; j += 100 {
t.Log(i, j, i+j)
}
}
}
func TestExample(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(example))
r, err := run(scan)
is.NoErr(err)
is.Equal(r.valuePT1, uint64(6440))
is.Equal(r.valuePT2, uint64(5905))
}
func TestSolution(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(input))
r, err := run(scan)
is.NoErr(err)
t.Log("score1", r.valuePT1)
is.Equal(r.valuePT1, uint64(248559379))
t.Log("score2", r.valuePT2)
is.Equal(r.valuePT2, uint64(249631254))
}
+9
View File
@@ -0,0 +1,9 @@
RL
AAA = (BBB, CCC)
BBB = (DDD, EEE)
CCC = (ZZZ, GGG)
DDD = (DDD, DDD)
EEE = (EEE, EEE)
GGG = (GGG, GGG)
ZZZ = (ZZZ, ZZZ)
+5
View File
@@ -0,0 +1,5 @@
LLR
AAA = (BBB, BBB)
BBB = (AAA, ZZZ)
ZZZ = (ZZZ, ZZZ)
+10
View File
@@ -0,0 +1,10 @@
LR
11A = (11B, XXX)
11B = (XXX, 11Z)
11Z = (11B, XXX)
22A = (22B, XXX)
22B = (22C, 22C)
22C = (22Z, 22Z)
22Z = (22B, 22B)
XXX = (XXX, XXX)
+708
View File
@@ -0,0 +1,708 @@
LLLLRLRLRRLRRRLRRLRLRRLRLLRRRLRRLRRRLRLLLRLRRLRLLRRRLRRLRLRRLLRRRLRRRLRLRRLRRRLRRLRRLLRRRLLLLRRLRRLRRLRRRLLLRLRLRLRRLRRRLRLRRRLRLRRRLRRLRRLLRRLLRLRRRLRLRRRLLLRLRRRLRLRRRLRRLRLRRLRRRLRRRLRRLLLRRRLRRLRRLRRLRRRLLLRRLRLRRRLLLLRRRLRRLRRRLLRLRLRRLLRRRLLRLRLRLRRLRRLRRRLRRLLRLRRLRRLLLLRRLRLRRLLRRLLRRLRRLRRRLLLRRRR
BRR = (LVC, FSJ)
BHX = (GMG, QTN)
TJD = (HQF, PBJ)
JGN = (JXR, DGK)
NMC = (VPC, CRF)
DVJ = (KMM, DFJ)
LML = (MTG, KNX)
JKL = (LRX, FRD)
FJR = (MHX, SBX)
LMC = (QNB, QCK)
LJF = (KCJ, HCT)
KTL = (XTG, NGM)
GJB = (KTQ, KTQ)
BXR = (TDR, KMK)
GKB = (VXT, NQR)
PJL = (FPL, TFX)
LNZ = (CJC, DQL)
KCG = (KDL, LMF)
PGG = (NDL, XXC)
PMS = (XQM, DFG)
CJF = (MCG, RTJ)
JTH = (PGS, SGZ)
QBS = (JSC, KMT)
DQL = (KRR, PBL)
HSF = (SNP, KJR)
XVQ = (VQR, HSX)
QKF = (PBT, XLC)
DNA = (DQL, CJC)
LNF = (RVC, TJD)
MKT = (LDX, CGC)
BXP = (RGX, TTR)
SBX = (PGT, JGN)
JQK = (HDQ, BHQ)
MHL = (TLX, JDN)
BBD = (QNJ, BRM)
MTT = (BVK, DXB)
FVR = (VLN, PRV)
RVC = (HQF, PBJ)
LDX = (LRS, KBV)
BKF = (PXH, TNB)
BRM = (XTV, NGH)
DDL = (JNG, SFF)
BBT = (BQJ, BCN)
GPK = (CVK, DDL)
TLX = (BDN, XNT)
JHL = (BRX, QBT)
NTL = (HSR, DJD)
XBH = (PJX, JQK)
PPF = (LCT, BJL)
SFF = (FVR, NFG)
HNA = (CTC, BSG)
CNG = (DXM, QFN)
GML = (NRD, TVN)
RHH = (NBT, LJH)
LDM = (DDN, TRN)
XSK = (PLB, NVJ)
NCQ = (MDN, XGT)
FCQ = (HCT, KCJ)
DRC = (JKL, JNM)
SHR = (KLX, VLH)
FTP = (DRN, DKV)
QBF = (GVS, NXK)
GXK = (XDK, LVF)
KMK = (VXV, XCS)
PKK = (QNJ, BRM)
NJH = (TKL, PQK)
BRX = (MNM, HVC)
VTD = (BJK, LML)
QVX = (DVJ, DSF)
GRM = (JCV, SQB)
RDQ = (HCG, XMB)
RGX = (FCN, TPD)
HBH = (FPR, DHX)
PHM = (JSP, RCR)
NBT = (FRG, CMJ)
XRH = (HCB, FBM)
GMR = (FDJ, NJD)
MVG = (RDJ, QSD)
BDL = (JSB, TFN)
VXT = (MBM, JND)
TXC = (QDG, LTV)
SRL = (RRX, NDS)
SGN = (MPL, CBB)
HVH = (SLJ, CBC)
VPC = (CCG, QSJ)
KCJ = (CKC, TTD)
RLT = (LLT, VVL)
RXV = (KXQ, VBR)
FQS = (STP, BHX)
SGC = (RLJ, QGB)
XLX = (HRG, DGV)
XKV = (QQB, TNQ)
SLJ = (GTB, MPF)
PKV = (CQN, THS)
RPP = (QFT, TNK)
DKL = (MFC, MFC)
BCG = (FXM, GPR)
RFV = (DRC, MPD)
VVC = (FGN, CVL)
HQB = (QNT, VVC)
RRP = (VVC, QNT)
TRS = (RCM, GHN)
QBT = (HVC, MNM)
XKS = (SCC, VXX)
TPS = (FMH, KFN)
MTS = (VXT, NQR)
FXM = (LDM, FQT)
LNB = (XJV, SJN)
HVF = (QXC, RBH)
LSG = (QHM, TSM)
JMP = (HBH, NQK)
NGM = (KDP, HHP)
HCG = (SLR, TSC)
HGX = (DFG, XQM)
DLG = (BVN, GMM)
DJD = (VGP, VML)
HBT = (XKL, JBQ)
NVJ = (GKX, PKS)
CPS = (PKJ, RSV)
SKN = (NBT, LJH)
CCK = (TTJ, SLV)
DXM = (CBN, BXR)
RJD = (XJH, SKH)
RDJ = (CNF, TTG)
PKJ = (BCM, XKC)
FQL = (SRV, DFC)
KDS = (MFB, CLQ)
QKR = (VGD, CXK)
XXC = (NFD, SPS)
PSQ = (NJH, BLR)
BLR = (PQK, TKL)
LMX = (DGV, HRG)
GCK = (CSR, CSR)
GKJ = (JHL, PNN)
GVS = (TLN, LJX)
FPR = (JCH, GKD)
VQV = (DGB, GGN)
CPF = (VMH, JQQ)
GKD = (SGF, PHM)
JNM = (LRX, FRD)
CXV = (LNF, HGF)
TNK = (RRD, HKC)
DXX = (LMC, ZZZ)
DGG = (PPF, TRR)
MLH = (TVL, PBR)
LBC = (LJL, FTR)
FVQ = (TBC, LKB)
LTF = (CBC, SLJ)
TVH = (XMS, GJS)
SFB = (TTJ, SLV)
LVF = (MBT, SJB)
XPP = (QDM, PJL)
BVK = (RPV, JMP)
VGD = (MRX, FJR)
FRD = (XBH, CDN)
LKM = (CMF, XNS)
TCJ = (MMS, PGG)
DHQ = (MTT, BKS)
HDQ = (GPH, XKH)
KTJ = (QQT, MKR)
NMQ = (VFK, VSD)
RSK = (QDM, PJL)
XQC = (KFP, HVB)
LQN = (NGM, XTG)
TKG = (XDQ, XDQ)
KBB = (VQR, HSX)
TQQ = (QDG, LTV)
SQN = (TDQ, XKV)
TSM = (TSH, MRP)
KPH = (THS, CQN)
HCB = (DVL, RTV)
MLR = (GHT, NSN)
BFM = (GCK, SLX)
GXQ = (QKM, JJL)
GNF = (HRQ, XTK)
TRR = (BJL, LCT)
AAA = (QNB, QCK)
SDL = (KJX, LSN)
DKV = (KBB, XVQ)
RMR = (MQR, CPR)
MQC = (CBV, SRP)
PRV = (KDS, FBX)
GTB = (CCK, SFB)
SNP = (PXX, SHR)
NTR = (VHT, KXK)
MKJ = (DDL, CVK)
LSQ = (HSF, RMN)
TTJ = (CBH, QKF)
DNH = (MVG, JCJ)
KMM = (KPH, PKV)
NTT = (RQK, PFK)
QMF = (BFM, PJB)
RJB = (RBH, QXC)
LRS = (MJT, BVM)
CJG = (RMR, BMN)
DVQ = (GXM, DDH)
MFC = (LMC, LMC)
XTG = (HHP, KDP)
HKB = (RDQ, TVT)
PKS = (JQM, DGG)
BJK = (KNX, MTG)
TVT = (XMB, HCG)
JNR = (JHG, JLN)
VFK = (XKS, QBH)
NPC = (PKK, BBD)
PXX = (KLX, VLH)
XLC = (NST, BXP)
CBB = (LMX, XLX)
KLX = (MSH, LCF)
CLQ = (JNF, JNC)
TSS = (MKR, QQT)
SSS = (RMQ, RCS)
QSD = (TTG, CNF)
NHG = (DVQ, VNB)
CTC = (VCN, RJD)
THS = (QRH, GPT)
KDR = (RTK, GKJ)
NTD = (CGG, SPN)
GHP = (NCQ, FCD)
KXQ = (RLS, VRM)
GNV = (BQJ, BCN)
DXQ = (QHC, FXN)
RQB = (FVQ, TNF)
CNF = (TXC, TQQ)
BGB = (QQS, LRV)
ZZZ = (QCK, QNB)
NFM = (MGV, VTD)
MFD = (DBF, KSN)
NST = (RGX, TTR)
XJV = (LGL, LGL)
TRQ = (TVH, KJL)
PPV = (CJP, VHH)
DNV = (DBM, VGJ)
JBQ = (MHL, RFN)
HRG = (JFD, VQP)
RMB = (JKJ, JGJ)
RGQ = (RSK, XPP)
KHF = (TJG, KPX)
HPZ = (BSG, CTC)
LFJ = (TSN, NMB)
MBT = (XRC, PJR)
QFN = (CBN, BXR)
QSJ = (BRS, BKF)
XJH = (RSF, VNP)
GST = (LVF, XDK)
DDN = (NMS, RLT)
CXK = (FJR, MRX)
PHH = (FPB, TCJ)
XHV = (KTJ, TSS)
VHT = (NPC, DMG)
RNL = (NHG, DVN)
TKL = (KPN, FKX)
DGB = (GPJ, QMF)
PNN = (QBT, BRX)
TBC = (NTR, FKG)
PGS = (QDT, JQL)
SLX = (CSR, LNB)
BVV = (LVC, FSJ)
JQL = (MLH, GSC)
PXH = (CJF, CKM)
LHM = (DSF, DVJ)
NND = (NTD, DTB)
MFB = (JNF, JNC)
TTR = (FCN, TPD)
HRQ = (JTD, JTD)
SLR = (TXT, JSN)
VQP = (XPK, XGB)
QHM = (MRP, TSH)
RTJ = (PXB, TLP)
QQT = (RRL, QHQ)
CSR = (XJV, XJV)
CJP = (CJG, HQQ)
RMC = (MPD, DRC)
XMS = (LXX, GPN)
HSR = (VGP, VML)
MNM = (VSS, QXR)
SJN = (LGL, LNZ)
KBV = (MJT, BVM)
KFN = (NRC, VSG)
JNC = (RHR, LFJ)
MPF = (SFB, CCK)
QVK = (GNK, BCG)
NJD = (KCG, LDB)
DBM = (MJG, MFD)
NKF = (GGN, DGB)
BCN = (JNR, MHK)
GNK = (FXM, GPR)
KMT = (HFC, CPS)
FDJ = (KCG, LDB)
LVD = (PHH, QDR)
FCN = (VDP, MQC)
QQB = (GJB, GJB)
PLF = (JNL, HBT)
QDM = (FPL, TFX)
GXM = (CLD, NNL)
MRV = (BCG, GNK)
LKB = (NTR, FKG)
TTG = (TQQ, TXC)
GFD = (VSD, VFK)
RCS = (KQQ, DNH)
QXR = (FCQ, LJF)
HMQ = (RJQ, FQL)
VCN = (SKH, XJH)
QQG = (HSR, DJD)
HGF = (RVC, TJD)
XMB = (TSC, SLR)
PJB = (GCK, SLX)
HFC = (RSV, PKJ)
JJL = (GXK, GST)
QTN = (JLV, SGX)
KDP = (GNV, BBT)
VRF = (TFN, JSB)
GPN = (CPF, SRQ)
TSC = (TXT, JSN)
CRF = (QSJ, CCG)
TNF = (TBC, LKB)
VLH = (LCF, MSH)
BCV = (JSC, KMT)
NNL = (KVX, FQS)
RVT = (HCB, FBM)
QHC = (QKV, NCJ)
VDP = (CBV, SRP)
CBV = (VQV, NKF)
CMF = (XHV, TPR)
TRN = (RLT, NMS)
JSB = (XTH, TRS)
CFC = (TVT, RDQ)
KDL = (TKG, TKG)
TTD = (BBC, GHP)
KJR = (PXX, SHR)
MTV = (GVS, NXK)
BVN = (KDR, PVP)
DXB = (RPV, JMP)
FSJ = (QPQ, GML)
PBJ = (LQN, KTL)
PXB = (BDL, VRF)
NDS = (BGB, NGX)
CBN = (KMK, TDR)
NFG = (VLN, PRV)
JTD = (PGS, PGS)
MKR = (QHQ, RRL)
JSN = (RFV, RMC)
CVK = (SFF, JNG)
FGN = (BVQ, XQC)
HHF = (RPS, QQF)
PLB = (PKS, GKX)
BJB = (QMC, GPG)
STP = (QTN, GMG)
DGK = (RKK, BVT)
JJM = (VGD, CXK)
LTS = (QPN, BCL)
LVC = (QPQ, GML)
QNB = (GJN, RVB)
RBH = (HMQ, HPS)
NQK = (DHX, FPR)
MRP = (BDT, SGN)
JQM = (TRR, PPF)
TSH = (BDT, SGN)
JLN = (JCC, FCB)
BRP = (LDX, CGC)
SJC = (HRQ, HRQ)
LJL = (BVB, PPV)
SPN = (SDL, VHM)
SDM = (DDF, LTS)
LJH = (FRG, CMJ)
CMG = (MKD, JGT)
GPR = (LDM, FQT)
QPQ = (NRD, TVN)
JCJ = (RDJ, QSD)
HSX = (CMG, SHF)
VML = (RMB, MHC)
DHX = (JCH, GKD)
MTG = (FPX, SPD)
BDT = (MPL, CBB)
CJC = (PBL, KRR)
JLS = (LJL, FTR)
HQF = (LQN, KTL)
HQQ = (RMR, BMN)
QMC = (RBP, PXD)
RPV = (HBH, NQK)
JHG = (JCC, FCB)
TPD = (VDP, MQC)
BHQ = (XKH, GPH)
XKC = (HDD, GXR)
RPS = (KJP, KJP)
QNT = (CVL, FGN)
JSC = (HFC, CPS)
KXG = (DTB, NTD)
CKM = (RTJ, MCG)
FTD = (KPX, TJG)
VSD = (XKS, QBH)
MCG = (TLP, PXB)
XKH = (HLP, CXV)
TNB = (CJF, CKM)
XTH = (RCM, GHN)
DFN = (GMR, DSS)
LMF = (TKG, XST)
FMH = (NRC, VSG)
XCS = (JTS, GRM)
GVF = (NDS, RRX)
CXM = (HGX, PMS)
VRM = (XJT, DXQ)
JLV = (QVX, LHM)
JCH = (PHM, SGF)
NMS = (VVL, LLT)
BHS = (XJR, LKM)
CKC = (BBC, GHP)
CBH = (XLC, PBT)
PRL = (QFT, TNK)
SDF = (VTD, MGV)
RVB = (MLR, XHT)
GPT = (PLF, MJX)
KRR = (RVT, XRH)
GXR = (BVV, BRR)
NSN = (RGQ, JMQ)
KJX = (TCR, MSL)
PHL = (TSM, QHM)
MQR = (MTS, GKB)
XDK = (SJB, MBT)
NRC = (DGN, BJB)
JQQ = (LBC, JLS)
JTS = (JCV, SQB)
RLJ = (JJM, QKR)
DTB = (CGG, SPN)
BRS = (PXH, TNB)
SRV = (SPC, DNV)
MNP = (JJL, QKM)
KTQ = (XSK, XSK)
FPX = (SJC, GNF)
VBR = (VRM, RLS)
KSN = (HQB, RRP)
RJQ = (SRV, DFC)
BKS = (BVK, DXB)
BVB = (VHH, CJP)
XTK = (JTD, JTH)
PBT = (BXP, NST)
PVP = (RTK, GKJ)
QPN = (BCV, QBS)
QQF = (KJP, HPZ)
QRH = (PLF, MJX)
GHS = (BKN, TPS)
RCM = (MNP, GXQ)
DCT = (DDF, LTS)
JLC = (HGX, PMS)
VNC = (XSK, CXZ)
BQJ = (MHK, JNR)
SHF = (JGT, MKD)
FXN = (QKV, NCJ)
FPB = (PGG, MMS)
JGJ = (KXG, NND)
VBM = (PSQ, QKN)
GKX = (DGG, JQM)
DSF = (KMM, DFJ)
CMJ = (GPK, MKJ)
NCJ = (SDM, DCT)
MKD = (GQG, DHQ)
CFZ = (RQB, SHH)
RQK = (DKL, DKL)
XGT = (HPQ, VRQ)
SRP = (NKF, VQV)
BSG = (VCN, RJD)
XRC = (NFM, SDF)
DVL = (SRL, GVF)
HVB = (HXS, MLD)
MPD = (JNM, JKL)
JSP = (PHL, LSG)
BCR = (XJR, LKM)
PQK = (KPN, FKX)
FCD = (XGT, MDN)
MDL = (JLC, CXM)
FBX = (CLQ, MFB)
VNP = (RGM, GHS)
HMK = (RMN, HSF)
SJB = (PJR, XRC)
JFD = (XPK, XGB)
HHP = (GNV, BBT)
TVN = (VBM, KJN)
DMG = (PKK, BBD)
RGM = (BKN, TPS)
TRF = (KXQ, VBR)
XHT = (NSN, GHT)
DFJ = (KPH, PKV)
KJP = (CTC, BSG)
LLT = (NTS, LVD)
RMN = (SNP, KJR)
GSC = (TVL, PBR)
RSV = (XKC, BCM)
TLP = (VRF, BDL)
GGN = (GPJ, QMF)
XJR = (CMF, XNS)
GQG = (BKS, MTT)
JPN = (MRV, QVK)
RSF = (RGM, GHS)
QQS = (DLG, JPV)
DGV = (VQP, JFD)
JDN = (XNT, BDN)
LMA = (QDT, JQL)
QDG = (QGC, DTX)
HDD = (BVV, BRR)
RRD = (CNG, XLJ)
QBH = (VXX, SCC)
GPH = (HLP, CXV)
CVN = (MRV, QVK)
RLS = (XJT, DXQ)
QKN = (NJH, BLR)
NRD = (VBM, KJN)
NMB = (HVF, RJB)
XNT = (RXV, TRF)
XNS = (XHV, TPR)
SGX = (LHM, QVX)
NTS = (PHH, QDR)
SPS = (LTF, HVH)
KPX = (BCR, BHS)
GNM = (RPS, RPS)
CXZ = (NVJ, PLB)
VVL = (LVD, NTS)
VTC = (NHG, DVN)
PXD = (BHH, SSS)
TVL = (MKT, BRP)
TPR = (KTJ, TSS)
MJX = (JNL, HBT)
BKN = (FMH, KFN)
MBM = (BVC, FTP)
RTV = (GVF, SRL)
GPG = (PXD, RBP)
KXK = (DMG, NPC)
JPV = (GMM, BVN)
LXP = (VPC, CRF)
RMQ = (DNH, KQQ)
DRN = (KBB, XVQ)
MMS = (XXC, NDL)
GMG = (SGX, JLV)
MJT = (KHF, FTD)
XJT = (QHC, FXN)
JMQ = (XPP, RSK)
QCS = (TVH, KJL)
BVC = (DRN, DKV)
SPC = (DBM, VGJ)
SHH = (TNF, FVQ)
VGA = (PLB, NVJ)
RKK = (JPN, CVN)
SCC = (TRQ, QCS)
CDN = (JQK, PJX)
VSS = (LJF, FCQ)
JNF = (LFJ, RHR)
VGP = (MHC, RMB)
VGJ = (MJG, MFD)
QGC = (RHH, SKN)
RKJ = (KTQ, VNC)
DTX = (SKN, RHH)
HPQ = (VDR, SGC)
CCG = (BRS, BKF)
VLN = (FBX, KDS)
BHH = (RMQ, RCS)
BBC = (FCD, NCQ)
JCV = (GNM, GNM)
TNQ = (GJB, RKJ)
QNJ = (NGH, XTV)
GHT = (RGQ, JMQ)
LJX = (CFC, HKB)
TLN = (HKB, CFC)
PFK = (DKL, LFL)
PJR = (SDF, NFM)
JNG = (NFG, FVR)
PJX = (BHQ, HDQ)
VHH = (CJG, HQQ)
RTK = (PNN, JHL)
XGB = (MLN, SQN)
JCC = (NQX, NTT)
BVT = (CVN, JPN)
HPS = (RJQ, FQL)
TCR = (DFN, RHS)
LLA = (SHH, RQB)
NGX = (QQS, LRV)
SLV = (CBH, QKF)
BMN = (CPR, MQR)
XKL = (RFN, MHL)
CGG = (VHM, SDL)
KJN = (PSQ, QKN)
LDB = (KDL, LMF)
SPD = (SJC, GNF)
VDR = (RLJ, QGB)
DDF = (QPN, BCL)
KQQ = (MVG, JCJ)
DSS = (FDJ, NJD)
NFD = (HVH, LTF)
GPJ = (BFM, PJB)
LGL = (DQL, CJC)
TDQ = (QQB, TNQ)
RCR = (PHL, LSG)
SKH = (VNP, RSF)
DGN = (QMC, GPG)
NGH = (RNL, VTC)
TSN = (HVF, RJB)
MGV = (LML, BJK)
QHQ = (LXP, NMC)
KJL = (GJS, XMS)
RBP = (BHH, SSS)
QDR = (FPB, TCJ)
RHR = (NMB, TSN)
NXK = (LJX, TLN)
FCB = (NQX, NTT)
TFN = (TRS, XTH)
MJG = (KSN, DBF)
BVQ = (KFP, HVB)
GMM = (PVP, KDR)
MDN = (VRQ, HPQ)
LTV = (DTX, QGC)
LRV = (DLG, JPV)
MHC = (JKJ, JGJ)
DFC = (DNV, SPC)
LXV = (SHH, RQB)
PBL = (RVT, XRH)
BDN = (RXV, TRF)
JKJ = (KXG, NND)
MSH = (MTV, QBF)
NDL = (SPS, NFD)
FKG = (VHT, KXK)
PBR = (MKT, BRP)
VSG = (BJB, DGN)
RRX = (BGB, NGX)
NQR = (JND, MBM)
MRX = (MHX, SBX)
DVN = (DVQ, VNB)
HKC = (CNG, XLJ)
PGT = (JXR, DGK)
DBF = (HQB, RRP)
FRG = (GPK, MKJ)
DFG = (NMQ, GFD)
QDT = (MLH, GSC)
KVX = (STP, BHX)
LCT = (MDL, KCL)
LSN = (TCR, MSL)
TXT = (RMC, RFV)
MXM = (LXV, CFZ)
TJG = (BHS, BCR)
BCM = (GXR, HDD)
FKX = (NTL, QQG)
SRQ = (JQQ, VMH)
BCL = (BCV, QBS)
LRX = (CDN, XBH)
RHS = (DSS, GMR)
CLD = (FQS, KVX)
XLJ = (DXM, QFN)
KCL = (CXM, JLC)
HXS = (PRL, RPP)
JND = (BVC, FTP)
VQR = (SHF, CMG)
VNB = (DDH, GXM)
QGB = (JJM, QKR)
CVL = (BVQ, XQC)
RFN = (JDN, TLX)
FBM = (DVL, RTV)
TFX = (LSQ, HMK)
XQM = (NMQ, GFD)
BJL = (KCL, MDL)
FTR = (PPV, BVB)
KNX = (FPX, SPD)
MHK = (JHG, JLN)
TDR = (XCS, VXV)
HVC = (VSS, QXR)
QXC = (HPS, HMQ)
RRL = (NMC, LXP)
MLD = (PRL, RPP)
LCF = (MTV, QBF)
VXV = (JTS, GRM)
XTV = (RNL, VTC)
LFL = (MFC, DXX)
CBC = (GTB, MPF)
CQN = (GPT, QRH)
DDH = (NNL, CLD)
GHN = (GXQ, MNP)
JGT = (DHQ, GQG)
HCT = (CKC, TTD)
QCK = (GJN, RVB)
SGF = (JSP, RCR)
MPL = (XLX, LMX)
XDQ = (LXV, LXV)
MLN = (TDQ, XKV)
SGZ = (JQL, QDT)
VRQ = (SGC, VDR)
FPL = (LSQ, HMK)
SQB = (GNM, HHF)
MHX = (PGT, JGN)
QFT = (HKC, RRD)
LXX = (CPF, SRQ)
CPR = (GKB, MTS)
HLP = (LNF, HGF)
GJS = (GPN, LXX)
QKV = (DCT, SDM)
XST = (XDQ, MXM)
VXX = (QCS, TRQ)
KFP = (HXS, MLD)
MSL = (RHS, DFN)
NQX = (RQK, PFK)
CGC = (LRS, KBV)
FQT = (TRN, DDN)
VMH = (LBC, JLS)
VHM = (LSN, KJX)
JXR = (BVT, RKK)
KPN = (QQG, NTL)
QKM = (GST, GXK)
JNL = (XKL, JBQ)
BVM = (KHF, FTD)
XPK = (SQN, MLN)
GJN = (MLR, XHT)
+149
View File
@@ -0,0 +1,149 @@
package main
import (
"bufio"
"fmt"
"os"
"strings"
aoc "go.sour.is/advent-of-code"
)
func main() {
result, err := aoc.Runner(run)
if err != nil {
fmt.Println("ERR", err)
os.Exit(1)
}
fmt.Println("result", result)
}
type result struct {
stepsPT1 uint64
stepsPT2 uint64
}
func (r result) String() string {
return fmt.Sprintf("solution 1: %v\nsolution 2: %v\n", r.stepsPT1, r.stepsPT2)
}
func run(scan *bufio.Scanner) (*result, error) {
var path []rune
m := make(nodeMap)
for scan.Scan() {
text := scan.Text()
if len(text) == 0 {
continue
}
if len(path) == 0 {
fmt.Println("path", text)
path = []rune(strings.TrimSpace(text))
continue
}
n := &node{}
i, err := fmt.Sscanf(text, "%s = (%s %s", &n.value, &n.lvalue, &n.rvalue)
if err != nil {
return nil, err
}
n.lvalue = strings.TrimRight(n.lvalue, ",)")
n.rvalue = strings.TrimRight(n.rvalue, ",)")
m[n.value] = n
fmt.Println("value", i, n.value, n.lvalue, n.rvalue)
}
if err := m.mapNodes(); err != nil {
return nil, err
}
steps1 := m.SolvePT1(path)
steps2 := m.SolvePT2(path)
return &result{steps1, steps2}, nil
}
type node struct {
value string
lvalue, rvalue string
left, right *node
}
type nodeMap map[string]*node
func (m nodeMap) mapNodes() error {
for k, v := range m {
if ptr, ok := m[v.lvalue]; ok {
v.left = ptr
} else {
return fmt.Errorf("%s L-> %s not found", k, v.lvalue)
}
if ptr, ok := m[v.rvalue]; ok {
v.right = ptr
} else {
return fmt.Errorf("%s R-> %s not found", k, v.rvalue)
}
m[k] = v
}
return nil
}
func (m nodeMap) solver(start string, isEnd func(string) bool, path []rune) uint64 {
position, ok := m[start]
if !ok {
return 0
}
var i int
var steps uint64
for steps < ^uint64(0) {
steps++
if path[i] == 'R' {
// fmt.Println("step", steps, position.value, "R->", position.rvalue)
position = position.right
} else {
// fmt.Println("step", steps, position.value, "L->", position.lvalue)
position = position.left
}
if isEnd(position.value) {
break
}
i++
if i > len(path)-1 {
i = 0
}
}
return steps
}
func (m nodeMap) SolvePT1(path []rune) uint64 {
fmt.Println("---- PART 1 BEGIN ----")
defer fmt.Println("---- PART 1 END ----")
return m.solver("AAA", func(s string) bool { return s == "ZZZ" }, path)
}
func (m nodeMap) SolvePT2(path []rune) uint64 {
fmt.Println("---- PART 2 BEGIN ----")
defer fmt.Println("---- PART 2 END ----")
var starts []*node
for k, n := range m {
if strings.HasSuffix(k, "A") {
fmt.Println("start", k)
starts = append(starts, n)
}
}
loops := make([]uint64, len(starts))
for i, n := range starts {
loops[i] = m.solver(n.value, func(s string) bool { return strings.HasSuffix(s, "Z") }, path)
}
return aoc.LCM(loops...)
}
+80
View File
@@ -0,0 +1,80 @@
package main
import (
"bufio"
"bytes"
"testing"
_ "embed"
"github.com/matryer/is"
)
//go:embed example1.txt
var example1 []byte
//go:embed example2.txt
var example2 []byte
//go:embed example3.txt
var example3 []byte
//go:embed input.txt
var input []byte
func TestExample1(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(example1))
result, err := run(scan)
is.NoErr(err)
t.Log(result.stepsPT1)
is.Equal(result.stepsPT1, uint64(2))
}
func TestExample2(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(example2))
result, err := run(scan)
is.NoErr(err)
t.Log(result.stepsPT1)
is.Equal(result.stepsPT1, uint64(6))
}
func TestExample3(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(example3))
result, err := run(scan)
is.NoErr(err)
t.Log(result.stepsPT2)
is.Equal(result.stepsPT2, uint64(6))
}
func TestInput(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(input))
result, err := run(scan)
is.NoErr(err)
t.Log("part1 solution", result.stepsPT1)
is.Equal(result.stepsPT1, uint64(14429))
t.Log("part2 solution", result.stepsPT2)
is.Equal(result.stepsPT2, uint64(10921547990923))
}
// first: 14429
// second: 10921547990923
// Brüt
// stops 1 steps 13201
// stops 2 steps 620447
// stops 3 steps 36606373
// stops 4 steps 2232988753
// stops 5 steps 149610246451
+3
View File
@@ -0,0 +1,3 @@
0 3 6 9 12 15
1 3 6 10 15 21
10 13 16 21 30 45
+200
View File
@@ -0,0 +1,200 @@
28 38 58 115 255 558 1167 2343 4564 8699 16328 30378 56447 105549 199601 381868 735876 1418100 2712150 5115341 9472583
24 34 56 103 191 343 593 990 1602 2520 3862 5777 8449 12101 16999 23456 31836 42558 56100 73003 93875
12 30 66 118 187 291 486 901 1807 3760 7885 16402 33536 67001 130303 246169 451478 804146 1392500 2347766 3860393
11 7 -1 -10 4 101 392 1052 2337 4631 8595 15584 28661 54781 109041 222274 453659 910327 1775963 3349730 6094694
13 26 56 110 200 360 677 1347 2785 5847 12267 25493 52275 105732 211455 420013 833076 1658291 3323777 6713131 13636877
24 36 50 68 92 124 166 220 288 372 474 596 740 908 1102 1324 1576 1860 2178 2532 2924
4 10 18 35 81 207 523 1232 2664 5299 9766 16819 27345 42607 65306 103013 177906 352348 792280 1916515 4732055
2 4 15 46 115 246 479 915 1841 4022 9326 21995 51143 115539 252570 534754 1099830 2205374 4328183 8346246 15873877
6 16 41 104 240 508 1016 1959 3670 6684 11815 20246 33632 54216 84958 129677 193206 281560 402117 563812 777344
10 24 59 127 240 410 649 969 1382 1900 2535 3299 4204 5262 6485 7885 9474 11264 13267 15495 17960
1 3 19 65 161 334 621 1072 1753 2749 4167 6139 8825 12416 17137 23250 31057 40903 53179 68325 86833
1 3 14 46 118 256 493 869 1431 2233 3336 4808 6724 9166 12223 15991 20573 26079 32626 40338 49346
5 20 54 111 200 339 551 863 1338 2203 4189 9270 22068 52271 118490 254073 515553 994838 1837662 3275301 5689494
11 19 37 74 152 315 630 1176 2019 3189 4728 6991 11599 23863 58350 151043 385257 945993 2232085 5082986 11226568
-6 -5 -1 6 16 29 45 64 86 111 139 170 204 241 281 324 370 419 471 526 584
19 44 79 123 175 234 299 369 443 520 599 679 759 838 915 989 1059 1124 1183 1235 1279
20 26 41 76 144 261 459 824 1572 3189 6707 14297 30581 65483 140200 299218 633600 1324592 2722729 5487182 10824554
2 13 49 134 316 686 1400 2714 5060 9211 16601 29879 53781 96407 171038 298877 513930 873445 1482345 2550372 4520094
7 22 55 116 218 381 645 1090 1862 3209 5540 9533 16335 27918 47680 81409 138761 235440 396309 659706 1083288
23 34 43 54 73 105 151 202 234 223 220 555 2284 8074 23894 62315 149406 340397 757350 1681105 3771572
-2 9 31 72 157 346 769 1701 3724 8065 17266 36441 75513 153008 302220 580858 1085650 1973817 3493849 6028622 10154597
17 35 83 175 326 554 878 1305 1800 2233 2292 1349 -1702 -8485 -20570 -37084 -47977 -18173 145725 659887 1980386
6 19 49 119 273 598 1257 2530 4856 8858 15310 24963 38082 53479 66865 68818 44405 -18660 -94790 -14282 809438
17 21 22 20 15 7 -4 -18 -35 -55 -78 -104 -133 -165 -200 -238 -279 -323 -370 -420 -473
8 23 59 139 312 672 1383 2710 5056 9005 15371 25253 40096 61758 92583 135480 194008 272467 375995 510671 683624
9 16 34 63 103 154 216 289 373 468 574 691 819 958 1108 1269 1441 1624 1818 2023 2239
8 19 59 140 275 481 794 1315 2308 4381 8817 18206 37692 77458 157694 318613 640892 1287715 2591041 5226414 10560561
8 21 37 57 82 107 117 88 -4 -163 -339 -377 54 1555 5117 12270 25264 47285 82709 137397 219034
22 34 44 52 58 62 64 64 62 58 52 44 34 22 8 -8 -26 -46 -68 -92 -118
28 57 114 220 416 779 1446 2651 4785 8494 14832 25483 43057 71450 116238 185052 287858 437047 647230 934638 1316054
16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96
28 39 48 62 97 180 347 630 1022 1413 1518 905 -557 -1064 7553 50137 189888 570667 1494764 3559032 7883557
5 0 3 30 106 262 542 1035 1947 3728 7269 14184 27192 50614 91000 157901 264801 430224 679031 1043922 1567158
4 21 55 119 239 461 864 1591 2913 5356 9967 18894 36631 72557 145803 294037 588486 1158435 2229571 4181885 7634411
8 11 15 33 81 182 384 805 1728 3777 8206 17321 35023 67400 123199 213865 352632 551879 817609 1139457 1474069
6 15 30 69 162 358 754 1560 3223 6658 13679 27799 55705 109973 214073 411584 783020 1476065 2758724 5110417 9373988
18 26 37 54 84 138 231 382 614 954 1433 2086 2952 4074 5499 7278 9466 12122 15309 19094 23548
3 -2 -7 -12 -17 -22 -27 -32 -37 -42 -47 -52 -57 -62 -67 -72 -77 -82 -87 -92 -97
16 32 61 121 242 466 847 1451 2356 3652 5441 7837 10966 14966 19987 26191 33752 42856 53701 66497 81466
13 35 79 160 302 554 1015 1865 3399 6061 10475 17470 28096 43628 65555 95551 135425 187047 252247 332684 429682
13 6 -9 -20 11 156 538 1364 2981 5967 11279 20495 36207 62647 106658 179157 297277 487420 789503 1262734 1993315
14 11 18 51 141 348 790 1714 3660 7803 16602 34939 71995 144184 279550 524126 950858 1671811 2854498 4743307 7687145
2 7 22 56 123 242 437 737 1176 1793 2632 3742 5177 6996 9263 12047 15422 19467 24266 29908 36487
19 34 68 128 220 349 519 733 993 1300 1654 2054 2498 2983 3505 4059 4639 5238 5848 6460 7064
21 48 85 132 195 292 468 836 1684 3739 8772 20876 48964 111327 243473 510946 1029407 1994954 3728471 6738732 11810049
11 27 55 108 210 394 696 1143 1733 2405 2997 3190 2436 -132 -5810 -16455 -34641 -63841 -108637 -174960 -270362
12 12 12 25 90 292 791 1869 4012 8064 15537 29266 54829 103647 199701 393835 793523 1623291 3344337 6885726 14081159
5 13 31 72 164 358 736 1410 2499 4070 6039 8076 9700 11088 15835 38309 120943 371965 1044017 2693426 6497234
-1 -4 4 46 162 411 867 1607 2698 4206 6273 9338 14615 24985 46510 90835 178809 345728 648682 1176574 2063472
8 16 23 40 92 216 455 847 1408 2108 2839 3374 3316 2036 -1401 -8323 -20552 -40520 -71401 -117260 -183220
27 54 93 143 215 340 581 1059 2009 3892 7603 14833 28665 54510 101519 184641 327535 566586 956321 1576571 2541779
18 25 37 63 114 201 333 515 746 1017 1309 1591 1818 1929 1845 1467 674 -679 -2763 -5777 -9950
11 23 58 131 266 508 956 1834 3618 7240 14408 28142 53779 101035 188408 352630 668776 1292502 2547568 5104551 10339633
20 30 55 112 230 464 919 1792 3444 6514 12092 22012 39486 70717 129039 244932 488666 1018738 2181538 4711697 10130222
8 15 22 29 36 43 50 57 64 71 78 85 92 99 106 113 120 127 134 141 148
8 17 18 5 -32 -110 -256 -510 -928 -1585 -2578 -4029 -6088 -8936 -12788 -17896 -24552 -33091 -43894 -57391 -74064
0 6 28 73 155 304 573 1043 1826 3066 4938 7645 11413 16484 23107 31527 41972 54638 69672 87153 107071
8 14 26 39 49 61 112 320 974 2687 6657 15139 32341 66134 131237 254984 487637 921079 1723959 3210704 5981290
-3 6 32 88 209 468 1005 2092 4276 8669 17497 35106 69812 137381 267702 517614 995199 1904592 3626038 6854228 12829699
16 14 18 32 52 64 53 40 180 979 3722 11247 29252 68383 147421 297965 571096 1046604 1845466 3146378 5207268
0 19 60 146 330 708 1432 2721 4864 8205 13096 19800 28322 38142 47820 54439 52848 34663 -13020 -109250 -281238
19 37 70 119 185 269 372 495 639 805 994 1207 1445 1709 2000 2319 2667 3045 3454 3895 4369
8 18 30 51 92 174 350 764 1787 4310 10347 24225 54843 119816 252855 516572 1024178 1975442 3715028 6825207 12270294
9 31 64 108 163 229 306 394 493 603 724 856 999 1153 1318 1494 1681 1879 2088 2308 2539
27 36 46 65 110 223 504 1178 2725 6116 13214 27417 54640 104755 193632 345950 598975 1007532 1650430 2638633 4125506
-3 -9 -19 -25 -9 63 252 660 1449 2882 5441 10155 19412 38768 80661 171586 365345 766697 1572457 3141343 6110353
9 13 16 19 30 81 256 730 1819 4041 8188 15409 27304 46029 74412 116080 175597 258613 372024 524143 724882
8 17 26 35 44 53 62 71 80 89 98 107 116 125 134 143 152 161 170 179 188
13 29 69 150 300 564 1014 1770 3055 5340 9688 18482 36824 75023 152753 305660 595433 1124631 2057879 3651414 6293380
19 39 64 101 169 299 534 929 1551 2479 3804 5629 8069 11251 15314 20409 26699 34359 43576 54549 67489
26 48 79 119 168 226 293 369 454 548 651 763 884 1014 1153 1301 1458 1624 1799 1983 2176
16 28 45 62 80 120 240 563 1330 3003 6482 13603 28310 59352 126262 272164 590489 1279633 2753130 5858989 12311553
16 27 38 49 60 71 82 93 104 115 126 137 148 159 170 181 192 203 214 225 236
16 26 52 107 212 412 806 1601 3204 6384 12578 24502 47411 91748 178785 352718 706597 1437520 2962583 6158201 12843931
15 23 44 100 234 527 1138 2396 4995 10379 21457 43857 88008 172421 328611 608145 1092295 1904695 3227218 5318970 8537806
19 35 67 125 219 359 555 817 1155 1579 2099 2725 3467 4335 5339 6489 7795 9267 10915 12749 14779
14 9 -2 -25 -60 -96 -107 -38 250 1146 3714 10678 28555 72047 172745 395881 871826 1854119 3824278 7677249 15042442
0 14 48 119 263 559 1175 2446 5004 10002 19512 37235 69743 128583 233715 418934 740144 1287614 2203656 3707527 6129775
-6 -13 -11 9 54 127 233 409 798 1797 4331 10342 23629 51210 105348 206191 384454 682459 1149765 1826027 2697892
14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 -1 -2 -3 -4 -5 -6
9 15 23 41 93 228 528 1127 2265 4422 8622 17094 34685 71869 151157 320706 682873 1452897 3076233 6455943 13379245
26 38 54 85 154 309 648 1354 2736 5284 9786 17637 31605 57512 107535 206117 399770 772302 1467138 2718337 4891512
7 2 -4 -11 -19 -28 -38 -49 -61 -74 -88 -103 -119 -136 -154 -173 -193 -214 -236 -259 -283
17 40 72 120 202 355 665 1340 2867 6327 14000 30508 64985 135242 275772 552897 1092529 2128842 4085140 7700052 14210216
-3 -4 -7 -12 -19 -28 -39 -52 -67 -84 -103 -124 -147 -172 -199 -228 -259 -292 -327 -364 -403
9 21 38 62 99 161 268 450 749 1221 1938 2990 4487 6561 9368 13090 17937 24149 31998 41790 53867
2 9 39 99 204 393 760 1519 3132 6545 13600 27720 54996 105835 197349 356668 625334 1064865 1763453 2843561 4469892
20 33 49 75 125 228 457 1004 2337 5480 12453 26893 54846 105671 192927 335020 555266 880875 1340177 1957191 2742379
18 21 16 6 5 57 270 860 2190 4774 9202 15936 24945 35235 44593 50493 54394 73951 171296 510662 1464845
10 11 18 38 71 100 71 -142 -790 -2316 -5409 -10945 -19511 -29701 -33227 -2480 138638 579164 1757487 4641596 11293649
25 33 43 67 138 323 742 1611 3346 6797 13731 27756 55976 111792 219447 421300 789851 1449309 2618271 4700169 8479106
27 42 62 88 120 169 286 615 1492 3635 8492 18826 39628 79522 153115 285551 522357 951296 1749478 3279940 6279276
-1 11 47 125 280 574 1106 2022 3525 5885 9449 14651 22022 32200 45940 64124 87771 118047 156275 203945 262724
13 21 51 115 225 393 631 951 1365 1885 2523 3291 4201 5265 6495 7903 9501 11301 13315 15555 18033
20 35 53 83 140 245 425 713 1148 1775 2645 3815 5348 7313 9785 12845 16580 21083 26453 32795 40220
10 26 63 132 248 429 694 1074 1663 2751 5098 10427 22235 47044 96239 188667 354200 638496 1109225 1864062 3040786
6 -1 -9 -15 -17 -13 13 141 635 2188 6391 16606 39556 88146 186315 377108 735668 1389501 2549183 4553679 7935653
9 15 43 117 265 514 885 1388 2017 2745 3519 4255 4833 5092 4825 3774 1625 -1997 -7533 -15495 -26471
7 22 41 65 106 207 489 1245 3117 7431 16845 36609 76972 157632 315649 618971 1188707 2234572 4109585 7392185 13006510
10 9 5 -1 3 51 224 700 1840 4321 9327 18809 35825 64971 112914 189038 306214 481705 738217 1105107 1619759
12 16 30 69 148 282 486 775 1164 1668 2302 3081 4020 5134 6438 7947 9676 11640 13854 16333 19092
1 0 10 42 98 172 270 462 979 2368 5718 12970 27324 53756 99658 175614 296325 481696 758098 1159818 1730710
8 19 38 73 142 283 562 1079 1973 3430 5708 9217 14739 23954 40566 72513 136014 262573 510546 983505 1858428
9 24 57 114 205 359 643 1184 2197 4026 7209 12582 21441 35785 58667 94684 150641 236428 366153 559578 843909
8 14 22 32 44 58 74 92 112 134 158 184 212 242 274 308 344 382 422 464 508
24 34 44 54 64 74 84 94 104 114 124 134 144 154 164 174 184 194 204 214 224
16 30 63 126 233 405 686 1187 2184 4316 8979 19130 40965 87415 185254 389023 807192 1649322 3307839 6494862 12463897
-7 -7 1 32 121 335 787 1666 3321 6479 12739 25563 52073 106047 212569 414805 783321 1428197 2513885 4276266 7040633
-2 1 4 7 10 13 16 19 22 25 28 31 34 37 40 43 46 49 52 55 58
13 27 38 41 36 48 177 688 2156 5707 13455 29337 60698 121182 235783 449463 842011 1554867 2842648 5177133 9461476
15 42 93 182 326 549 884 1374 2086 3178 5119 9300 19562 45721 111199 268798 632393 1439844 3177921 6832092 14389654
7 28 73 151 265 408 559 679 707 556 109 -785 -2315 -4712 -8253 -13265 -20129 -29284 -41231 -56537 -75839
8 5 13 42 97 177 284 446 766 1532 3473 8340 20149 47680 109278 241921 518597 1082840 2220086 4508651 9140126
17 27 40 71 149 317 632 1165 2001 3239 4992 7387 10565 14681 19904 26417 34417 44115 55736 69519 85717
24 37 47 65 117 257 594 1347 2963 6367 13474 28217 58615 120994 248715 510261 1046343 2144574 4386122 8926186 18016274
11 16 36 80 158 277 445 706 1254 2711 6703 16929 40991 93338 199774 404089 777493 1431666 2536382 4342822 7213860
0 -2 8 48 141 321 657 1303 2580 5096 9915 18799 34571 61685 107144 181982 303624 499562 812938 1310810 2096097
4 15 39 91 211 473 995 1967 3741 7078 13740 27774 58093 123376 261026 543285 1106377 2204300 4310572 8314176 15899538
-7 6 36 87 163 272 446 788 1568 3411 7651 16966 36460 75419 150039 287505 531891 952452 1654990 2797097 4608209
13 29 56 95 152 244 405 692 1191 2023 3350 5381 8378 12662 18619 26706 37457 51489 69508 92315 120812
15 27 59 125 237 417 722 1283 2361 4428 8300 15415 28528 53504 103742 210470 445527 969865 2133765 4678765 10135083
20 31 57 122 274 596 1223 2377 4439 8101 14695 26909 50338 96812 191434 387177 794467 1639641 3377468 6902112 13932807
10 37 91 200 416 820 1528 2716 4696 8091 14175 25464 46666 86122 157896 284700 501870 862641 1445003 2360456 3765020
6 24 54 95 153 251 440 812 1516 2778 4926 8421 13895 22197 34448 52106 77042 111628 158838 222363 306741
9 24 49 84 125 162 193 281 693 2172 6405 16762 39393 84782 169869 320863 576881 994560 1653801 2664816 4176661
3 10 23 57 149 386 945 2142 4499 8866 16685 30566 55492 101260 187366 352765 675303 1309938 2562335 5026719 9836291
15 29 55 109 226 481 1024 2134 4299 8344 15672 28779 52397 95981 178896 340733 660899 1294259 2533505 4914517 9388784
14 33 78 166 331 644 1248 2423 4711 9165 17861 34963 68917 136884 273538 548338 1099300 2198986 4383250 8701159 17195603
7 5 5 7 11 17 25 35 47 61 77 95 115 137 161 187 215 245 277 311 347
0 2 9 21 38 60 87 119 156 198 245 297 354 416 483 555 632 714 801 893 990
8 11 29 79 200 478 1087 2365 4957 10076 19965 38689 73433 136495 248086 439830 758518 1269449 2059289 3241351 4974534
9 26 71 154 282 459 686 961 1279 1632 2009 2396 2776 3129 3432 3659 3781 3766 3579 3182 2534
-8 -9 -1 23 70 147 261 419 628 895 1227 1631 2114 2683 3345 4107 4976 5959 7063 8295 9662
14 38 88 183 349 621 1047 1694 2656 4064 6098 9001 13095 18799 26649 37320 51650 70666 95612 127979 169537
1 4 7 10 13 16 19 22 25 28 31 34 37 40 43 46 49 52 55 58 61
10 17 33 71 156 319 593 1016 1655 2681 4550 8393 16823 35591 76964 166498 356232 749489 1545759 3118955 6149158
-2 5 20 55 147 378 896 1945 3924 7507 13868 25067 44665 78648 136752 234293 394618 652305 1057252 1679807 2617103
-2 -3 -3 12 76 250 640 1443 3044 6202 12405 24581 48599 96524 193673 393656 809674 1677915 3482413 7194006 14714566
-5 -2 2 11 40 131 388 1045 2594 6015 13162 27362 54272 103007 187497 327953 552225 896728 1406510 2133961 3135644
-1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21
6 23 51 90 140 201 273 356 450 555 671 798 936 1085 1245 1416 1598 1791 1995 2210 2436
22 44 78 135 237 421 758 1410 2772 5783 12540 27421 59046 123639 250801 493519 945638 1772306 3262446 5917591 10599023
24 37 60 106 197 375 727 1435 2867 5730 11311 21837 40990 74618 131688 225532 375442 608675 962934 1489396 2256363
12 20 49 112 222 392 635 964 1392 1932 2597 3400 4354 5472 6767 8252 9940 11844 13977 16352 18982
2 7 24 61 126 227 372 569 826 1151 1552 2037 2614 3291 4076 4977 6002 7159 8456 9901 11502
12 11 22 60 158 379 821 1618 2953 5122 8728 15159 27666 53731 110255 234858 510014 1112985 2415218 5172306 10872818
17 24 49 120 294 677 1456 2952 5715 10719 19792 36560 68444 130715 254454 501802 994701 1968430 3870295 7539464 14530122
25 40 65 122 253 535 1117 2293 4630 9184 17861 34010 63355 115342 204806 353380 588983 939636 1414390 1959381 2372399
25 52 90 138 195 260 332 410 493 580 670 762 855 948 1040 1130 1217 1300 1378 1450 1515
0 2 24 87 221 468 885 1547 2550 4014 6086 8943 12795 17888 24507 32979 43676 57018 73476 93575 117897
19 32 61 117 214 369 603 947 1457 2242 3509 5629 9228 15307 25395 41739 67535 107204 166717 253973 379234
23 32 38 44 60 103 197 373 669 1130 1808 2762 4058 5769 7975 10763 14227 18468 23594 29720 36968
4 11 19 35 76 180 439 1069 2539 5797 12662 26510 53500 104832 201057 380617 717363 1357502 2598934 5062820 10063437
10 19 23 14 -24 -121 -314 -610 -897 -761 888 6598 22021 59353 144459 331532 733040 1580211 3343069 6963206 14293206
3 17 48 105 201 354 600 1028 1847 3495 6800 13203 25053 45984 81384 138966 229451 367373 572016 868493 1288977
-4 -3 10 49 132 289 583 1147 2252 4449 8873 17855 36050 72341 142802 274973 513588 927669 1618516 2727541 4442064
19 39 74 133 236 422 765 1415 2696 5313 10758 22099 45557 93732 192181 392487 797276 1606233 3197558 6267150 12058959
-7 -10 -13 -16 -19 -22 -25 -28 -31 -34 -37 -40 -43 -46 -49 -52 -55 -58 -61 -64 -67
21 44 74 122 221 432 849 1603 2865 4848 7808 12044 17897 25748 36015 49149 65629 85956 110646 140222 175205
18 26 39 66 116 198 321 494 726 1026 1403 1866 2424 3086 3861 4758 5786 6954 8271 9746 11388
21 40 78 164 356 766 1605 3259 6420 12322 23187 43106 79841 148586 279840 535679 1042583 2055644 4079972 8092520 15934162
20 37 62 95 136 185 242 307 380 461 550 647 752 865 986 1115 1252 1397 1550 1711 1880
0 2 15 48 121 283 642 1407 2942 5832 10961 19602 33519 55081 87388 134409 201132 293726 419715 588164 809877
8 13 15 13 15 42 131 338 755 1592 3455 8105 20256 51423 127543 303162 686530 1482119 3060047 6065853 11589253
12 30 59 93 125 157 214 361 722 1498 2987 5640 10262 18599 34737 67942 137708 281702 566759 1101727 2048287
-3 10 49 127 264 492 863 1464 2440 4028 6633 11078 19417 37246 79490 183510 436575 1030078 2361565 5219525 11107638
16 33 54 90 174 378 846 1849 3867 7702 14625 26559 46299 77769 126315 199032 305122 456279 667096 955488 1343124
19 43 88 176 343 647 1194 2198 4111 7897 15598 31482 64323 131829 269087 544536 1090317 2160903 4249054 8320480 16296305
22 41 67 112 212 447 969 2039 4084 7808 14445 26357 48398 90840 175255 345646 688410 1366499 2675535 5132758 9613680
12 25 47 89 162 277 445 677 984 1377 1867 2465 3182 4029 5017 6157 7460 8937 10599 12457 14522
5 0 -7 -1 49 197 534 1225 2596 5304 10634 21018 41034 79540 154415 302881 602927 1215420 2462671 4968277 9895903
-9 -14 -15 1 65 237 627 1430 2974 5775 10594 18507 31038 50464 80459 127293 201992 324897 538038 942790 1811370
2 4 0 -10 -11 41 233 709 1684 3458 6430 11112 18143 28303 42527 61919 87766 121552 164972 219946 288633
7 26 67 150 317 656 1342 2714 5434 10819 21508 42739 84695 166680 324376 622208 1174037 2177180 3967333 7105608 12513901
12 22 38 64 119 247 532 1123 2276 4424 8309 15295 28210 53572 107038 225653 493336 1090494 2385292 5093646 10548309
14 12 10 19 59 159 357 700 1244 2054 3204 4777 6865 9569 12999 17274 22522 28880 36494 45519 56119
2 14 43 115 280 632 1341 2710 5286 10076 18959 35465 66244 123814 231609 433008 806986 1494370 2740499 4962479 8852304
16 36 82 165 307 556 1007 1841 3405 6374 12066 23034 44170 84820 163047 314653 612780 1210538 2432293 4964944 10250289
10 8 10 20 58 188 557 1451 3382 7223 14402 27147 48738 83665 137509 216252 324578 462546 619794 766166 837338
9 22 46 85 154 288 571 1200 2601 5616 11777 23672 45407 83249 146871 252546 431725 752582 1369644 2629419 5280540
16 20 35 87 210 449 878 1653 3133 6129 12402 25663 53593 111897 232285 477770 971150 1946550 3840269 7447123 14183748
22 44 94 197 405 821 1643 3250 6376 12465 24392 47913 94545 187207 371116 734593 1448530 2841203 5540681 10747619 20760527
4 15 42 101 226 487 1024 2115 4318 8768 17778 36006 72647 145461 288069 563007 1084756 2059673 3853830 7105719 12909204
15 23 48 115 271 611 1319 2724 5371 10107 18182 31365 52075 83527 129893 196478 289911 418351 591708 821879 1122999
7 6 17 48 107 202 341 532 783 1102 1497 1976 2547 3218 3997 4892 5911 7062 8353 9792 11387
-4 3 25 70 153 309 619 1270 2682 5750 12268 25628 51937 101824 193553 358902 655155 1190487 2177891 4048307 7684230
-2 4 19 40 65 112 264 766 2210 5847 14057 30979 63235 120551 215877 364424 581237 878545 1269600 1800115 2661524
18 30 45 58 64 58 35 -10 -82 -186 -327 -510 -740 -1022 -1361 -1762 -2230 -2770 -3387 -4086 -4872
8 20 59 143 292 523 844 1247 1700 2138 2453 2483 2000 697 -1826 -6077 -12688 -22432 -36241 -55225 -80692
11 12 8 -7 -28 -26 65 361 1041 2360 4662 8393 14114 22514 34423 50825 72871 101892 139412 187161 247088
6 6 19 54 113 189 264 307 272 96 -303 -1028 -2205 -3985 -6546 -10095 -14870 -21142 -29217 -39438 -52187
26 40 63 112 222 455 906 1708 3036 5116 8278 13187 21602 38439 76677 167925 383519 874229 1941697 4162964 8603981
12 19 31 58 110 209 412 843 1741 3551 7128 14215 28539 58216 120779 253209 531098 1103839 2256973 4519124 8840092
14 28 47 71 102 153 266 539 1162 2462 4957 9419 16946 29043 47712 75551 115862 172768 251339 357727 499310
19 22 38 89 208 457 958 1941 3833 7447 14380 27796 53861 104226 200137 378978 704206 1279303 2264473 3888958 6437241
20 38 83 177 353 665 1204 2120 3650 6152 10145 16355 25767 39683 59786 88210 127616 181274 253151 348005 471485
18 33 52 75 103 147 258 596 1573 4137 10313 24197 53757 114135 233848 466630 914030 1767831 3387708 6439669 12137157
16 32 61 98 136 164 171 173 281 836 2678 7743 20501 51456 125378 299753 704238 1621680 3648963 8007452 17127734
0 9 25 62 141 293 566 1037 1844 3286 6097 12096 25583 56164 124287 271914 582905 1221701 2506400 5046590 10003946
-4 12 56 141 280 486 772 1151 1636 2240 2976 3857 4896 6106 7500 9091 10892 12916 15176 17685 20456
+134
View File
@@ -0,0 +1,134 @@
package main
import (
"bufio"
"cmp"
"fmt"
"strings"
aoc "go.sour.is/advent-of-code"
)
func main() { aoc.MustResult(aoc.Runner(run)) }
type result struct {
valuePT1 int
valuePT2 int
}
func (r result) String() string { return fmt.Sprintf("%#v", r) }
var log = aoc.Log
func run(scan *bufio.Scanner) (*result, error) {
var histories [][]int
var values []int
var rvalues []int
for scan.Scan() {
text := scan.Text()
if len(text) == 0 {
continue
}
histories = append(histories, aoc.ReadStringToInts(strings.Fields(text)))
log(last(histories...))
values = append(values, predictNext(last(histories...)))
rvalues = append(rvalues, predictPrev(last(histories...)))
}
log("values", values)
log("rvalues", rvalues)
return &result{valuePT1: sum(values...), valuePT2: sum(rvalues...)}, nil
}
func predictNext(in []int) int {
log(" ---- PREDICT NEXT ----")
defer log(" ----------------------")
history := makeHistory(in)
aoc.Reverse(history)
return predict(history, func(a, b int) int { return a + b })
}
func predictPrev(in []int) int {
log(" ---- PREDICT PREV ----")
defer log(" ----------------------")
history := makeHistory(in)
for i := range history {
aoc.Reverse(history[i])
}
aoc.Reverse(history)
return predict(history, func(a, b int) int { return b - a })
}
func predict(history [][]int, diff func(a, b int) int) int {
log(" ---- PREDICT ----")
defer log(" -----------------")
for i := range history[1:] {
lastHistory, curHistory := last(history[i]...), last(history[i+1]...)
history[i+1] = append(history[i+1], diff(lastHistory, curHistory))
log(lastHistory, curHistory, last(history[i+1]))
}
log("last", last(history...))
return last(last(history...)...)
}
func makeHistory(in []int) [][]int {
var history [][]int
history = append(history, in)
for {
var diffs []int
current := history[len(history)-1]
for i := range current[1:] {
diffs = append(diffs, current[i+1]-current[i])
}
history = append(history, diffs)
log(diffs)
if max(diffs[0], diffs[1:]...) == 0 && min(diffs[0], diffs[1:]...) == 0 {
break
}
}
return history
}
func max[T cmp.Ordered](a T, v ...T) T {
for _, b := range v {
if b > a {
a = b
}
}
return a
}
func min[T cmp.Ordered](a T, v ...T) T {
for _, b := range v {
if b < a {
a = b
}
}
return a
}
func sum[T cmp.Ordered](v ...T) T {
var s T
for _, a := range v {
s += a
}
return s
}
func last[T any](v ...T) T {
return v[len(v)-1]
}
+44
View File
@@ -0,0 +1,44 @@
package main
import (
"bufio"
"bytes"
_ "embed"
"testing"
"github.com/matryer/is"
)
//go:embed example.txt
var example []byte
//go:embed input.txt
var input []byte
func TestExample(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(example))
result, err := run(scan)
is.NoErr(err)
t.Log(result)
is.Equal(result.valuePT1, int(114))
is.Equal(result.valuePT2, 2)
}
func TestInput(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(input))
result, err := run(scan)
is.NoErr(err)
t.Log(result.valuePT1)
is.Equal(result.valuePT1, int(1806615041))
t.Log(result.valuePT2)
is.True(result.valuePT2 < 1806615046) // first attempt
is.Equal(result.valuePT2, 1211)
}
+5
View File
@@ -0,0 +1,5 @@
.....
.S-7.
.|.|.
.L-J.
.....
+5
View File
@@ -0,0 +1,5 @@
..F7.
.FJ|.
SJ.L7
|F--J
LJ...
+9
View File
@@ -0,0 +1,9 @@
...........
.S-------7.
.|F-----7|.
.||.....||.
.||.....||.
.|L-7.F-J|.
.|..|.|..|.
.L--J.L--J.
...........
+10
View File
@@ -0,0 +1,10 @@
.F----7F7F7F7F-7....
.|F--7||||||||FJ....
.||.FJ||||||||L7....
FJL7L7LJLJ||LJ.L-7..
L--J.L7...LJS7F-7L7.
....F-J..F7FJ|L7L7L7
....L7.F7||L7|.L7L7|
.....|FJLJ|FJ|F7|.LJ
....FJL-7.||.||||...
....L---J.LJ.LJLJ...
+10
View File
@@ -0,0 +1,10 @@
FF7FSF7F7F7F7F7F---7
L|LJ||||||||||||F--J
FL-7LJLJ||||||LJL-77
F--JF--7||LJLJ7F7FJ-
L---JF-JLJ.||-FJLJJ7
|F|F-JF---7F7-L7L|7|
|FFJF7L7F-JF7|JL---7
7-L-JL7||F7|L7F-7F7|
L.L7LFJ|||||FJL7||LJ
L7JLJL-JLJLJL--JLJ.L
+140
View File
@@ -0,0 +1,140 @@
F---7-FJ.7--FJ7.-.7-|7F.|7FJ77F7J-|--.FLF|.F-7-F7.F.J77|--|7--|7|-J-F--7-F7.F7-F7F7F-|-|-F777L7|-.FLF|-77F7-FJF|JF--F.77J-L7-FF--7.FFF7FF7.7
|J.F|7F|F7J.J-L-|-|.L7F7JF7-7-LJ|LJ.F7.L|.F|F7FJ7.F7.|F|L7.L7L|-F-|7|L|JFF.F||F777L|-77L-|JF7FJJJLF7LL7|.L77|L7LLLJ.|..LLL7|L7-.-JFFLL-7L-FF
F7L7JLLJL-7FL7|F7-J7.-J.7L7J|.|-JF|FLFF7L-JLL|-F7-F|77|.|L7FJ7JJFJL7JJJFF.FJ||||JFF|LL7F-JF|.LJ7F.|F7F|J7LLL-7||||LFFFF77|-L7LL7F7-JL7|FF7L|
JFL7FJ7.--JJ7L||.LF|7JJFLFLF7.|.LFF7-FJ|-J-77|-F.|J|LLFF-|-7JL7-J7L|JLF7-7F7|LJL-7|L7F7J-FJ|F|7|77|J-F..FJL.|F77-7F|-FJ|J7J.--7.7J.7-|-||LF|
.|LLFJLF--J.FL|-J.F77F-77.L|L7F77F7.F|FJ7.FJ7JF7F7|F-J..7JL|..FF---|J-F|JF|||F--7|-FL7.J-J.|LFFJ-7.L7J|.7-|LJJF7L77LL||.FL--JJ|-L-F|7F-JJ|.|
FL77J|LJFJFF7JJ|J7LJ.|.LF.LL7|||7||-FJL---7.LFJL7J7|FLF7J|F77-J|JJFJ-F-7FFJLJL-7LJ7LLLJ7JLL-7||J|||L-7|---L.FFLLFF---|F--J.|.|L.||FJ7.LLL|-J
|L-J-JJ-F-F-J7F--7.F7F7F7FF-JLJ|FJ|JL7F-7FJ7-L7FJF-7F7||7FFF7JL7.-JLF|FJFJF7F7FJFFL-|.L-7J|FJFJ-JJ7.L|7.|7J-|J.||||LFLJ-F|F7-7|FF-L7|7-.|L7|
7|LF|JLL|.F.F-FJF-7|||LJL7L-7F-JL7L7FJL7LJF77F|||L7||||L-7F||.7F7FLFFJL-JFJLJLJ-F|J.F-FL7.LJ||.|L.F7|.F7.7|FJ||-J|J-J7.7-7---|-LJF|7F|-77-L-
|J.7|LF7JF|F7|L.L7|||L7F-J-F||F7FJFJ|F-JF7||F7||-F|||||F-JFJ|7J|L|F-L-7F7L-7F777.|JF77J-F7FFF777LFFF-F-7-7--LJL|-L|.FF-F.JL|.LFJ-77-F|7F77FJ
JJ--JLJL-J|J.FLF-J|||L||F77FJ||||FJFJ|F7|||LJLJ|JFJ||||L77L7|F--7F7-F7LJ|F7|||F7F7.L|.F-JL7FJL7F---7JL7L7F7.L|F--7L-L7.J-.-7JJ|L-7L.|JFJLJF|
|JFLJF|-77F-7.FL-7LJL-J|||FJFJ|||L7|FJ|LJ|L---7L7|FJ|LJFJ7FJLJF-J||.||F-J|LJ|LJLJ|7-J7L-7FJL7FJ|F--J--L7|||7FFF-FJ|JLL|FLFLJ.-L7FLL-|L|.7.FF
L-77LJJ|FJ|7J.--LL----7|||L7|FJ||FJ||FJF-JF7|FJFJ|L7L7FJF7|F7FJ-FJL-J||F7L-7L7F--J.7|F-7||F7||FJL7L|-F-JLJL-7-|FJLJ77.|7.L7JF|L|7.|---|F--.F
7JFF7||FJJJJL7J7.F-7F-JLJL-JLJFJ||7|LJFJF7|L7L7L7L7|-|L7|LJ|LJJ.L---7|LJL7FJ|||F-77LLL7||LJLJLJF-J-|LL---7F-J|||..JJF-.F7.F-7|L|7F77JFJ-L|FJ
|-|LLJF-7LJ|LL|--L7|L7F--7F--7L-JL7L7FJFJ||FJF|FJFJ|FJFJL-7L-7F-7LF7|L7F7|L7FJ||FJF7FFJLJF-----JF-7F7F-7FJL--777-7L-|JF|77LLLL7JFJ|F-JJ.L|7|
77LJ7F--7J7L7L|.F-J|FJ|F-J|F-JF-7FJFJL7|FJ|L7FJL-JFJ|FJF7|L7FJL7|F|||FJ|LJFJL7||L7|L7L--7L7F-7F7|FJ||L7||F---JL|-L7J.-77J-F.||JF|.L--J.--L7|
L77--L-7J-|7LFF7L-7|L-JL-7||F7|FJL7|F-J|L-JFJL-7F7|FJL7||F-J|F-J|FJLJL7|F7L7-||L7LJFJJF7|FJL7LJLJL7||FJ||L--7F-7-|7.F.|7JL-L7J-7JFFL--JFFL.L
..FFJL7L7-LLF7|L--JL-7F--J|LJ||L7FJ|L7F|F--JF7-LJ|||F-J||L-7LJF-JL--7FJLJ|FJFJL7|F-JF7||||F7|F----J||L7LJF--JL7|F--7LFLJ--||||FLLF7-J.FF-.F|
F-J|7L|-77|-J7|F7F--7|L---JF-JL7|L-JFJFJL-7FJL7F7|||L7|||F7|F-JF7.F7||F7FJL7L7FJ||.FJ||LJ||LJL-7-F7||JL7FJF7F7||L-7|-FJ-7LL77-F7-F|J.F7||F-7
LL7L77L-7-7-LLLJLJF-JL-----JF--JL--7L-JF7FJL7FJ||||L7L7|LJLJ|F7|L7||||||L-7L7||FJL-JFJL-7||F---JFJLJ|F-J|FJLJLJ|F7|L7JF7.7JL7|LF-7.F-FF77JJ.
FF--.7.LJLL7|.|FF-JF--------JF7F7F7|F--J||F-JL-JLJ|FJFJL7F--J|LJFJ|||||L7|L7LJ||F---JF--JLJL--7JL7F-JL7FJ|F----J|||FJFJ|7JF-J-7|JL||LLLJL7-F
7|..L-FFJJFL7FFLL-7|F---77F7FJLJLJ||L7F7LJL--7F---JL7|F7||F--JF-JFJ||||FJF7L7FJ||F--7L---7F---JF-JL7F7|L-JL7F--7|||L-JFJF7L7F7JJ.FJF-7L7J|7|
F7.L7LJJ.FJL|F7L|7LJL7F7L-J|L----7|L7LJL7F7FFJL7F-7||||LJLJF--JF7L7||LJL7|L-JL7|LJF7|F7F-JL-7F7L7F-J|||F---J|F7||LJF--J||L7JLJ.LFLJ|LJ--7JL|
J7-FJ.|7.|J-F7L7LF7F-J||F-7|F7FF-JL7|F--J||FJF-J|FJFJ||F7F7L--7||FJLJF-7|L---7||F-JLJ||L--7FJ|L7|L7FJLJL7F-7LJ|LJF-JF7F7L7L7||--|..|F7|LJ|F|
|F7LF77J.LF-LJJ.FJLJF7|||FJLJL7L--7LJL7F7|||FJF7||FJFJLJ||L---J||L--7|FLJJF--J||L-7F7||FF-JL7|FJL7|L-7F-J|FJF7L-7L7FJLJL7|FJ7|F7|F.|--7-LL|7
|L||F---F.F7LJ-FL---J||||L--7FJF7L|F--J|||||L7||||L7L-7FJL-7F-7||F7FJL7F-7L--7LJF-J|||L7L7F-J|L7FJL-7|L-7|L7||F7|FJ|F---J||F---77-|J|7L-F.L7
-7F77JJF-|7JJ.F-F--77||LJF--JL-JL-J|F7J||||L7|||||FJF7|L7F-JL7|||||L7FJ|FJF-7L7FJF-J||FJFJL7FJFJL7F-J|F-J|FJ|||||L7|L7F7FJ||F--JJ7|.L7|F|.LJ
.L.|L|.F-L|7|FFLL-7L7LJF7L--------7LJL-JLJ|FJ||LJ|L7|LJFJ|F7FJLJ||L-J|.||FJFJFJL-JF-J||FJF-JL7|F-JL7FJ|F7||FJLJLJFJ|FJ||L7LJ|F-7JF777.LFFJL|
J..L.LL|J-J-|7J.LLL7L-7|L---------JF--7F7FJL7|L-7L-JL77L7LJLJF--JL7F-JFJ|L7|FJF---JF7|LJFJF7FJ|L-7FJL7||||||F----JFJL7|L-JF-J|FJ-LF77.|L||.F
.F-.L7.|7.F7.F-7.FLL7FJL----------7L-7LJLJF7|L7FJF-7FJF7|F--7L--7FJL77L7L7|LJFJ|F7FJ|L-7|FJ|L7L--J||FJLJ||LJ|F7F7FJF-JL7F-JF7||F77.JJ-L-|-LJ
FF|-.FFF-JJLLJL|FF--JL7F77F7F7F--7|F-JF7F7|||FJL-JFJL-JLJL-7L---JL7FJF7L7|L-7L7FJ||FJF-J||FJ7L---7L7|F--JL-7LJLJLJFJF-7||F-JLJLJ|-J7|-|F7-L7
|L-JLLJL-J7F||.J|L---7LJL-JLJLJF7LJL7-|||||LJL7-F7|F7F---7FJF7F-7FJL7||FJ|F7|FJL7||L7L-7|||F7F7F7|FJ||F7F7FJF----7L-JFJ|||F---7FJFL7.FFJJ|F7
..|.|F7L77LL77J|F-7F7L--------7|L--7L-JLJ|L--7|FJ||||L7F7LJ|||L7LJF-J||L7LJ||L--J||FJF-JLJ||LJLJ||L7|LJ|||L7L-7F7L--7L-JLJL7F7LJ-7F|-7.|7FLJ
F.L|-|J.F7.|L|-LL7LJL----7F-7FJ|F-7L7F---JF7FJLJFJLJ|FJ|L--7||FJF-JF7||JL-7LJF7F-J|L7L--7FJL7F--J|FJ|F-J||FJF-J|L--7L7F7F--J|L7L|F-J|F|JLJ|J
|F-L.|.-JL7|JF-L|L------7|L7LJFJL7|FJ|F--7||L--7|F7FJL7|F--J||L7|F-J|||F7-L-7|LJF7|FJF7FJ|F7||F7FJL-J|F7|||FJLFJF--J-|||L---JFJ.-JF|JLJ|J.JJ
7-LJFJ7|J.F-.J77FF------JL-JF-J..||L7||F-J||FF7||||L7FJ||F7L||F||L-7|||||F7F||F7|||||||L7|||||||L7F--J||||||F7|FJF77FJ||F-7F7|F7-|FL-F.7-7J|
F7-|7.FF-FJ-|JF7FL--7F7F7F--JF7-FJL-J|||F7||FJ|||||FJ|FJLJ|FJ|FJL7FJ||||||L7|LJLJ|||FJ|FJ||||||L7||F-7|LJLJLJLJL-JL7L7||L7||LJ|L--7J7|FL-|-F
LJ--F7L---JFLJL-JJ-LLJLJLJF--JL7L7F77||LJLJ||JLJ||LJL|L-7.||FJL-7|||LJ||LJFJL7F--J|LJFJL7LJ||||FJ|||L||F----------7L7||L7|||F-JF--JJ-F7LLJ-J
|.LF-JF-F|.|J7.L77|.F--7F7L---7L-J|L7|L7F--JL-7F||LF-JF7L7LJL7F-JLJF--J|F-JF-JL7F7L77L--JJFJ|||L7|LJFJ|L---------7L7||L7|||LJF7L7|7|F|L..L7J
|7F-J7.FFLLJ|F..F7F-JF7LJL---7L---JFJL-JL--7F-JFJL7L7FJL7L-7FJL---7|F-7||F7L7F7LJ|FJF7LF--JFJ||FJL77|FJF---------J|LJL-JLJL7FJL7L--7J-J-7...
.-J|||-|7L|7FJF7||L-7|L-7F--7|FF7F7L--7F7F-JL7FJF7|FJL-7L7FJL7F7F-J||FJ|||L7LJ|F-J|FJL7L7F7L7LJL-7|FJ|FJF--7F7F--7F-----7FFJ|JFJF--J-7.FF--F
J7|FLJF-L7|LF7|LJL7|LJF7LJF-JL-JLJL---J||L7F7|L7|||L7F7|FJL7-LJ|L77LJ|FJ||FJF-J|F7LJF7L7|||FJ|F--J|L7|L-JF7LJLJF7LJF7F-7|FJFJ|L7|JLJF7-FJ7||
||L7.FL|LL-L.LL7F7L7LFJ|F7L------------JL7||||-LJ|L7||||L-7L--7L7L7JFJL7LJL7L7FJ|L7FJL-J||||F7L---JJ||F--JL----SL--JLJJLJ|FJF--J|7FL-.F77.F|
J.||F--7.J7J|-LLJL7L7L7||L---------------JLJ|L--7L7|LJ|L-7L7F-JJL7L7L7FJF--JFJL7L7|L-7F7LJLJ|L-----7LJL7F----------7F7F7|LJ7L---J777.L7LJ--|
L-|-|..L7-|LF.LJ-LL7L7||L--------7F--7F7F77FJF-7L7||F-JF7L7|L-7.FJFJFJ|-L-7FJF-JFJ|F7LJL7F7FJF-7F-7L7F7LJF7F-7F----J|||L7.LJJFLL-7|F7JJ.||.|
L7F-JF-F|7.F77J|-F7L7LJL7-F---7F7LJF7LJLJL7L7|-L7|||L-7|L-J|F-JFJFJFJFJF--J|LL-7|J|||F--J|||FJFJL7L7LJL--JLJFJL-----JLJFJF|..|LL7JJ-LJ-F7FJ-
.F.|FFFF--7||F7LFJL7L7F7|FJF-7LJL7F|L-----JFJL7J||LJF-JL-7FJL7.|FJFL-JLL7F7L-7.|L7|||L---J||L7L7FJ7L7F7F-7F7L----------JJF7-.|L-.||LJ.FLJJ|.
FJF|--JL-7||||L7L-7L7LJ||L-JFL7F7L-JFF7F7F7L-7L7|L7.L-7F7||F7L7|L-7|F---J||F-JFJFJ||L7F---JL-JFJL7F7LJLJJLJL-----7LF7F7F7|||.F-J7LJ7.7|J.L|-
|7JL|..L||LJLJFJF7L7L7|||7F7F-J|L7F--JLJLJL-7L-J|FJF--J||||||FJ|F7|FJF7F7|||FFJFJFJ|FJL---7F--JF-J||F7-F7F------7|FJLJLJLJL-77LLF7L7-L77L.|7
-J7.F----|F7F7L-JL7L7L-JL-JLJF7L7LJF-------7L--7|L7L7F7|||||LJL|||||FJ||||LJFJFJ7L7|L--7F-J|F7FJF-JLJL-JLJF7F--7LJL7F-------J..|JF.77LJ-J-||
L-FFF77|-LJLJL---7|JL-7F7F7F7||FJF7L------7|F7FJ|FJ-LJ||||||7F-J||||L7LJ|L7FJFJ|F7LJLF-JL7-||LJ7L----7F---JLJF7|JF7|||F-----7.F7FF7FJ-|...||
|7|FJL-7-F-7F7F7FJL7F-J|||||LJLJFJL-------JLJ|L7LJLF7FJ|||||FJF7|LJ|FJF-JFJL7L-7|L--7L7F7L7LJF------7|L7F----J|L-JLJL-JF-7F-J-|L-J|JL-J7.F-7
---L7F-J7|FJ||||L-7|L--JLJ||F7F7L7F---------7L-J|F-JLJFJ||||L7|||F-J|FJF7|F-JF7|L--7L-J||FJF7|F----7|L-JL--7F7L--7F7F7FJ.|L-7-|F--J7J|LF-J-F
L7LFJ|F7-|L-JLJL--JL7F7|F7LJ|||L7LJF----7F-7L---7L7F7FJ|||||L||||L-7|L-J||L-7|||F--JF7FJ||FJ|||F---JL------J||LF7LJLJLJF7L7FJFJL-7LF-7LL7FF7
FL-L7|||F|F7F-7F7F-7LJL-J|7FJ||FJF7L---7|L7|F7F-J.|||L-7|||L7|||L7FJL-7FJ|F-J|||L7F7|LJFJLJFJLJL7F7F--7F----JL-JL----7L|L7LJFJF--J7|FJ.LLLLJ
LLF-JLJL-J|LJFJ|||FL-7F-7L7L7LJL-JL----JL7|LJLJF-7LJL7FJ|||FJ||L-J|F--J|FJL7FJ|L7||||F-JF7FJLFF7LJLJF7||F------------JFJFJF7L7|JFLFF|J.L|7L|
F-L---7F7FJF7L7|||F--JL7L7L-JF-7F7F--7F7FJL---7|FJF7FJ||LJ|L7LJJF7|L--7||7F|L7L7||||||F7|||F7FJL-7JFJLJ|L-----7F7LF7F7L7L7|L7|L77FF7|LF.F--|
L77LJLLJ||FJL-J||||F---J||F-7|FLJLJF-J||L7F--7LJL-J|L7|F-7|FJF--JLJF7FJ|L7FJFJFJ|LJ|||||||LJ||F-7L-JF-7|LF7F7FJ|L-JLJL7|FJ|FJ|FJFLF7F7|L.FL|
F-LJFLLFJ|L-7F7|||LJF----JL7||F----JF7|L7|L-7|F---7L7|LJFJ|L7|F7F--J||-L7|L7L7|FJF-J|||LJ|F-JLJ||F-7L7||FJLJLJJ|F--7F-J|L-JL-J|F7F|LJL7FFLJJ
||LFJ-LL7L7FJ|||LJFFJF7F7F7||||F-7F7|||FJL-7||L--7L-JL--J.L-J|||L--7|L-7|L7|FJLJJ|F7|||F-JL7F---J|FJFJLJL------JL7FJL--JF----7LJL-JF7FJJJJJ|
F7|JFF|.L-JL7|LJ7F7L-J||LJ||LJLJFLJLJLJ|FF7LJL---JF-----77L-FJ|L7F7||F7|L7|||JFF-J|||LJ|F--JL----JL7L7LF7F7F-7F7FJL-----J.F-7L-7F7FJLJJJ..|J
|L--|FFF---7||F--JL---J|F-J|F-7F7F-----JFJL7F--7F7|F---7L7|||FJFLJ||||LJ|LJLJ77L-7|LJF7LJF--7LF7F77L-JFJLJLJ.LJLJF7F-7F--7|FJF7LJLJJ|J-7-7..
J|LF-7.L--7LJ||F7F7F-7FJL--JL7|||L---7F7|F-J|F7LJLJ|F7LL7L7-||.J|LLJLJ7.-JJLFF---J|F-JL--JF7L-J|||F--7L----7F7F--JLJFJ|F-J|L-JL-7JJJ|JF7JFJ7
|F-JF-JL|FJF-J||LJLJFJL7.F7F-JLJL-7F7LJLJ|F7||L---7LJL7JL-J7LJ7.FF|-J--7LF-7-L-7F7|L--7F7FJL7F7LJ|L7FJJF---J|LJF7F7FJF|L--JF---7L77FF7JJFFJJ
LL7.LJ|FFJFJF-J|F---JF7|FJ|L-7F7F7LJL---7LJ||L---7L--7L---7-..F-F|.LJ7LL.7J||LLLJ|L--7||LJF7LJ|F7L-JL--JF---JF7||||L--JF--7L-7|L7L-7||J.J.77
J..F|.|LL7|JL-7|L----JLJ|FJF-J|||L-----7L7FJ|F---JF-7|F---J-F|..L|L.|L..F|-||F7F-JF7FJLJF-JL-7LJL--7F---JF---JLJLJL7F7FJF7L-7L-7|F7LJ|JL.7L-
.FF-J.|FJ||J.F||F-----7L||FJF-JLJF--7F7L7|L-JL----JFJ|L-77JL7J--J|FFF7|.L|-|-F-|F-J||F-7L---7|JF7F7LJF7F7L-----7F7-||LJ7|L-7|F-JLJ|F-J|.FL-J
FF|-7.-JFLJ.FLLJL----7L-JLJFJ|F-7L-7LJL-J|F-7F-7F7FJ-L-7L-7J|...F7F7|FL7-JJL7J|LJJ|LJL7L-7F7||FJLJL--JLJL-----7LJL7|L---JF-J|L--7||L7J7--JJ|
L-7--JLLJL|.J.F77F7F-JF7F--JF-JFJF7L----7|L7LJFJ|LJF7F7L--J-L.|.FJ|L77..7J.FF.FLJ.J7.|L-7LJLJ|L7F7F--7F------7|F--J|F-7F7L-7L---J-L-JJ|-7.F7
FL77L||.F--J-FJL-JLJF7|||F--JF7L-JL-----J|FJF7L-JF-J||L-7J.LL7L-JL..L-J7..JFLF-|FJ.|.F7FJF7F7L7LJ||F-J|F--7F-JLJF7LLJFJ||F7L7F7||7||.L--7.-7
JJL7-77.JJLJ.L7F---7|LJLJL---JL---------7|L-JL7-FJF-J|F-J.|.|L-|FL--77|7F7F7||.|7F-F-J|L-JLJL7|F7LJL-7||F7LJF7F7||F-7|FJ||L7LJL-7-7-7-L7J-L|
|.-7L||-J--JFFLJF--J|F--------------7F--JL7F-7L7|FJF7||F-7F-77FJ7J|7JF7JJFL-7J-7F77|F7L------JLJL7JF7LJLJL--JLJLJLJFJLJ-LJFJF7F-J.|||..L-..F
77|J.LF-J|.|LFF7L--7|L---7F7F-7F7F-7LJF7F7LJFL7LJL7|||LJFJ|FJF7|L777JFJ|FL7F|7..L|-LJL-7F------7FJFJL7F-7F-7F------JF7F--7L-J|L7J77F7-|.||FJ
LFL-77|.F7-FF7||JF7LJ7F77LJLJLLJLJ|L--JLJL7F-7L---J|||F-JFJL-J|J.JLJJ|||F|JLJF-JLJ7L7|FLJ7F----JL-JF-JL7LJJLJ|F7F---JLJF-JJF7L-J-7-7F7FL7.FL
FF|7|FL|--F-JLJ|FJL---J|F7F7.F------------J|FJ.F--7||||F7L7F--J7F7F7F-L-77FFJJJJFLL7|JFF-7L-7F7F7F7L-77L-7F7F7|LJF-----JF7FJL7F-77J|-F|7|FJJ
||L|--.JJ|L---7LJF7F--7LJLJL7L---------7FF7|L7FJF-J||||||.|L--77.|LL7-J-7--|||-F|||-.L|L7|F7LJLJ|||F7L-77LJLJLJF7|7F7-F7|||F-J|FJF7LF-|F7J7.
-LJ||.LL7F|JLLL--JLJ7FJF-7F7L7F--------JFJLJFJL7|JFJLJLJL-JF--JJ7L-7J-|-FJ..|7.-|F|77|F-J|||F7F-J||||F7L7F--7F7||L-JL-JLJLJL--JL-JL7|LJ-J.L7
|F-|-J.FF7L7F||F7F---JFJFLJ|FJL7F--7F7F7|F--JF7|L-JF--7F7F-JJJL-JF|--.7L|.7FL--.L|FF-7L-7LJLJ|L--JLJLJL7|L-7|||||F--------7F----7F-J-FLJ-7-|
F7||-F-F-JJF7-FJLJF--7L7F--JL7JLJF7LJLJ|||-F7|LJF-7L-7|||L-7.7JFLFJ-7FJ7|7L7--LF7F7L7L-7L---7|F7F--7F--JL--JLJLJLJF---7LF7LJF7F7||F77JF-7-F7
7JF|.L--7J7F7-L--7|F-JFJL--7FJF7F||F---J|L7|LJF-JFL--JLJL--JF7.|J|.|F7F7JFJL|.F||||-|F-J|F--JLJ||F7|L--7F---7F7F7FL-7FJFJL--JLJ|LJ||F7FL7JJ|
..F--77JJFFFJJ|.LLJL--JF---JL-JL-JLJF7F-JFJ|F7L--------7F7F7|L7JFLFLJL7L-F--LF-J|||FJL-7FJF7F-7|LJ||F7JLJF--J|LJL7F-JL-JF7F7F-7L--JLJL7FJJF-
L7|L|LJ.77F77LF7F---7F7L--7F7F-7F---J||F7|J||L-------7FJ|LJLJFJFF-L7JF7FL|.LLL-7LJ|L--7|L-JLJL||F7||||F--JF7FJF7FJ|F---7|||LJF|F-7F--7|-J.LJ
.F|7|L-F--|L7FJ|L--7||L--7LJLJ7LJF---J||LJFJL-------7LJFJF7F-J.L77LJ.-77-LJ..|7L7FJF--JL-7F7JFJLJLJ|||L---JLJFJLJ-||F-7|||L--7LJ-LJJLLJJF7-F
FF.JJ7|LJ-L7|L7|F7FJ||F-7L-------JF7|FJL--JF-7F--7F7L7FJFJLJJF7JJL|J77.F7JFFF-7FJL7L----7LJL7L----7||L-------J|F7FJLJFJLJL7F7|.F7F7|.||.---J
FJ-|7F-7F|L|L-J|||L7|LJFJF7F7F7F-7|L-JF7F-7|FJL-7LJL-JL7L7F--JL-7.77F7-|J|FJ|FJL7FJF---7L--7L-7F7FJLJF-7F7F-7F7|||F--JF--7LJ|L-JLJL7-777-|-7
|J-77|J|F7JL7F7LJL-JL7.L-JLJLJLJJLJF--JLJ|LJL7F7L7F7-F-JFJL7F---JF7FJL--7F7FJ|F7|L7L--7|F7FJF7LJLJF-7|FJ|||FJ||||||.F7L7FJF7L7F7F7FJ.J..F||F
|LFJFJ7LF--FJ||F7F-7FJF7F7F-7F-----JF7F7F-7F7||L7LJL7L7FJF7|L-7F7|LJF7F-J||L7LJLJFJF7J|LJLJFJ|F7F7|.LJL-JLJL-JLJLJL-JL7|L-JL7LJ||LJLF.FF7LL|
|-7F|JF.LL.L7|LJLJFJL-JLJ|L7|L------JLJ|L7LJ|LJLL---JFJL7|||F-J|||F-JLJF7||LL--7FJFJL7|F7F7L7||||LJF7F7F7F7F7F-7F7F7F7LJF7F7L7FJL7F--7-.|7|F
J||FF7..-7FLLJF---JF----7L-JL----------JFJF7L------7FL7FJ||||F7|LJL-7F7||||F7F-JL7L7FJLJLJ|FJLJLJ.FJLJLJLJLJ||F|||||||F7|LJ|FJL-7LJF-JFF7JF-
J-|L--|7LL7J|-L----JF--7L------------7F-JFJL7F-7F--JF7|L7|LJ||||F---J|||LJ|||L7F7L7|L-7F7|LJF-----JF-7F----7|L7LJ||LJ|||L-7||F-7|F7|7.LJJ7||
||JLJ7|F.|J.F-F-----JF7L-------------J|F-JF7LJJ||F-7|||FJ|F-J|||L7F-7||L7FJ||-||L7||F-J||F7JL-7F7F7|FJ|LF--JL7L-7|L-7LJ|F-J|LJFJ|||L-7.FJJ7L
FF7-7|F7FF77.FL--7F7FJL7F------7F--7F7|L--JL--7||L7|||||F|L7FJ||FJ|FJ|L-J|FJL7||FJ||L-7|LJL--7LJLJLJL7L7L-7F7L--JL--JF7LJF7L7FJL|||F-J-F|FFJ
F-J-7-7||-L7-F--7LJ|L-7||F-----J|F7LJLJF--7F--J||FJ||||L7|FJL7LJL7|L-JF--JL7FJLJL7LJF-JL---7FJLF-7F--JFJF-J|L--------JL--JL7|L-7LJLJJJJLL-7|
77F.|LFJJL-|JL-7|F7L--J||L------J||F7F7L-7LJF77||L7||LJFJ||F7|F--J|F--JF-7||L--77L-7L7F-7F7||F-JFJL--7L7L--JF--------------JL--J-|JJ|-FJJ.FJ
|L-.LF-J7JF7-F-JLJ|F--7LJF--7F7|FJLJ|||F7L7-|L7LJFJLJF7|FJ||LJL---JL--7L7|FJF--JF--JFJL7LJ||||F-J|F-7L-JF---JF7F----7|F7LF--7.F7F|J.|7L77-L7
J-J7.LJL--F--JF--7|L7FJF7L-7|||FJF-7LJLJL7L7|FJF7|F--J||L7||F---------JFJ|L7|LF7L--7|F7L-7LJ||L--7L7L-7|L----JLJF---JFJL-JF-JFJL7--F7|LJL77|
L-J777-F|LL---JF-J|FJL7||F-JLJLJFJ.L----7L-J|L7|LJL--7LJJ||||F--7F7.F7FL7|FJL7||F7FJLJ|F-JF7|L-7FJFJF7L----7F---JF7JFJF-7FJF7L7FJLFJ|7JLFFFL
FFJFFJ7-F.|FF--JF7|L7FJ||L---7F7|F7F----JJF7L7|L7F---JF-7||||L7FJ|L7||F7|||F-J|LJ|L-7FJL--J||F7||JL-JL----7|L----JL7|FJ|LJ7||FJL-7L7|--77FJ.
FJ-LL.L7F--7|F--J||FJ|.|L----J|LJ|LJ|F7-F7||FJ|FJL-7F7L7LJLJL7|L7L7LJ||||||L-7|F7|F7||F7F--J||||L7F-7F7F7FJL7F--7F7LJL77F-7|||F--J-||J-JF7L.
|F-F7FFLL7|F||F--J|L7L7L-----7L7FJF--JL7|||LJFJL7F-J|L7L7F-7FJL7|FJF-J|LJLJF-JLJ||||||||L7F7||||FJL7LJLJLJF-JL7.|||F-7L7L7LJLJ|F7F7||J|FL7J7
F7J.L7|-JLLLLJL7F7L-JFJF7F7F-JFJL-JF---J|||F7L--J|F7|FJ|LJFJ|7FJ||FJF-JF---JF-7FJ||||LJ|FLJ|||LJL7FJF7F--7L--7L7LJLJ.L7L7|F---J||||||F-7.7J|
LJ-F-FJJ--J-L|LLJL7F7L-J||||F7|F---JF7F7||LJL-7F7||||L7-F7L7L7L7|||J|F-J-F7FJFJL7|||L7FJF7FJ||F--JL-JLJF7L--7L7L-----7L7LJL-7F7|||||||FJ7L7.
LFFF7JF-7J|-FJ-F--J||F-7LJ|LJLJL----JLJLJ|F7F7||LJ|LJFJFJ|.L7L7||||FJL7F7|||FJF-J||L7|L7||L7LJ|.F-7-F--JL---JFJF-7F--J|L7F--J|||LJLJLJL-7L||
.|J.77|F7F-.|--L-7FJLJJL-7|F7F7F--------7||LJ|||F7L7FJ-|FJF7L7LJ|||L-7LJ|||||FL-7||FJ|FJ||-L-7L7L7L7L----7.F7L-J7LJLF7-FJL---JLJF7F-7F7FJ.L-
F.|7|-F|F--|.L|F-J|F7F-7FJLJLJLJF---7F-7LJL-7||LJ|FJ|F7||FJL7L-7|||F-JF-J|||L7F7|||L7|L7||F7FJFJFJFJLF--7L-JL-------JL7L-7F---7FJLJ.LJLJ|FF|
|7L-J.LJ7J||-FFJF-J||L7|L-7F7F7FJF--J|FJF7F7|||F-J|FJ||||L7FJF7||||L7FJF7||L7||||||FJL7|||||L7|LL7|F7L7FJF-------7F7F7L7-||F-7LJF-7F77LL|7-F
FFL7|FFJLF|.|L|FJF-JL-JL--J||||||L--7||FJ|||||||F-J|FJ||L7|L7|LJLJL7|L7|||L7|||||||L7FJ||||L7||F7||||FJ|FJF----7.LJ||L-JFJLJFJ|FJFJ||7LL|J.7
F|L|-|7J-J|FL7LJ7L--------7|LJLJF7F7|||L7||||||||F-J|-||FJL7|L-7F--J|FJ|LJFJ||||||L7||FJ|||FJ|LJ|||||L7|L-JF--7L--7|L7F7|F-7L--JFJL|L7F-LJ-F
F--..L7...F7L|J.FF---7F7F-J|F---JLJLJ||FJ||LJ|||||F7L7LJL7FJ|F7|L7F7|L7L7LL-J||||L7|LJ|FJ||L7L-7LJ|||FJ|F-7L-7L---JL7LJ|||FJF7F7L7||FJ-7|7.|
7J|F7JL77-FJJ|.-JL--7LJLJF7|L------7FJ|L7|L7FJ|LJ||L7L-7F|L7||||FJ|||FJFJF--7LJ|L7|L-7|L7||FJF7L7L|||L7|L7L-7L-----7|F7|||L7|LJL7L-J|J-L.F-F
7-J-7-FF-7LJ.F-F7JF-JF7F7|LJ-F-7F7FJL7L7||FJL7L77LJFJF7L7L7|LJ|||FJLJL7L-JF7L7FJFJL7FJ|FJ||L7||FJFJ|L7||FJF-JF7F---JLJLJ|L7|L--7L7F7L-7-FJFF
L|.|LFFJ|F|JF|LLF-JF7|||LJLF7L7LJLJF7L7LJLJF7|FJF--JFJ|FJFJL-7||||F---JF-7||FJL7L-7||FJL7||FJ|||-L7L7LJ||7|F-J||LF7F7F7J|FJL7F-JF||L--J7F7..
FL|F-J.FF-||-77JL-7|LJLJ7F-J|FJF7F7|L7L---7|||L7L7F7L7||FJF-7|||LJL7F7FJFJ|||F7|F-JLJ|F7|||L-JLJF-JFJF-JL7LJF-JL-JLJ||L7LJF7|L--7|L-77-7|.F7
7J.FLF--JLL|F7-F-7LJF7-F7L-7LJFJLJLJFJF7F7LJ|L7L7LJ|FJ||L7L7LJ||7F-J||L7|FJ|LJ||L---7||LJ|L-7F--JF7L7L-7FJF-JF--7F-7LJFJF7||L---JL7FJ7|||-||
|FLL7J||L|FJ7|.L7L--JL-JL-7|F7L7F--7L7||||F7L7|FJF-JL7LJ7L7L7FJL7|F7||FJ|L7|F7|L7F7FJLJF-JF-JL7F7||FJ7FJL7|F-JF-J|7|F-J7|LJL---7JLLJ..FLL--L
JJ|.|F|FFL|FLL-LL--------7|LJL7LJF-J-LJ||||L7||L7L7F7L-7F7|FJL7FJLJ|||||L7||||L7||LJF7LL--JF7-||LJ|L-7L7FJ|L-7|F7L7||F--JF-7F7FJJ|J-F7--J777
FLJ.LLJJ7L|7.LF7F7F------JL---JF7L-7|F-J|LJF|||FJFJ||F7||LJL7FJ|F--J||L-7LJLJ|FJ|L--JL7F---J|FJL-7|F7|-LJFJF7||||FJ|LJF7FJ||||L7FL-F|L|F7L-L
LJL|.FL.|LL.FF|LJLJF7F7F7F---7FJL-7|FJF7L--7|||L7|FJ||LJ|F7FJL7|L--7||F7L7F--JL7L7F-7FJL7F-7LJF--J|||L--7L7|LJ|||L7|F7||L-7LJL-J-||FJFJL-JLL
|J-|JJ|-F7|LFFJF7F7|||||||F7F|L--7|||FJ|F--J||L7||L7|L7FJ|||.FJ|F--J||||FJL--7FJFJL7LJ.FJL7|F7L--7||L7F-JL|L-7||L7||||||F7L----7|L|.F||F7||J
|.|F7JL7|FFJFJFJLJLJ||LJLJ|L-JF7FJLJ||F|L--7||FJ|L7||FJ|FJ|L7|FJL--7|LJ||F7F7||JL-7L-7FJF-J||L7F-J||F|L--7|F7|||FJ|||LJ|||F---7|J.-7.F7.F7|.
F7-LL.LJLJL7L-JF7F--J|F---JF7FJ||F7-LJFJF-7||||FJFLJ||-|L7L7|LJF---JL-7|||LJLJL7F7|F7||FJ.FJL7|L7FJ|FJF--JLJ||||L7||L-7LJ|L--7LJJ7LL7L7FFJ-J
.|JJL7.7|FFLF--JLJF7FJL-7F-J||L||||F--JFJJ||||||F---JL7L7L7||F7|F-7F7FJ||L-7F7FJ||LJLJ||F-JF-JL7||FJL7L----7||||FJ||F-JF-JF-7L-7.|7.|-|FJ.L.
|..FFLLJF7JJ|F-7F-J|L7F-J|F-JL7LJ|LJF7FJF-J|LJ||L7F7F7L7L-JLJ|LJ|FJ||L7|L7LLJ|L-JL7F-7|||F7|F--J|LJF7L7F7F-J||LJL7||L-7|F7L7|F-J7LF.|.|7|J|L
|J77L-JL|L|7LJLLJFFJFJL--JL7F7L7FJF7||L7|F7L-7LJ-||||L7L---7JL7FJL7|L7||FJF--JF--7LJFJLJLJ||L--7L-7|L-J||L-7|L-7FJ|L7FJLJ|FJ|L-77JJF7JL7|-7|
7.FL7J|...J7.J-LL-L7|JLFF--J||FJL7|||L-J||L7FJ7F-J||L7L-7F-JF-JL7.||FJ|||FJF-7L-7|F7L-7-F-J|F--JF-J|F7FJ|F-J|F-JL7L7||F|||L7L-7|--FFJLF|7LL|
L-L7L-JJ7.LFJ|.LJFLLJJJFJF7FJ|L7FLJ|L7F-JL7|L-7L7FJL-JFFJL7FJF-7L7|||FJ||L7|-L7FJLJL-7L7|F7|L--7L-7|||L7LJF7LJJ|L|FJLJ-L-L7L7.LJJF.||F|F77FJ
7|||L|-||..||-.77LF-F--JFJ|L7L7|F--JFJL--7|L7FJFJL-7F--JF-JL7|7L-JLJ||LLJFJ|F-JL----7|FJLJ||F--JF7|||L7L--J|FJJ-LLJJJ|.L--L7|J.LJF-7FJJLL7||
.-JLFJF7L7.F|7|-7|LFJF-7|FJFJ-LJL7F7L7.F7LJFLJFJF7FJL7F7L--7LJ77LF--JL-7FJFJL-7F7F7FJ|L-7FJ||F7FJ|||L7L7F--JJ|.FLJ-JF--.LJFLJ|.LF-L|JLL|FJJ-
FJ7F7JL|JL-LJ-L7FF-L7|FJ|L7|J-|F-J|L7L-JL7L|7.|FJ||F-J|L7F7L-7JFFJF-7F7||FJJF-J||||L7|F-J|FJLJ|L7||L7|FJL7|J7L77.|LF|JF-7F|JL7JFL7||F|F.L-|.
F-|JJ7.JJ-|F77-LLJJ-LJL-JLLJJJFJF7|FJF---J-||7LJ-LJ|F7L7LJ|F7|F-JFJFJ|||||F-JF7|||L7||L7-||-F-JFJLJ-|||F-J-77|L--L-L|.|-F|.LLJL|.7FF7L7J--F7
LF-.|FL-F-F|7.LFJ-|.|7|L|7J77|L7|LJL7L---7-7|FJJJ.FLJ|FJ.LLJ||L7FJLL7|||||L-7|LJLJ.||L-J-LJ-L--J7|J-||LJJL7|LF7||.LLL7J-F|-J.7-F--FJL7|F7JLF
F-.F||..LFJLL7FJ.F|-7-77FL.JFFLLJ-F7|F---J.||7J|.F7.LLJ-7-L7LJ-|L7-LLJLJ|||F|L----7LJ7F7JLL.LJ.LFJ|.LJJL--.|-F7-77.F7J|FL|JF7JF|LJLJFJL-F.FF
F-F||-7-FLF7JFLJ7F|-JJ.LJJJ|-JJ|JF|LJ|F7LJ-JL77-F7JFJLL7FJ.F7.LL-J7LJJJL||F-JF7F-7L---J|LFJ-.J7JJ7L||..LL-JJ7J|F||FFF.LF.|.|L-LF-JFFLJ-FJ-J|
L7J||.L-JLLJ--7.FL-7||.F|-L7.|.|-FJF7LJ|..7-LFJ.|L7L-||L|7-|-L.|.|L|.FF7LJL7FJLJJ|F----J.|7L|--7.|.LJ-7..|JF7|L-L-7F--L|FJ7|FLL|FJ7|-7.|-|JL
FL7F||.||7L-F--|JF-.-F-JLF7J||L..L7||F-J7J.-.|.FL|J-FLF.|J7JFL-|-7.--F|L---JL7LF-JL--7|JF-7L7.L-FJ7|LJ7F77JJ.|JL|.-LL.|L-L-|-7.||.L7-F-7.|JL
L|7-FLJ--F77|-LJ.|--JJJL.|JLJFJF7-LJLJ-F|7L.FJ-77J..F-|-|J|F7.|LLL-7|LL--7F7FJ.L-7F--J7F7F7-JJ.LJ--FJL|FF-7LF|7.L7FFJ-J|.L.|.LFL7.LJFJFF-|..
.|..|.|7L.L|J.LL-L-7F7-LFJ|.FF.F7.J.|L--|7.|--7|F7FJJ.|L|-L7|--JF|.|-7F|LLJ|L77LFLJ-J.J-.JJ.|||FJF|J..|-LJF-L|7L|-7L|7L7J-JJ.L-J-||-|-LJ|LLF
LJ-F---J.F7|77JFL-||-F7||-J-LJ-FJLJF-7|F|F-JFFJ|.F--7-LJ|LFL|-7||JFF-|LF.JL|FJ7FFJL7J-|7L77F|FFJJ|7..LL-J.777F7F|JF-77J|LFFF77FL|LL-|-.LJJJ|
.|JF|-L|.J7LJJ77|F7|7F--|-|JL7-L7LFFJ-77-J|F-JFJ7JF|J|7|F-|7|-L|||F7.|L7-F|LJJ7-|7.|FLLF7LL-FFJ|.-L--7.LF||F-J.L|F7.L7F7.F7LLJ7J|F|-|J|L|L77
F-7|L77L..F-J7F---7J7||.|-F.LL7.|F7.JL|F7LF|-FF-LF7|-7-|.L--|...FL|L-JFF-J-.|.7F||JF||.FL7L.7||L7JJ-7FF-7|F|-|-LF--J7L7LL7JL||LF|F--LJ|-FJ|7
L|L--JJJ-LLJ-FF.JJLLJ7-L7-JLJJ|-.F7..-|LJ.FJ.|J..L7J.L-.--JL|.-FJ-L-LL.|.JJ-FJ.F|JLLJF-7J7JJJ|7JLJ..FL--JJ-77L7.|JLL-JL-L.LL-|7-L|J.LLL-L-|.
+331
View File
@@ -0,0 +1,331 @@
package main
import (
"bufio"
"fmt"
"strings"
aoc "go.sour.is/advent-of-code"
)
// var log = aoc.Log
func main() { aoc.MustResult(aoc.Runner(run)) }
type result struct {
valuePT1 int
valuePT2 int
}
func (r result) String() string { return fmt.Sprintf("%#v", r) }
func run(scan *bufio.Scanner) (*result, error) {
m := &Path{s: -1}
for scan.Scan() {
text := scan.Text()
_ = text
m.readLine(text)
}
dist := m.buildPath()
// log(m)
r := &Region{List: m.List, w: m.w, l: len(m.m)}
count := r.Count()
return &result{valuePT1: dist, valuePT2: count}, nil
}
type node struct {
value rune
pos int
whence int8
left *node
}
func (n *node) add(a *node) *node {
if a == nil {
return n
}
n.left = a
return a
}
func (n *node) String() string {
if n == nil {
return "EOL"
}
return fmt.Sprintf("node %s from %s", string(n.value), enum(n.whence))
}
type List struct {
head *node
n *node
p map[int]*node
}
func NewList(a *node) *List {
lis := &List{
head: a,
n: a,
p: make(map[int]*node),
}
lis.add(a)
return lis
}
func (l *List) add(a *node) {
l.n = l.n.add(a)
l.p[a.pos] = a
}
type Path struct {
m []rune
w int
s int
*List
}
func (m *Path) String() string {
var buf strings.Builder
n := m.head
buf.WriteString(fmt.Sprintf("head %d", len(m.p)))
for n != nil {
buf.WriteString("\n ")
buf.WriteString(n.String())
n = n.left
}
return buf.String()
}
func (m *Path) readLine(text string) {
if m.w == 0 {
m.w = len(text)
}
if m.s == -1 {
if i := strings.IndexRune(text, 'S'); i != -1 {
m.s = i + len(m.m)
}
}
m.m = append(m.m, []rune(text)...)
}
func (m *Path) buildPath() int {
m.start()
for m.next() {
}
return (len(m.p) + 1) / 2
}
func (m *Path) start() {
m.List = NewList(&node{value: 'S', pos: m.s})
switch {
case m.peek(UP) != nil:
m.add(m.peek(UP))
case m.peek(DN) != nil:
m.add(m.peek(DN))
case m.peek(LF) != nil:
m.add(m.peek(LF))
case m.peek(RT) != nil:
m.add(m.peek(RT))
}
}
func (m *Path) next() bool {
var n *node
switch m.n.value {
case '7':
if m.n.whence == LF {
n = m.peek(DN)
} else {
n = m.peek(LF)
}
case '|':
if m.n.whence == UP {
n = m.peek(DN)
} else {
n = m.peek(UP)
}
case 'F':
if m.n.whence == RT {
n = m.peek(DN)
} else {
n = m.peek(RT)
}
case '-':
if m.n.whence == LF {
n = m.peek(RT)
} else {
n = m.peek(LF)
}
case 'J':
if m.n.whence == LF {
n = m.peek(UP)
} else {
n = m.peek(LF)
}
case 'L':
if m.n.whence == RT {
n = m.peek(UP)
} else {
n = m.peek(RT)
}
}
if n == nil {
return false
}
if n.value == 'S' {
last := n.whence
next := m.head.left.whence
switch last<<4 | next {
case UP<<4 | UP, DN<<4 | DN:
m.head.value = '|' // UP UP, DN DN
case LF<<4 | LF, RT<<4 | RT:
m.head.value = '-' // LF LF, RT RT
case UP<<4 | RT, LF<<4 | DN:
m.head.value = 'J' // UP RT, LT DN
case UP<<4 | LF, RT<<4 | DN:
m.head.value = 'L' // UP RT, RT DN
case DN<<4 | RT, LF<<4 | UP:
m.head.value = '7' // DN LF, LF UP
case RT<<4 | UP, DN<<4 | LF:
m.head.value = 'F' // DN LF, RT UP
}
return false
}
m.add(n)
return true
}
const (
ST int8 = iota
UP
DN
LF
RT
)
func enum(e int8) string {
switch e {
case ST:
return "ST"
case UP:
return "UP"
case DN:
return "DN"
case LF:
return "LF"
case RT:
return "RT"
default:
return "XX"
}
}
func (m *Path) peek(d int8) *node {
switch d {
case UP:
x, y := toXY(m.n.pos, m.w)
if y == 0 {
return nil
}
p := fromXY(x, y-1, m.w)
r := m.m[p]
if any(r, '7', '|', 'F', 'S') {
return &node{value: r, whence: DN, pos: p}
}
case DN:
x, y := toXY(m.n.pos, m.w)
if y == m.w {
return nil
}
p := fromXY(x, y+1, m.w)
r := m.m[p]
if any(r, 'J', '|', 'L', 'S') {
return &node{value: r, whence: UP, pos: p}
}
case LF:
x, y := toXY(m.n.pos, m.w)
if x == 0 {
return nil
}
p := fromXY(x-1, y, m.w)
r := m.m[p]
if any(r, 'F', '-', 'L', 'S') {
return &node{value: r, whence: RT, pos: p}
}
case RT:
x, y := toXY(m.n.pos, m.w)
if x == m.w {
return nil
}
p := fromXY(x+1, y, m.w)
r := m.m[p]
if any(r, '7', '-', 'J', 'S') {
return &node{value: r, whence: LF, pos: p}
}
}
return nil
}
func fromXY(x, y, w int) int { return y*w + x }
func toXY(i, w int) (int, int) {
return i % w, i / w
}
func any[T comparable](n T, stack ...T) bool {
var found bool
for _, s := range stack {
if n == s {
found = true
break
}
}
return found
}
type Region struct {
*List
inLoop bool
count int
w int
l int
}
func (r *Region) Count() int {
for i := 0; i < r.l; i++ {
if i%r.w == 0 {
r.inLoop = false
// fmt.Println(": ", i)
}
a, ok := r.p[i]
if ok && any(a.value, '|', '7', 'F', 'X') {
r.inLoop = !r.inLoop
// fmt.Print(string(a.value))
continue
}
if !ok && r.inLoop {
// fmt.Print("I")
r.count++
continue
}
if ok {
// fmt.Print(string(a.value))
continue
}
// fmt.Print(".")
}
return r.count
}
+110
View File
@@ -0,0 +1,110 @@
package main
import (
"bufio"
"bytes"
_ "embed"
"testing"
"github.com/matryer/is"
)
//go:embed example1.txt
var example1 []byte
//go:embed example2.txt
var example2 []byte
//go:embed example3.txt
var example3 []byte
//go:embed example4.txt
var example4 []byte
//go:embed example5.txt
var example5 []byte
//go:embed input.txt
var input []byte
func TestExample1(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(example1))
result, err := run(scan)
is.NoErr(err)
// t.Log(result.valuePT1)
is.Equal(result.valuePT1, 4)
}
func TestExample2(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(example2))
result, err := run(scan)
is.NoErr(err)
// t.Log(result.valuePT1)
is.Equal(result.valuePT1, 8)
}
func TestExample3(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(example3))
result, err := run(scan)
is.NoErr(err)
// t.Log(result.valuePT1)
is.Equal(result.valuePT1, 23)
// t.Log(result.valuePT2)
is.Equal(result.valuePT2, 4)
}
func TestExample4(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(example4))
result, err := run(scan)
is.NoErr(err)
// t.Log(result.valuePT1)
is.Equal(result.valuePT1, 70)
// t.Log(result.valuePT2)
is.Equal(result.valuePT2, 8)
}
func TestExample5(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(example5))
result, err := run(scan)
is.NoErr(err)
// t.Log(result.valuePT1)
is.Equal(result.valuePT1, 80)
// t.Log(result.valuePT2)
is.Equal(result.valuePT2, 10)
}
func TestInput(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(input))
result, err := run(scan)
is.NoErr(err)
// t.Log(result.valuePT1)
is.True(result.valuePT1 != 51)
is.Equal(result.valuePT1, 6649)
t.Log(result.valuePT2)
is.True(result.valuePT2 != 0)
is.Equal(result.valuePT2, 601)
}
// first: 51 false
+10
View File
@@ -0,0 +1,10 @@
...#......
.......#..
#.........
..........
......#...
.#........
.........#
..........
.......#..
#...#.....
+140
View File
@@ -0,0 +1,140 @@
..............................#.........................#.......................#..............................#.........................#..
....#.....#...................................#.............................................................................................
.....................................#..................................#...................................................................
...................................................#....................................................................#...................
...............................................................#..................#...............................#.........................
...............#.......................................#...................................#.....#.......#.........................#........
............................................................................................................................................
............................................................................#...............................................................
.......#.......................#....................#.......................................................................................
........................#..................#....................................................................#...........................
..#.......................................................#.........#....................#....................................#.............
..............#...........................................................#..........................................................#......
......................................#...........................................#..........................#..............................
.....................................................#.........#..........................................................................#.
#.......#....................................#.................................................#............................................
..............................#.......................................#..............#....................#..........#......................
....#...................................#...................................................................................................
....................................................................................................#.......................................
.....................#...........#...............................................#..................................................#.......
...............................................#.........#..................................................#..................#............
..........................................................................#...............#........................#........................
.................#.......................................................................................................#..................
......................................................................................#..................#..............................#...
.............#...................................................................................#..........................................
#...........................#..........#....................................................................................................
.........#........................................................................#...............................#.........................
.....................#.........................#.....................................................#....................#......#..........
.....................................................................#......................................................................
................................#.....................................................................................................#.....
...............#..........................................#.................#................#..............................................
....................................#...........................#...........................................#...............................
.......#...................#................#.......................................#..............................#......................#.
......................#.................................................#................................................#..................
....................................................#......................................#............#...................................
.............#........................#..........................................................#.............#............................
...................#..............................................................#.........................................................
.........................................................#..................#..........#....................................................
........................#.....................#..............................................#.........................................#....
.................................................................#.........................................#...................#............
...................................................#........#.....................................#......................#..................
.........#....................#.......#................................................................#............#.......................
#.............................................................................#.....................................................#.......
..................#.......#.................................................................................................................
.............#........................................................#........................#................#..........#..............#.
.....................................................#......................................................................................
.......#...............#.................#......................#................#..........................................................
...................................#.....................................................#............................#.....................
............................................................................................................................................
...............................#........................................#.........................#.........................................
.....#.........#...............................#...................#.....................................................................#..
............................................................................................................................................
..........#......................................................................#..........................................................
.........................................#.............................................#......#...................#...................#.....
........................#.....#........................................................................#....................................
...................................................#.....#...................#..............................................................
....................................................................#...............#....................................#........#.........
...........................#..............................................................#.................................................
...#........................................#.........#.......................................................#..............#..............
..........#....................................................#................#...........................................................
..................................#..................................................................................#...............#......
.................#..........................................................................................................................
............................................................................................................................................
............................#.............#................................#.........................#.....................#................
.........#.........................................#............#.........................#............................................#....
....#................................................................#.........................#..............#.............................
...................#......................................#.................................................................................
..............................#......#..............................................#..............#................#.......................
.............................................................................#..............................................................
.......#.........................................................................................................................#..........
..............#............#....................#...................#............#.......#.................................#................
................................#......................#................................................#.................................#.
............................................................................................................................................
.#......................#......................................#...............................................#............................
........................................................................#............................#......................................
..................................................#..........................#..........................................#.......#...........
.........................................#..........................................#....................#..............................#...
......#...............#.................................#...................................................................................
....................................#.......................................................................................................
...............................................................#................#........#.........................#..........#.............
..#........#.....#..........#...................#...................................................#.......................................
.......................................#...........................#...........................................#............................
.............................................................................#..............................................................
.......................#..................................#............#...............#.......#.....................................#......
............................................................................................................................................
............#.....#................................#...........#...................................................#............#...........
...........................................#..............................................#.................................................
..................................#..............................................#.....................#....................................
..................................................................#.........................................................................
...#..........................#............................................#................................................................
.......................................................#..........................................#........#........#.......................
.......................................#.................................................................................#......#...........
.................................................#..........#.........#.......................#.............................................
............................................................................................................................................
....#...........#........................................................................................#.......#...........#..............
......................#...........#.......#....................#..............#.....#.......................................................
.........#...............................................................................#..................................................
..................................................#.........................................................................................
...................#......................................#...........................................#...........................#......#..
.............#..........#.....................#....................#........................................................................
...............................................................................#.....#.....#.................#......#.......................
...#.........................#...................................................................#........................#.................
............................................................................................................................................
.......#.........#..........................................#...............................................................................
.................................#..............................................................................................#...........
........................................................................#..............#.......#..................#........................#
.#...................................#......#......#........................................................................................
............................................................................................................................................
.............#................#............................................................#..............#.................................
......#.....................................................#.......................#................#...............................#......
...................#..............................................#.......................................................#.................
....................................#.....................................#.................................................................
........................................................................................................#.......#...........................
....#.....................................#...............#...................#...............#.........................................#...
.....................................................................................#......................................................
....................................................#...........#......................................................#............#.......
........................#...................................................................................#...............................
............................................................................#.....#.........#......................#........................
...#.....#.....#.......................#....................................................................................................
............................................................................................................................................
......................................................................#.....................................................................
......................................................................................#............#..........................#.............
.....#.............#.........................................................#................#.............................................
..............................#..........#............#.....#...........................................................#.............#.....
........................................................................#................#..................................................
..................................................................................#.........................................................
......................#.............#....................#........................................................#.........................
.................#................................#.............#.............#.............................................................
............................................................................................................................................
...#..........................#.............#....................................................#.......#...............#.........#........
........#...........#.................#..................................................................................................#..
..............#.................................#.....#..........................................................#..........................
...........................................................#......#.........................................................................
............................#..................................................#.....................................#......................
...................................................#.......................................#................................................
.#................#................#...............................................#...........................................#.....#......
.............#....................................................................................................#.........................
.........................#...........................................#.....#......................#..........#..............................
........................................#...................#...........................................#...................................
...#......#............................................................................#....................................................
...............................................#.......................................................................#....................
+197
View File
@@ -0,0 +1,197 @@
package main
import (
"bufio"
_ "embed"
"fmt"
"sort"
"strings"
aoc "go.sour.is/advent-of-code"
)
// var log = aoc.Log
func main() { aoc.MustResult(aoc.Runner(run)) }
type result struct {
valuePT1 int
valuePT2 int
}
func (r result) String() string { return fmt.Sprintf("%#v", r) }
func run(scan *bufio.Scanner) (*result, error) {
m := NewMap()
for scan.Scan() {
text := scan.Text()
m.readLine(text)
}
return &result{
valuePT1: m.expand(1).sumPaths(),
valuePT2: m.expand(999_999).sumPaths(),
}, nil
}
type Map struct {
rows int
cols int
emptyRows map[int]bool
emptyCols map[int]bool
*aoc.List[rune]
}
func NewMap() *Map {
return &Map{
emptyRows: make(map[int]bool),
emptyCols: make(map[int]bool),
List: aoc.NewList[rune](nil),
}
}
func (m *Map) String() string {
buf := &strings.Builder{}
fmt.Fprintf(buf, "Map size %d x %d\n", m.rows, m.cols)
fmt.Fprintln(buf, "empty rows:", all(m.emptyRows))
fmt.Fprintln(buf, "empty cols:", all(m.emptyCols))
n := m.Head()
for n != nil {
fmt.Fprintln(buf, toXY(n.Position(), m.cols), n.String())
n = n.Next()
}
for row := 0; row < m.rows; row++ {
for col := 0; col < m.cols; col++ {
if n := m.getRC(row, col); n != nil {
buf.WriteRune('#')
} else {
buf.WriteRune('.')
}
}
buf.WriteRune('\n')
}
return buf.String()
}
func (m *Map) readLine(text string) {
if m.cols == 0 {
m.cols = len(text)
}
emptyRow, ok := m.emptyRows[m.rows]
if !ok {
emptyRow = true
}
row := []rune(text)
for col, r := range row {
emptyCol, ok := m.emptyCols[col]
if !ok {
emptyCol = true
}
if r == '#' {
m.Add(r, fromXY(col, m.rows, m.cols))
emptyCol = false
emptyRow = false
}
m.emptyRows[m.rows] = emptyRow
m.emptyCols[col] = emptyCol
}
m.rows++
}
func (m *Map) getRC(row, col int) *aoc.Node[rune] {
return m.List.Get(fromXY(col, row, m.cols))
}
func (m *Map) expand(rate int) *Map {
newM := NewMap()
newM.rows = m.rows + rate*len(all(m.emptyRows))
newM.cols = m.cols + rate*len(all(m.emptyCols))
offsetC := 0
for col := 0; col < m.cols; col++ {
if empty, ok := m.emptyCols[col]; ok && empty {
for r := 0; r <= rate; r++ {
newM.emptyCols[offsetC+col+r] = true
}
offsetC += rate
continue
}
}
offsetR := 0
for row := 0; row < m.rows; row++ {
if empty, ok := m.emptyRows[row]; ok && empty {
for r := 0; r <= rate; r++ {
newM.emptyRows[offsetR+row+r] = true
}
offsetR += rate
continue
}
offsetC := 0
for col := 0; col < m.cols; col++ {
if empty, ok := m.emptyCols[col]; ok && empty {
offsetC += rate
continue
}
if n := m.getRC(row, col); n != nil {
newM.Add('#', fromXY(offsetC+col, offsetR+row, newM.cols))
}
}
}
return newM
}
func (m *Map) sumPaths() int {
var positions []int
n := m.Head()
for n != nil {
positions = append(positions, n.Position())
n = n.Next()
}
var paths []int
for i := 0; i < len(positions); i++ {
p := positions[i]
pXY := toXY(p, m.cols)
for j := i; j < len(positions); j++ {
c := positions[j]
if c == p {
continue
}
cXY := toXY(c, m.cols)
path := aoc.ABS(cXY[0]-pXY[0]) + aoc.ABS(cXY[1]-pXY[1])
paths = append(paths, path)
}
}
return aoc.Sum(paths...)
}
func all(m map[int]bool) []int {
lis := make([]int, 0, len(m))
for k, v := range m {
if v {
lis = append(lis, k)
}
}
sort.Ints(lis)
return lis
}
func fromXY(x, y, w int) int { return y*w + x }
func toXY(i, w int) [2]int { return [2]int{i % w, i / w} }
+41
View File
@@ -0,0 +1,41 @@
package main
import (
"bufio"
"bytes"
"testing"
_ "embed"
"github.com/matryer/is"
)
//go:embed example.txt
var example []byte
//go:embed input.txt
var input []byte
func TestExample(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(example))
result, err := run(scan)
is.NoErr(err)
t.Log(result)
is.Equal(result.valuePT1, 374)
is.Equal(result.valuePT2, 82000210)
}
func TestSolution(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(input))
result, err := run(scan)
is.NoErr(err)
t.Log(result)
is.Equal(result.valuePT1, 9627977)
is.Equal(result.valuePT2, 644248339497)
}
+6
View File
@@ -0,0 +1,6 @@
???.### 1,1,3
.??..??...?##. 1,1,3
?#?#?#?#?#?#?#? 1,3,1,6
????.#...#... 4,1,1
????.######..#####. 1,6,5
?###???????? 3,2,1
+1000
View File
@@ -0,0 +1,1000 @@
?#.??????#??#?#?#?#? 1,1,15
.???#??.????#?? 6,5
???????#?#?#?#??#?? 1,1,6,1,1,2
##?..???#?????# 2,1,7
.?????????? 2,2
??????##????#?.?.??. 1,7,4,1,2
?.???..???.?..?## 2,1,1,3
??...??.??? 2,2
????????#?#????#.?? 1,1,7,1,1
.#..??##?.#.?? 1,4,1,1
???#????????.???#??. 1,1,5,6
.?.??.?#?#?.???#?? 4,2
.??#??#?.??.# 2,2,1,1
#.??..?.????.??? 1,2,1,2,1
?.?.?#??.???##??#. 1,1,1,2,2,1
?????.??.??? 1,1,1,1
..?????.????? 2,1
#?##??.??#??#?..?? 6,3,2,1
.???????#?####??#.# 1,13,1
?.#??.????#?.? 3,4
.??.#??#.????????? 1,1,1,4,1,1
???#???????#??#.??? 1,12
???????#??? 1,3
???????.??##???.. 1,6
??????.?#.? 3,1,2
?#.#?????????? 1,1,3,1
?????????? 1,3
?????#?????#? 4,4
????????.?# 1,2,1
?..?????.?.. 1,2,1,1
.?#??#..???##????.#. 5,6,2,1
?..?#?#????#?# 1,7,1,1
????#?#?..???? 1,6,2
.#???.?????. 2,3
???#.?.#??.?##?????# 2,3,2,3
.??????#???. 1,2,2
???##???????##?. 6,1,1,3
??????????..##.? 5,2
#.#?#??#????.?#? 1,3,6,2
??#?????#??? 1,2,2
#?#.???#..#?? 3,1,2,3
.#?????????#??????. 5,8
.?#??.#????????? 2,1,2,1,1
..?????.#?##?.#.#?? 2,1,5,1,2
?#????#???#?#?? 1,1,6,1
.?????#?????? 1,3,5
.#.?.??#?#?#??#?#?#. 1,12
#???.#?????.????#?# 1,1,1,1,2,5
?.???????.#?????#??? 1,1,3,7,1
?????????? 1,1,2
..????#??#?????.?.? 1,10
???#?###?#??????##.? 8,6
..???????#??#????. 11,1
.?#?.?????. 2,4
?.###??##?..?????? 7,4
#??????#????##????#? 1,3,1,5,1
???#.?.???????#??#? 1,2,1,1,6
??#???#?#?##??? 4,7,1
?##?.??.??? 2,1,2
??.??.??###? 1,1,1,3
?#..#???.#??????? 1,4,7
??#?.??##.? 1,3
.??#??..???.?? 5,3
??????.?#??#???#?? 2,1,2,5,1
.????#?.??? 2,1
.#??##??#????#.?.? 9,1,1,1,1
??.???????.??.?#?#. 2,1,5,2,1,1
??????????#??#?#? 1,14
??#???##?. 1,4
?..#????.##?#?. 4,4
??#??#???.?????? 8,1
?.#.#??.??#.## 1,3,1,2
???##?#?.##??. 5,2,1
?.???..?..??????#? 1,1,1,1,1,4
?#????????????? 12,1
??????##??.#????? 6,1,3
????#???#?.?? 1,2,4,1
????????????#??? 1,1,8
?????##?.?#? 1,3,2
??????.#..?????#. 4,1,2,2
?#?#????????? 2,2,4,1
..#?.????? 1,1
??#??#...?. 5,1
?????.???? 3,3
?????##.????. 1,3,1
..?.?????????? 1,8
?#?#?#??.#??#.? 1,1,1,1,4
?#?????????## 2,1,7
#?##?##??.?.?#.?#.? 8,1,1,1
?????#???.##??.?.. 4,1,2,1
?#?#??#.?????????.# 4,1,2,3,1,1
??#?#?#???.????#???. 1,1,1,1,1,7
?????#??????????? 10,2,1
???????.?? 4,1,1
?..????.?????###? 1,3,8
???#????#??#??#.? 6,1,5,1
#.????..#? 1,2,1
.#?.#?#.??.?###?. 2,3,1,4
????##???????.?# 1,5,1,2
.##??##???????.? 7,2,1
???#?#.??????? 3,4
.?##.?.????.? 3,3
#.???#.?????#???.#. 1,4,4,1,2,1
.?.?.##?##??#?? 1,1,6,1,1
????#.?#?#?.?.. 2,4,1
???????#?.?? 9,1
????.#.#.??.????.#? 1,1,1,1,4,1
?.?#??????????#??# 1,4,10
.?.?????????#??? 1,10
.?#??#????#?..?## 5,3,2
#?#?.?#??? 1,2,3
???????#??.?????. 1,7,1,1,1
?.??#?.???????##??. 1,4,2,1,4
?#??#?#???#??# 1,3,3,1
.?.??#.???.????.???? 3,2,4
??#????.?. 2,1,1
?..??#?.#???.?.?# 1,2,3,1,1
##??#????????## 3,1,4,2
??????#?.????.#??#? 2,2,4,4
#???????##????## 1,1,11
#???#?#??#.#??.?#?. 1,5,1,2,3
?##..??.????????? 2,2,3,3
..??#??#???.?? 2,3
#???.??#?.???.?##?? 1,2,2,1,4
??##?#????.??? 1,5,2,1
??###?????.??? 8,2
????????.?#???? 1,1,1,1,2
??#?????#?#?.#???.#? 4,1,5,2,1,1
.????.?????# 1,1,1,1
..???.?.???.? 3,2
??#??.????. 4,2
???#?????#????? 1,1,3,1
.#??#??.?#?###? 4,5
??#??#??..??.????? 2,1,2,3
???#??????##??### 2,1,1,7
????.??#??????.???? 2,1,9,1,1
.#?.###????? 2,4,2
.####?.?.?# 4,2
.?##??????##.?. 7,3,1
????.?##??# 1,5
###??#?#????????.. 8,6
?.???#????.?.?#????? 6,1
????..?????? 2,1,1,1
.????##.????. 6,1
?#??????????? 3,1,1,1
??.???#????#?##?. 1,13
?.?#??#?##???.???..? 9,1,1,1
??#?#?#.?#???? 7,4
??###???????. 6,2,1
??##?#.???.?##?? 3,1,2,3,1
????????.#?##?????.? 1,2,1,4,4,1
??.??????????.?????? 9,1
.#?.?#???#?????.# 1,8,1
??.?????#????# 1,2,1,2
??#.??#..#?? 1,1,2,3
#?..??##??#?? 2,8
????#???#????# 10,1
????????#?#??? 1,6
???????.??.#????## 1,4,1,1,1,2
???#?????.??#.??.?? 1,3,2,3,2,1
?.?.#???#??#?????? 2,7
..#?.?.??#? 1,3
???#?#??..???.?? 5,1,1,1
.????#?.??##??#?# 4,7
???#???#?##?????? 2,6,5
.?##?#?##??#?#?.???# 2,1,8,1,2
???????.?#???? 3,4
#.?#??????.??? 1,4,1,1
?????#???.. 1,5
.#???#???????#?#?? 1,1,6,2
#???####.#??.??? 1,5,3,1
??#??..#?.?? 3,2
?#.????#??#.#? 1,1,6,2
..?##?.?#??.#?? 3,4,2
?..?????.? 1,2,1
..??#??#??#????.#? 11,2
????????.????##??? 1,2,1,6,1
???????#??#.?.?#??? 10,3
.#.???#.?. 1,2
??????#???#..?? 2,3,1,1
?????###?.??????.?# 9,1,1,1,2
??##????.?????????? 8,1,1,3,1
??##??.#?.#??# 3,1,1,1
?#???.?##?????..? 3,5,1,1
#??????????.#???#??? 5,1,3,2,2,1
??.#..????????? 1,6
?.?#??#??..?? 3,1,1
??????.?..???. 3,1
??#???#??.??? 8,3
??????.#??????? 3,5
??#..?#?.???#?.. 3,2,4
????..???#? 3,3
?.#????????.??.#??# 4,1,2,1,2,1
??.?##???##???? 1,3,6
#?#.??#?.?### 1,1,3,4
?.#?.??#?????? 1,2,6
??.#.?.?????????#? 1,1,7,1
?.???##???#.?? 5,2,1
????????#?#..# 7,1,1,1
?#?.??.?????.??# 2,2,3,1,1
.??#?####??????? 10,1
.????.##??????#??#. 4,12
.?.??#?##???#? 6,2
????##????? 1,3,3
?#?.????#??#???????# 2,11,4
??..???.??. 1,2,1
????????#??.?????.?? 2,4,2,1
??????#??..#?? 1,1,5,1
???.#???#? 1,4
???.???????????? 1,1,1,3,1
??#???..?#?#?? 2,1,6
?.??#?.??.?.???.?? 1,4,1,1,1,1
.?.??.?##??#. 1,2,4,1
????.#???????##??# 1,1,1,8,2
?.?#????.?.#??#?#?#? 1,1,1,1,1,9
??##??##??#???? 3,2,1,1
#?.?.?#??#??#.? 1,1,6,1,1
?????.?????? 1,2,2,2
.???#??????#??#?. 5,7
.????##?#?#????.??? 8,1
?.??#?#???.#????. 1,6,1,1
.?.????.?.?.#???#?? 1,1,1,1,1,6
??##??##.????????.. 7,3,1
..#?.###?#??????#?#? 1,8,3
???##..???? 2,2
?.???#???????##?##? 1,6,6
?...?..?#?.? 1,1,1,1
???#??#?.?#?. 1,2,1,2
??????????.???????.. 3,4
?????.?????.?#?#?# 3,1,4,6
?#???.?????..# 3,2,2,1
#?.#???#???.?#? 2,1,2,1,1
?.#????#?#??? 1,3,1,1
.?#???.??? 4,2
??????##?????.#?? 2,6,2,1,1
#??#?#??????. 1,2,5,1
?#??##???.??#????.? 2,3,1,1,1,1
#.?????#?#..#? 1,1,5,1
.??.#.?#???? 1,5
?##??#?????. 7,1,1
??.???.??# 2,2
?.????.#??##??#???#? 1,1,1,2,5,4
???????#???? 4,1,2
?#.?.????????? 2,1,4,1
#????##?#??????.?.?? 1,2,10,1,1
##?.#???#??????? 2,1,1,8
???.?????????# 2,1,1,5
???#.??#??.?.??. 1,2,4,1,2
??#?#?##???.# 1,8,1
???..#?????????#? 1,1,1,6
??##??..??????#?.? 1,2,1,2,5,1
???#??###?#.?? 2,5,1
?#?#????.????##? 5,2,6
?##??.???.??##?###?? 2,3,1,6,1
#####????????.? 5,6
.?.??#?.#?.?? 4,2
?#????.??#?. 5,2
????#??.####?. 5,5
???????##?#???#?.#?. 2,11,1
??###?#??????.??.## 4,1,2,1,2,2
?####????#.??#.? 7,1,1,1
????#?.#?? 4,2
??.??..??#????? 2,2,6,1
#??????#?#?..??? 1,1,7,1
#?????????????#??# 1,1,1,1,6,1
?#??.?????.???.# 3,4,1,1
??#????????.?#????? 1,4,3,7
??????.??.#????????? 2,1,1,1,5
?..??##.?# 4,1
??#???.#?? 4,1
?.??????????????? 1,2,6,4
.???.#????.?# 1,2,2
.##?#?????# 4,1,2
.??#?##.?#?#?##.. 6,6
???.?#?###??? 1,8
??#?#?#??.?.??#?? 7,4
????##????#?????#? 14,2
.#.#?#??.?..???? 1,5,1,1,1
#?#?????#?.???#???? 10,5
?????#?..?.??. 5,1
?#?#????#? 5,3
??##.???.???# 2,1,3
?#?.?????? 2,1,3
.????#???? 3,1
?????.???..? 3,1,1
???????#?????? 7,3
?????????# 3,1
????.??#???.?? 2,4
??????????#?? 1,8
???#??????##??#?..?. 14,1
????.????????.???. 1,1,1,1,1,3
?#????#???? 2,4,1
##?????#?. 3,2
??#???..?#.???? 2,2,1
??#???????##.?? 2,2,4,1
?#???#?#.?# 8,1
.??????.?? 1,1,1
?#??##?????????? 6,2,2,1
#????..##???? 1,1,2,1
????##???#?.???..? 10,1,1
??????#????# 4,6
??.??#.??.? 1,1
.?.?.?##??.#???? 1,4,3,1
????#?...??##??#?#?? 4,8
?#?????#????.??????? 12,1,1,2
?###??????#? 6,4
#.?#?#?#??#?#? 1,1,9
?.???##??#??#??????? 11,3
?#????#????????...# 3,3,3,3,1
.#?..#?.#???? 2,1,2,1
??..?#.??????? 1,2,3,1
?#..??#??#??? 2,8
??#???.???##?. 1,3,1,4
????#?#?#?#?.??.# 3,8,1,1
??????#??? 2,1
#??????#??#.#??# 5,5,1,1
?.???.?##??? 2,3
?????????.?? 1,1,1,1
????????#????.#??? 1,1,6,3
?##.???.?##? 3,1,2
?????????????????#? 1,1,1,1,1,5
???#.?#.??##???? 2,1,4
.????.?..? 1,1,1
??????.##?#?? 1,1,4
?#???.???? 2,1,2
#????#??#?#..?? 11,1
?..????###?????#? 1,1,4,1,2
?.#???#???#??. 1,9
.???#????..???.? 3,2
???.??#???.???? 1,1,6,1,1
???##???#? 2,2,3
???????#????.??#?? 1,4,2,2,1
#.#??#??????#? 1,4,1,4
.??#?????###?.??# 4,5,1,1
.??????#?. 1,3,2
#?#?????#?.????#?? 4,3,3
????.?#?.?? 2,1,3
?.??????????????.?# 1,1,4,1,1,2
?.#.#?????#? 1,3,1,1
??.#??.?#???#????#.? 1,2,3,6
??...?##?????. 1,4,2
.??.???.?? 1,1,1
.#??#.??.#?.?#?. 1,2,1,1,2
#?.????#?. 1,5
???##??????#??#. 8,3,1
.?.????#?##?## 1,1,7
???#??#?????? 2,1,1,1
???#??##???.?? 2,6,1
####??#??.?#??? 9,1,1
???.#??.?.?##?????.# 1,1,1,1,8,1
##.??????#?? 2,7
.??..????????#???? 1,8,1
#????#?#?#?? 4,1,3
?##??????????#??? 4,3,7
??????????#?##????? 1,7,6
??????#?.??. 1,2,1
??.?.?#??.?.##? 1,1,2,1,2
????.??#?#????? 1,5
?????#??#.???##??.# 1,4,3,1,1
.??#????????.?.?# 1,9,1,2
????#??.#???#??##?# 3,11
?###.??#?????#???#?. 4,1,1,2,1,3
?##?#.?????.????. 4,1,2,1,1
????#?.??##?.#???? 1,2,5,2,1
?#?#??.?#?? 4,1,2
.?#?.???#? 1,3
#????##?.##?#?.?? 8,4,1
.#.?.???#?? 1,1,2
?????##?????????#? 2,10,1
????..?#?#???????##? 1,13
????#?#????.??### 8,1,4
???????#???. 1,1,4
.??.#?##?#?.?#???.?. 7,4
#??..#???#?????.??#? 1,1,8,1,1
???.??.???#?? 3,1,1,1
?#??#???.???? 5,1
?#?.??#??##??##??.? 1,11
#?#??#??##???????? 1,1,1,8,2
???##?????#???.?.?? 1,9,1,1,1
??.???????????? 1,1,2,3
???.?.?#????#??? 1,8
??##??..#..? 2,1,1,1
??????#??????? 1,8
?????.#?#??.#. 1,2,4,1
?#.?#?#?##????#? 1,7,2
???#??????????? 1,6,3
?????#?????#.???. 1,8,2
???##..???????#???? 3,5,1
.??#.?.#?? 1,1,1
???.?#???? 1,1,1
##???.?#??.?.?.#..?? 5,2,1,1,1,2
???#??.?.?? 4,1
.???????###????#?? 6,4,5
???.??#?#???#????### 2,1,4,1,1,4
#?..???.????..?## 2,2,1,3
????#??.#????#??#.? 1,2,6,1,1
#??.##?#.?.?##????? 1,1,2,1,5,1
?????.#?#?#?? 2,1,5
????????????#???? 4,1,3,1,1
?.?#??#???.???? 6,2
.?..???.?#.??? 1,1
??#???#.??????? 1,2,1,5
#####?#????????? 8,1,2
???.???#???.. 1,1,4
??###..?..#???# 5,1,3,1
.?####?##.????? 7,2
?#???#??#???..? 1,3,3,1
.??##??????. 1,3,1,1
????.????#??##?????# 4,1,9,1
??#??.???#.#??? 3,1,1,3
??????#??.?..??#..?. 1,7,1,3,1
#???#.??????.???..? 5,2,1,1,1,1
??????????.???? 2,1
##?##???#????.? 5,5,1
..??.?.???.?? 2,2
#????.??#?#????.?? 4,4,1,1,1
??.??.????????#. 1,1,3,1,1
.#####?#??????#??. 10,4
?????????????#?.?? 2,7,3,2
?????#??#?? 1,3,4
.?#?????????#??? 2,1,4
#.??#??##????#??#? 1,15
??????.???.? 1,1,1,1
???.#.##??#.?###? 1,1,1,5,4
..?#?##.??????# 5,2,3
#???????????.?????. 6,2
??#??#.#???#?? 4,1,4
????.???#?. 1,1,3
????#????#?#.???#?? 1,8,1,2
?????.##????#???? 5,4,1,1,1
??????.????? 2,1,1,1
?##?????.???#? 6,1,1,2
?.#??#?#.??#??.#. 1,1,4,4,1
#?.#???.?.?#?????? 2,1,1,1,4
????#??????.????.. 2,2,1,1,2
?.###??.?????.# 5,1,2,1
???..######.? 1,1,6,1
.##???????.# 3,1,1,1
#????.????????? 1,1,1,1,2
#??#.#?????#??.???# 4,1,1,2,1,1
?#???#??#.???.. 5,1,1
???#?????#???? 3,1,4
.???.?????? 2,1,1
???#???#????##?? 4,1,7
??#.??.???#?????#.? 2,1,1,6,1,1
?##.??#????.?#?#??. 3,2,3,6
.#??#??????#?? 2,9
?.???#??.???#?# 1,1,1,1,6
????#??#???.? 1,1,4
??????#?.????#?###?# 6,11
#????#????#??#..?? 1,4,3,1,2
???#??..#??#??# 1,3,1,5
??.???##??####? 1,1,3,4
???????????#.. 3,4,1
#?#??.#?#?#?? 5,1,4
?.??#??#???##???? 1,1,1,3,2
?#???????#????? 12,1
?.?????#?? 1,2,1
#????#??#????#???##? 1,1,1,2,9
??###??#?#???#.??? 11,2,2
#?..??#???.? 1,5,1
??#.?#????#?????? 1,3,2,1,2
??#??????##???? 6,3,1
.#?.?#.#??#??.#?#?#? 1,2,1,1,1,5
?#?#???.?#??#.. 1,1,1,2,1
????#????##.?# 1,7,1
.??????????????#... 3,3,1
..?..?.?##?? 1,5
??#?...##?#?#? 2,2,4
.????.?#.?.. 4,1
??.????#??##??#???? 1,9,6
...?#??.?.. 4,1
?.?.#..??..# 1,1,2,1
???##??.??. 2,3,2
?#?#????????.?#???? 1,3,2,2
???##?????. 5,2
???#??#??###???#.? 6,5,1,1
???.???..##??#?#### 2,1,1,3,6
??#??.?#..#.? 1,1,2,1
.????#??#.?###?##.? 1,1,1,1,6,1
.####?????? 4,2,2
?.?#?#??????.??#?. 1,6,1,2
????????????? 8,3
#?##?????.?? 4,1,1,1
??#????#????#???#? 3,1,1,3,1
.#.?.#.?#?#.? 1,1,3,1
?#.??#???.?????? 1,5,1,1,2
..????????. 2,3,1
.????.#????#????? 1,1,3,2,2
..??.???.#?.?##?#? 1,2,2,4
??#?#?#??##????? 1,10,1
.??????#???. 1,1,1,2
.?....#???? 1,4
?##??..???????.?? 5,1,1,2
.?.??????#?. 2,4
?????.??#??#? 1,2,7
?#????.??????..??#? 5,5,3
#???.#?###????.? 3,5,1,1,1
#?#????.??#??#?? 6,5
#?#????.??##????.? 7,4,1,1
.#?.?????# 2,2,1
?.??#?.#????? 1,2,1,3
???#?.???..# 1,1,2,1
?###??#?????? 6,1
?????#?????.? 4,1
.???..#?.?????#? 3,2,3,1
.?#?????.?# 6,1
#???????.?? 1,6,1
?#..?#???? 2,3,1
?###??#??#.?.???. 9,1
?#?#.????#. 3,3
???..?..???#????? 1,1,2,5
???..?##???.?.?#??# 1,4,1,1,5
#?????#.?? 3,2,2
.?.????#???????. 1,5,2,2
.????????#???? 8,1
??.??#??????#???#?? 2,6,1,1,1,1
?#????##??????#??? 13,1,1
???.?#..#??#?#??#?## 2,2,12
.???#????????.. 5,2
.#??.???#??..?#?? 1,2,3,2
??.?????##??.??? 2,1,1,4,1
?#.???#??##.? 2,5,1
???????#?#??###???# 2,1,9,3
?#???.??#???. 3,4
.#..????#??????#.??? 1,4,3,1,1,1
#???#..??#? 5,4
?.??#?.???????#?#? 1,1,1,1,2,5
.?????.??.??.? 2,2,1,1
?##?#?#?... 4,2
###??.????????.?.?.? 4,1,1,2,1,1
???#.?#?????.???? 1,1,7,1,1
???????.??.????? 7,2,4
??#?###??.????????? 9,2,3,1
?#?#?#???#.???#??#. 6,1,1,4
?.?#???#..? 2,1
????.???#?#?.?#?.?? 4,6,1
?????#?????#.? 1,2,1,1
?#.#.?.??###??? 1,1,4,1
?#.???.#?.?? 1,1,1,1
??..?#?##? 2,6
??????.?##?.??????? 1,1,1,4,1,1
???#??????? 4,1
???????#?? 5,2
?#?????#?#?? 3,4,1
#?###????#?..??##??? 10,4,1
.???????#?# 4,2,1
#???????.?#?? 1,3,2
..????#?...??????. 2,4
.?????????? 1,1,2
??.?.??????####? 3,5
?.??#??????#??.???# 1,1,9,1,1
???.?.?#?#??? 1,4
?.??##??#? 1,2,2
#??##.???.? 5,1,1
?????.?????????. 3,2,3
?.??.??#?#??. 1,5
?????##??#????#. 1,3,2,4
.??.?#????.#???#???. 2,1,1,1,5,1
.#?.?.??#.?? 1,1
???#?#?#.?.?????.? 1,6,1,1,1
###??#..#..??#?. 4,1,1,1,2
.#???????#.?# 1,5,1,1
????????#???#??????# 1,15,1
.?#??#?#?#??#.??? 2,9,2
????##????#?###???. 12,2
?##??.??.#?#####?#.? 2,1,1,7,1,1
#??????..?#?##?#? 5,6
.?.#????.??????.??? 1,2,6
?#?##?#??????.???#? 7,1,1,1,1
.????????#?##.?.?? 1,8
?????##?#.??###?..? 5,3
#..?#?###?#????.? 1,7,2
???????#.??#? 7,1
?#????????.? 8,1
.?##?#?#?.#??? 7,1,1
.?????????.?????? 7,1,1,4
????#?#.???????#??#. 5,10
.?#???????.?? 3,1
?????.?#?? 1,1,1
????#?????#?.?#. 1,9,2
???.???.#?# 3,2,3
??#.###??#.?.? 1,6,1
#??#?#??????#????? 1,3,6,1
.??#????????? 2,1,1,3
???????.????????? 6,4,3
?###?#?#?..???.??? 9,2,2
?#?###?????.???# 6,2,2,1
?.?.??#?.. 1,1
.?#??#?.???? 6,2
???##??????#?.?.. 9,1
??##?#???????? 8,1,1
?##?#?#?#?#????##.#. 16,1
#???.????#?#?#? 4,1,5
?.??..??#??.????# 1,1,5,2
.???.??????? 2,7
?##??????#?? 3,3
.?#.?.??#? 2,2
..?.???..? 1,1,1
.???.#??????? 1,6
????#???#???###?.? 1,6,4
????.#????##.#?#?? 3,1,4,1,2
.??#??#?.?????. 6,4
?#?#???.??#??? 1,1,1,5
???#?#????#???? 1,5,1,1
??.##??#????.?? 1,2,2,2,1
?#..?????????#??.... 2,1,3,2
??#.????.? 1,1,1
?.??#?..???. 3,1
???????.??#?? 1,1,3,2
?##?????.??###.. 2,2,4
????????#???#???? 1,2,4,2,2
????.?.?????#???? 1,1,1,6,2
???????#?????.??# 10,1,1,1
???#??#??## 1,4,2
????#???#.?????? 7,1,3,1
?????????.?. 1,7
.#???.????#?.#.? 4,5,1
###???#.??. 7,1
???#??.???...?????? 1,3,2,1,1,1
????.?.???.? 3,1,2,1
##??????.???## 3,3,1,3
??.?.?????#??#??# 1,6,2,1
.?????????????# 4,2,1
#??.?#?.?.?##### 1,1,1,1,6
?#.???.????. 1,2,1,1
.?#???.???? 2,3
????.#?????????. 1,1,2,4
???#??????#??#?# 1,3,1,6
.#??#?..????#?#? 5,4
?.#.??.?##???#??#? 1,10
??#.#?..???#?#????.? 1,1,10
...???.#????...??? 3,1
???#?.?????????. 4,1,7
??#??#????? 2,3,2
??????#.??#? 3,1,1
???.?.?????#??.##? 3,1,3,2
.?..??#????.?.??.? 1,5,1,1,1
?..?..##??.??##..? 3,3
#??????#?#?? 1,1,2,2
#?.?????????????#??. 1,6,1,1,1,1
?.????###???? 1,7,2
?.????####???# 1,9
???????#??.#?????? 1,5,1,1,1,1
??.#?#???#.?. 1,5,1,1
###??#???# 3,2,2
?##..?????# 2,1,4
.??????##????. 8,2
?.?????.#?.??????#?? 1,2,1,1,7
.??#?#??.??? 1,1,1,1
#?.#???#?.???. 1,1,3,2
?.??.????????#? 1,1,3,1,1
???????#??????#????# 1,4,9
.?#????????#.##?# 4,1,2,4
??#.?.?##??.. 1,4
???.??.?#?..? 3,1,3,1
?????...????? 4,4
?###?????.?.? 7,1,1
.?.???##?.??.?.?. 1,1,3,2,1
?#??????#????#.????? 2,2,4,1,1,4
.?.??????? 1,2,2
????#?#??#?????#?.?? 1,7,2,2,1
.#???##?#??#?##?#??? 6,1,9
?????????? 3,2
????#???####?.? 1,1,6
??.????.?..?? 1,2,1,1
??????.#?#??? 1,1,3,2
????????.??? 6,1
?#?#????????.? 7,1,1
??#?.#??##???## 3,2,4,2
??????#?##?#.?? 11,2
???????????#??? 1,1,1,4
???#?#?.#?????#? 5,1,1,1
#.????????#? 1,2,1,3
?.?#??###?.#?? 7,1
???#.#.???.#??? 2,1,1,3,3
??????#??.? 2,4
.##???#?????????. 10,2
?.??????#????#????? 6,5
???#??#?.? 2,2
?.?????#???? 1,1,1,3
??????###???#?##? 3,4,6
????#.???#????? 3,6
.??#?.??.????#.?.??. 2,1
??#??#??????#?#? 2,6,4
.#???.???#???.# 4,7,1
#.?.#??#????. 1,2,2,1
???#.?#??#?????? 2,2,3,2
#.??#?#??#?###??? 1,12
.???..#?#????.#?? 3,3,1,2
.????##?.#???? 5,5
??.??.?.??? 1,2
??????????#? 1,1,3,1
#???#??.??? 1,3,3
..????..#? 1,1,1
??????#???????? 3,3,1,1
???????#??#?????#? 2,9,1
.###?.??#?## 4,1,2
???????????.?.?##?? 8,1,5
??????#.?#???? 4,1,2,2
?#??.?#????#.????? 3,2,2,1,1,1
???#??.?#?##? 3,4
????##????????#??? 3,7
??#?????????.#.?? 7,1,1,1
#??#??..#??. 6,1
??????#???. 2,1,1
..?#??.??#??.?? 4,3,1
?..????.?????###? 2,1,5
.?..???#?#.??.? 6,1
..###??#.?##?##.??#. 6,5,3
??#?.????# 2,3
??????#?#????##?? 3,1,1,5
???????????? 4,3
#??#??#??#?. 5,5
??#???.##???????? 5,3,1,1
??????#?????????# 8,1,2
??#???##?????.#. 3,7,1
.???#.#????????#.?? 3,10,1
.?#?????#??.# 6,2,1
?.#??#####???..? 1,1,9,1
?#..?????#?.?? 2,1,4,1
?.?##?.?#?.?..? 1,3,1,1,1
?##.#??#?..?##?####? 3,1,3,8
.??#####?.?????# 7,4,1
?????#?#?????? 1,1,1,7
????#.#?????.??? 2,1,5,1
??????????#?????#?? 4,1,1,4
#???#???.. 2,4
??##???.?##??? 5,5
?.??##?.????..#.??? 1,1,3,2,1,3
..?????.#?.?. 1,2
?#??.?.?..#.? 2,1,1,1
??.#.??#.?#. 1,1,1,1
?#?#??#??##?????#?? 1,1,6,6
...??##?###?.?? 7,1
?#.?#????.. 1,3,1
??.????#??? 1,1,4
????##????????.??? 2,7,1,1
???????###??#.? 1,1,1,6,1
?.???#????# 1,5,1
..?????#????????. 1,11
?.?????#???###??.? 1,5,3,1
.????.#?.##?? 2,1,2
??.???###???????.# 1,1,4,3,1,1
.??#??????? 3,2
.?????#?????.????# 1,5,1,3
?..#.????#??.?? 1,3,2,1
.?????.???.#..??.? 3,1
?#.?.????#??.???#?# 1,7,6
.#???#??#?#??#? 11,1
#.?????#?????## 1,7,2
???#?##???#.???? 7,1,1,1
?????#??#???? 1,9
#?#??.???#????##? 3,11
.#?#??????.?#??#??# 7,1,5,1
??#?#????? 1,5,1
????#????#.?.. 9,1
?##.?.?.??.# 3,1,2,1
??#?.?.??#??#?###? 2,1,1,1,1,3
?.??..?#???##? 1,1,8
#..#????#?.# 1,2,1,1
#??.#??.??.?. 1,1,1,2
??#??????#??#????##? 1,6,7
???#???????#??. 2,1,5
#???????#??. 1,3,4
.?#?????????#?????? 1,10,1
?????##?#??. 3,5
???.?#???#?? 1,2,2,1
#.?#?.?#?.?# 1,2,1,1
????????????????.. 2,1,3,2,3
??#???#.???#?#?? 4,1,6,1
?.#?.????? 1,1,1
.#?????.?##??#. 1,2,1,6
#?##??#?.???????. 1,5,1,3,1
?#..?#?.???#. 1,2,4
??.????.?????#??# 2,1,1,6,1
???#?????#? 3,1,1
.#?#?#?.??? 6,1
??##??????? 2,2,1
#????#???? 1,1,4
?#?.?#??????? 2,1,4
??.???.##???#?#???? 1,1,1,9
????#?.??####? 1,1,6
#??##????.????#. 9,2,1
?#?????.?# 1,1,2
?.#?????#??# 1,1,2,4
?.??#??###??#..#? 1,9,2
?#??.?.?#?.? 2,2
???.??.??#? 1,1,1
?#??...#????###?#?? 3,11
?????##??#??#??# 1,1,6,1,2
????????.#? 2,1,1
??#?.??..#?##?.??. 1,1,1,5,1
..?#.?.???. 1,2
??###.##??? 1,3,4
???#?#..???????# 6,1,2,1
?.?.?????##?#?????. 9,2
.???##.?.. 1,2
?.????????##?. 1,4,1,3
?.????.##?????? 1,1,1,5,2
.??????##??#?#???? 1,9
?.#.???##??????? 1,1,1,4,4
.?#????#????. 2,3
.?.?##????.? 1,3
#?.?#??#?.?..??#??#? 2,4,1,3,1
??#????####?? 2,8
?.??#????????##?? 4,4
.##..????? 2,1
#????#????.??.? 1,4,1,1,1
#?#??????.??###?#??? 1,1,1,1,8
??.?#??#??????? 2,1,5,1
..?.???.??????? 2,3
?.????.?#???.?#?? 1,2,5,2
.#?????#?.?? 7,1
?#??.?????#?????#? 4,1,4,2,1
????#..???. 3,1,1
????##????#?#??#??? 1,3,9
.#??#??.?????#? 5,2,2
?#?..???#?? 1,4
???##?.?????#???#. 5,8
###?.?????? 3,3
?..???#?.#??#.??#.? 1,4,2,1,3
.?.?????#???? 1,3,1,3
?##?????????#?#??.. 3,1,8
??#?#??#????.? 4,2,2
#?????.#????#?#???#. 1,1,1,12
.??##????????.#??#? 10,4
#????.???.#?.##??#?? 1,3,1,2,2,2
#?????.?#.??? 4,1,1,3
.#??.??#?????##??#? 3,11
?.?????.??.???##? 1,2,5
.???.#??#??? 2,6
.????.?.#? 4,2
??##??????.#?#????. 8,3,1
.##??.?##?#??#??? 3,8
##.??#??..? 2,2
??.???#?####? 1,1,8
..???#??.???????###? 4,1,8
?????????#??????? 1,13
?.#??????#???#.?? 8,1,1
.??###??#??????# 1,6,1,1,1
????..??#??? 1,1,3,2
#??.???????. 1,3,1
?#?##???#?#?? 9,1
????#???#.?#??#?#??? 7,5,3
??.????????????? 1,1,1,5
??..????????#??.?? 1,1,6,1,1
.??????.#???? 3,1,2
?#???.#?#???.#??? 3,5,3
????????#??####?#? 4,11
??#??#???? 6,2
.#?????#??.??.???.?? 9,1,1,1
????.#?#?.???? 4,1,1,4
#?????????.? 2,1,2,1
.###?????# 6,2
????????????#??##??# 1,1,5,5
??.??????. 1,3
??#??????##?#?? 1,1,1,1,5
?.#???????#?? 1,3,5
????????.###???? 1,2,1,7
.??#????#???..#?# 2,5,3
???##??##?#????????? 1,9,2,3
#??##??????..?? 1,6,1,2
??????.?.????? 3,1,1,2
??????????????? 9,2,1
.??????#.??.??# 1,1,1,1,3
??????#???##?###??# 1,1,1,11
???????????.#???.?#? 4,2,1,1,1,2
?.???????#????#? 6,2,1
#?#??????????##. 3,2,5
.?.#??.?????.???#??? 3,3
??..??.?##??#? 1,1,3,1
?#???#????.???.?? 8,1
#.??.?????.##???.? 1,2,1,1,5
?.??#?.?###? 3,3
..????????? 3,1
????#..?#? 1,1,1
?#?????????? 2,1,1,1
???#.?#?..?.?#? 2,2,1
..#?????.?. 1,2,1
?.#????#?????#?.? 8,3
?????????#?????. 2,1,1,1,2
???#?##????? 1,4,1
????.?#?#????.?#? 5,2
.??#???###? 3,5
.#?.?.??#??##. 1,1,6
.?..?#????..????? 2,1
.?#.##???.?#?. 2,5,1
#.????.#???#?#. 1,3,1,3,1
.?.?????#?###?## 1,1,6,2
?#?????.??????.? 4,1,3,1
??#??.#??.? 5,2,1
?.???.??.???#? 3,1,1,1
???.???.??????#??? 2,6
??.?##??#???## 7,2
??.????#??.??#? 5,3
#??####???????.? 12,1
?.???#??#?#?#?# 2,10
???.?????#???. 1,1,9
??.???##????#?#? 1,10,1
???.???.???#.. 3,4
.?#?.??#?#...????#.? 2,2,1,3,1
.????#?.?????#?# 1,3,2,4
???##????????????#?? 5,11
?##?????#??????? 6,2,1,1
??#.????#?#??#? 1,6,1
???????.?#? 1,3,2
???#???.??##?#?. 1,2,2,4
#????##???.???.. 10,2
##.??????. 2,1,3
.??????.???.??.#??# 1,3,1,2,2,1
#?.???####??#?#??. 1,11
????#?????#?.? 3,5
??????#???#??.??? 1,5,3,1,2
..???.??##??#???. 3,2,2,1
#?#.#?????#??#??# 3,10,1
.???##?##?????#?.. 5,9
?????#????#.? 1,4,1
###??#???#? 3,1,2
?.?????#?#????#?? 1,14
?#??#???????#?????#? 1,1,1,2,5,2
???#????.?.? 2,2
???##????##????? 11,2
??#.???.?. 3,2
??##??##??.#??. 8,1,1
??.?????#?? 1,2,1
.#?#.#??????..#. 3,1,1,1,1
???####?#.???#?#. 1,4,1,1,4
#?????##?#..???? 1,6,1,1,1
.#?????.?? 1,1,1
???#?#???#?#?#.#??#? 6,1,1,3,4
.???##??????##.?? 3,5
##???#??.???????## 3,2,1,1,1,2
?..##?????? 1,2,3
????##??.?##??.???? 4,4,3
##?#?.?.?.??.? 2,1,1,2
?..??.#?.???#. 2,1,1,1
??????.?#???? 1,1,4
????.?????#????? 1,9
.???#??#????#???? 1,10,1
?.?#?.?.???#?.???# 1,1,2,2,3
#???..?#.#.#?#?.?? 1,2,2,1,4,1
??????.?.??????? 2,2,1,1,1
?####?#.##?.?#?. 5,1,3,1
.?????#??? 1,5
??.#???#.??# 2,2,2,2
??#????..???# 2,1,4
????.?#???#?? 2,2,2
#?#??#?##?#.???.? 1,9,1,1
#??????????###?? 1,1,2,1,5
.?????##??..?# 6,2
..#?????#???.#?.??? 2,4,1,1
??.???#??#?????# 1,2,10
??#???????.#? 3,2,1,2
?????????.???#?? 2,1,3
?#?.???????#???.#? 1,1,7,1,1
????.??#?.?.? 1,4
###?????#???????.? 6,1,1,4,1
????.##???. 1,2,1
??.?????.# 1,1,1
.??.???.?? 1,1,1
???#????????.##?.?? 1,2,5,1,3,1
???????.??????? 1,1,1,2,1
??#.????.. 3,1
.??##????#.#???? 9,2,1
???#.???#???#??. 1,1,1,7
??????.#??.? 1,1,1,1
?##..??###??#?#?..? 2,1,9
??.??#.###???# 1,2,4,2
????????##. 2,4
??##.???#??? 3,6
?????#.?#???? 2,2,5
#???.??.??#.# 3,1,1,1
.??..##.??. 1,2,1
???#.???????? 2,1,1,2
????#?.?#?#? 1,2,2,2
???????.?.??#???. 5,5
???#??????#??#???? 1,2,1,2,3
?#.?..???#??#??.???. 2,1,9,1,1
????.#?#.???? 2,1,3,1
#.??##???..#? 1,6,1
?????#???????## 8,2
??.??..?#???.?? 1,1,2,1,1
????.##???.?.?##? 2,5,1,4
?#?#?..?????#?? 1,1,5
?##??????#?? 2,4
#.?????#??.##????.# 1,5,1,5,1
?##?.???.? 3,2
?##?#????#???.??? 12,1
?..?????## 1,7
?#?#??????#?? 1,9
?.#??##???.????? 1,4,3,1
?###??????? 3,1,2
??????.??. 1,1
???.??#??#??#?.#. 2,5,2,1
?.??????.? 2,1
.?#???????????? 2,3,1,2,1
.??.?.??????? 2,1
.?#.???#?????#??.? 1,9
??????#??.# 5,2,1
+187
View File
@@ -0,0 +1,187 @@
package main
import (
"bufio"
_ "embed"
"fmt"
"slices"
"strings"
aoc "go.sour.is/advent-of-code"
)
// var log = aoc.Log
func main() { aoc.MustResult(aoc.Runner(run)) }
type result struct {
valuePT1 int
valuePT2 int
}
func (r result) String() string { return fmt.Sprintf("%#v", r) }
func run(scan *bufio.Scanner) (*result, error) {
var matches []int
var matches2 []int
for scan.Scan() {
text := scan.Text()
status, text, ok := strings.Cut(text, " ")
if !ok {
continue
}
// part 1 - brute force
grouping := aoc.SliceMap(aoc.Atoi, strings.Split(text, ",")...)
pattern := []rune(status)
// sp := spring{pattern: pattern, grouping: grouping, missingNo: countQuestion(pattern)}
// matches = append(matches, sp.findMatches())
matches = append(matches, countPossible(pattern, grouping))
// part 2 - NFA
b, a := status, text
bn, an := "", ""
for i := 0; i < 5; i++ {
bn, an = bn+b+"?", an+a+","
}
b, a = strings.TrimSuffix(bn, "?"), strings.TrimSuffix(an, ",")
matches2 = append(matches2, countPossible([]rune(b), aoc.SliceMap(aoc.Atoi, strings.Split(a, ",")...)))
}
return &result{valuePT1: aoc.Sum(matches...), valuePT2: aoc.Sum(matches2...)}, nil
}
type spring struct {
pattern []rune
grouping []int
missingNo int
}
func (s *spring) findMatches() int {
matches := 0
for _, pattern := range s.genPatterns() {
pattern := []rune(pattern)
target := make([]rune, len(s.pattern))
i := 0
for j, r := range s.pattern {
if r == '?' {
target[j] = pattern[i]
i++
continue
}
target[j] = r
}
if slices.Equal(countGroupings(target), s.grouping) {
matches++
}
}
return matches
}
func (s *spring) genPatterns() []string {
buf := &strings.Builder{}
combinations := aoc.Power2(s.missingNo)
lis := make([]string, 0, combinations)
for i := 0; i < combinations; i++ {
for b := 0; b < s.missingNo; b++ {
if i>>b&0b1 == 1 {
buf.WriteRune('#')
} else {
buf.WriteRune('.')
}
}
lis = append(lis, buf.String())
buf.Reset()
}
return lis
}
func countPossible(s []rune, c []int) int {
pos := 0
cstates := map[state]int{{}: 1} // current state
nstates := map[state]int{} // next state
for len(cstates) > 0 {
for st, num := range cstates {
si, ci, cc, expdot := st.springIndex, st.groupIndex, st.continuous, st.expectDot
// have we reached the end?
if si == len(s) {
if ci == len(c) {
pos += num
}
continue
}
switch {
case (s[si] == '#' || s[si] == '?') && ci < len(c) && !expdot:
// we are still looking for broken springs
if s[si] == '?' && cc == 0 {
// we are not in a run of broken springs, so ? can be working
nstates[state{si + 1, ci, cc, expdot}] += num
}
cc++
if cc == c[ci] {
// we've found the full next contiguous section of broken springs
ci++
cc = 0
expdot = true // we only want a working spring next
}
nstates[state{si + 1, ci, cc, expdot}] += num
case (s[si] == '.' || s[si] == '?') && cc == 0:
// we are not in a contiguous run of broken springs
expdot = false
nstates[state{si + 1, ci, cc, expdot}] += num
}
}
// swap and clear previous states
cstates, nstates = nstates, cstates
clear(nstates)
}
return pos
}
type state struct {
springIndex int
groupIndex int
continuous int
expectDot bool
}
func countQuestion(pattern []rune) int {
count := 0
for _, r := range pattern {
if r == '?' {
count++
}
}
return count
}
func countGroupings(pattern []rune) []int {
var groupings []int
inGroup := false
for _, r := range pattern {
if r == '#' {
if !inGroup {
groupings = append(groupings, 0)
}
inGroup = true
groupings[len(groupings)-1]++
}
if inGroup && r != '#' {
inGroup = false
}
}
return groupings
}
+70
View File
@@ -0,0 +1,70 @@
package main
import (
"bufio"
"bytes"
"testing"
_ "embed"
aoc "go.sour.is/advent-of-code"
"github.com/matryer/is"
)
//go:embed example.txt
var example []byte
//go:embed input.txt
var input []byte
func TestExample(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(example))
result, err := run(scan)
is.NoErr(err)
t.Log(result)
is.Equal(result.valuePT1, 21)
is.Equal(result.valuePT2, 525152)
}
func TestSolution(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(input))
result, err := run(scan)
is.NoErr(err)
t.Log(result)
is.Equal(result.valuePT1, 8193)
is.Equal(result.valuePT2, 45322533163795)
}
func TestPower2(t *testing.T) {
is := is.New(t)
is.Equal(aoc.Power2(1), 2)
is.Equal(aoc.Power2(2), 4)
is.Equal(aoc.Power2(3), 8)
is.Equal(aoc.Power2(4), 16)
is.Equal(aoc.Power2(5), 32)
is.Equal(aoc.Power2(6), 64)
}
func TestCountGroupings(t *testing.T) {
is := is.New(t)
is.Equal([]int{1, 3, 1}, countGroupings([]rune(".#.###.#")))
is.Equal([]int{1, 3, 1}, countGroupings([]rune(".#.###...#.")))
is.Equal([]int{1, 3, 1}, countGroupings([]rune("#.###...#.")))
}
func TestCombination(t *testing.T) {
s := spring{
pattern: []rune("???"),
grouping: []int{1},
missingNo: 3,
}
s.findMatches()
}
+15
View File
@@ -0,0 +1,15 @@
#.##..##.
..#.##.#.
##......#
##......#
..#.##.#.
..##..##.
#.#.##.#.
#...##..#
#....#..#
..##..###
#####.##.
#####.##.
..##..###
#....#..#
+7
View File
@@ -0,0 +1,7 @@
#.##..##.
..#.##.#.
##......#
##......#
..#.##.#.
..##..##.
#.#.##.#.
File diff suppressed because it is too large. Load diff
+11
View File
@@ -0,0 +1,11 @@
##.#.##.#
...#..#..
.##...#..
.##...#..
.#.#..#..
##.#.##.#
.#...####
..#.#..##
...#...##
.#....#.#
.#....#.#
+179
View File
@@ -0,0 +1,179 @@
package main
import (
"bufio"
_ "embed"
"fmt"
"strings"
aoc "go.sour.is/advent-of-code"
)
var log = aoc.Log
func main() { aoc.MustResult(aoc.Runner(run)) }
type result struct {
valuePT1 int
valuePT2 int
}
func (r result) String() string { return fmt.Sprintf("%#v", r) }
func run(scan *bufio.Scanner) (*result, error) {
maps := []Map{}
m := Map{}
r := &result{}
for scan.Scan() {
text := scan.Text()
if text == "" {
maps = append(maps, m)
m = Map{}
} else {
m = append(m, []rune(text))
}
}
maps = append(maps, m)
for _, m := range maps {
sum, sum2 := findSmudge(m)
if sum == -1 || sum2 == -1 {
mr := Map(aoc.Transpose(m))
Hsum, Hsum2 := findSmudge(mr)
if sum2 == -1 {
sum2 = Hsum2 * 100
}
if sum == -1 {
sum = Hsum * 100
}
}
r.valuePT1 += sum
r.valuePT2 += sum2
}
return r, nil
}
type Map [][]rune
func (m Map) String() string {
var buf strings.Builder
for i, row := range m {
if i == 0 {
fmt.Fprint(&buf, " ")
for j := range row {
fmt.Fprintf(&buf, "%d", j)
}
fmt.Fprint(&buf, "\n")
}
fmt.Fprintf(&buf, "%d ", i)
buf.WriteRune(' ')
buf.WriteString(string(row))
buf.WriteRune('\n')
}
buf.WriteRune('\n')
return buf.String()
}
// func findReflection(m Map) (int, bool) {
// candidates := make(map[int]bool)
// var candidateList []int
// for _, row := range m {
// for col := 1; col < len(row); col++ {
// if v, ok := candidates[col]; !ok || v {
// candidates[col], _ = reflects(row[:col], row[col:])
// }
// }
// candidateList = all(candidates)
// if len(candidateList) == 0 {
// return 0, false
// }
// }
// if len(candidateList) == 1 {
// return candidateList[0], true
// }
// return 0, false
// }
type level struct {
blips int
nequal int
fail bool
}
func findSmudge(m Map) (int, int) {
candidates := make(map[int]level)
for _, row := range m {
for col := 1; col < len(row); col++ {
candidate := candidates[col]
if candidate.fail {
continue
}
eq, bl := reflects(row[:col], row[col:])
if !eq {
candidate.nequal++
}
candidate.blips += bl
if candidate.nequal > 1 || candidate.blips > 1 {
candidate.fail = true
}
candidates[col] = candidate
}
}
a, b := -1, -1
for i, cand := range candidates {
if !cand.fail && cand.blips == 1 {
b = i
}
if !cand.fail && cand.blips == 0 {
a = i
}
}
return a, b
}
func reflects(a, b []rune) (bool, int) {
c := min(len(a), len(b))
a = append([]rune{}, a...)
b = append([]rune{}, b...)
aoc.Reverse(a)
a = a[:c]
b = b[:c]
blips := 0
for i := range a {
if a[i] != b[i] {
blips++
}
}
return blips == 0, blips
}
func all[T comparable](m map[T]bool) []T {
lis := make([]T, 0, len(m))
for k, v := range m {
if v {
lis = append(lis, k)
}
}
return lis
}
+42
View File
@@ -0,0 +1,42 @@
package main
import (
"bufio"
"bytes"
"testing"
_ "embed"
"github.com/matryer/is"
)
//go:embed example.txt
var example []byte
//go:embed input.txt
var input []byte
func TestExample(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(example))
result, err := run(scan)
is.NoErr(err)
t.Log(result)
is.Equal(result.valuePT1, 405)
is.Equal(result.valuePT2, 400)
}
func TestSolution(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(input))
result, err := run(scan)
is.NoErr(err)
t.Log(result)
is.True(result.valuePT1 > 1704) // attempt 1
is.Equal(result.valuePT1, 30705)
is.Equal(result.valuePT2, 44615)
}
+10
View File
@@ -0,0 +1,10 @@
O....#....
O.OO#....#
.....##...
OO.#O....O
.O.....O#.
O.#..O.#.#
..O..#O..O
.......O..
#....###..
#OO..#....
+100
View File
@@ -0,0 +1,100 @@
...#.O.#.#.O.O....#...O....#..#........OO.O#...O..O#O#.......O.O....O.....#...OO#.O....OOO..OO#..#..
.##.....#.OOO.OO#...O.......O#..O.##OO.O.......O##....O....#O..O..#.#....#OO..#...O.O#.#...#....#O.O
O...##.O.O.O.O..#.#.....#O....#..#O..O...O..OO..O...##.......OO#..OOO..#O..#.O#.O......#..#O..O..O.O
..OO....OOO....O.O..OOO.....O........#...O.O.O.O..O#.O...O..#.#O........O.....#O...##....#...#.#....
##.O.O#..O..##O.....O.#.....O.O#O.O..#...#...OO.##OOO...OO#...O...O........O.#.O.........#O.#...#.#.
.#.O.O.....#..O###..O#.#..O....O.O....#...##.O..O.OOO..O.O..O#.O..O....#.#.O..#..##O...O....#O#.....
.......O...##..O..O##..##...O....###.O.#.#.O......O...O.O......#O.....#..O..O#..##O.O#O##O....O#....
.#O..#....##.##..O#..#..#..O........OO....#..##.O.#.O.O..OO.O.O#..#O##O......OO...O...OO...#....OO..
#.....O#......O#.....#..O...#O..OO..OO.#O...O...O.........O...#O...O.....#.....#...#.....O##.O.....O
OO.O..O...O......#.O......#O....#..#.#...O.O....O.#.O#...O........O......#.#O#.O...O.........#O....O
O.O..O..#......O.O.OO...OO..##.....OO.....#.O...O.#.#...OO..OO.O.........#O..#.O...O#.#..O..OO.##O..
..#.......O....#...#....##..O.O......O....O#.O..O..#.#.O#O.O.#...#.##.....O...O.O...O.#...O...O.#...
.O...#..O.....O.O.....OO.O.O.......O..O..........#...O..O..O......O....#OOO...O#O...#.O#........O...
.OO#....#.....O...#.###..#..O..O.....#O..#..OO...OOO#.O#..O#O........#..#.O..OOO#O#..O..OO........#.
..O.....#..#..O.............#..O.O..O#.......#.O.........O.#..OO.O..#..##..O.O#O....OO.O.O.O.....O#.
........#O..O#OO...#.##O.O....O...O..........##.#O..O......O..O.#...#O.O.OO...#.#OOO.#...O#....#.O.#
.....O.O...#OO#.OO#......#..O.O..#.OO.......#...#.O.O#.O.#O.O#..#O##..OO...#......#.O....#.....O.#O.
.O#OOOO...#.#..........O#.#.#.#.O....O..O...O...OOO.O.O.O..OO..O..O#.#...#....#...#O#.OO.O..#.O#....
OO#OO..#.O.#....#..#.#..#O#.O#O#.#..O.O....#..O...OO..O..#........#.O...O#.#.....#....O.....#.O.....
.O.....#...OO...#..O..#..O..O##..OO...O....#.O.#............###.O.#..O..O.........O..#.O..O.#OO.#...
.##O.#.O.#....O..O..#..O.#.O..##O..O......OO...#...O..OO#....O..O#O.##.OO#...O#...#.......O.O#.#OO..
.OO#O#...O..##.O......O..O.O....O...OOO.O..#...O#.#.O.OOO..#...#.##..OO..................OOOOO...###
.#..##...####.O#...O........O...#O..O..O....O##O..O..OO..#.....#...O.....OO......OOO.#..O.##OO##...#
....O#........O##.O...O#..#.O#O...O...O.O........#..#.#.O......O..#.....#.O..#.#..#..#O....O##...#..
.O..OO.O##..O...O.OO....O.OOO..#O#.O##......O.O#....O#O.O......#.O..#O..#O.........#..OO....#.OO..O.
.#OO..#OO.###........#...#..#.O..#O.O#O...O.#.....O...#......O.......#.O.#.##.O..#O.O###OOOO...#..O.
##...OOO.#..........O#...O#.....OO...O#..OO.OO.#.OOO..OO....O..OOO...##O...O.........##O...#.#O.....
.#....O.....#OO.O.OO..O......#.OO..#O...O..##O.#O....#O.OO..#O.OO...O..O.#..##...O......#O##OO.#.O..
.#..O....O....#......#.O.##...OO.O.O...O.OO.O....#...#..O....O#O..#...#.#..#...OO......OOO...O..#...
#.#OO.#....O.#.OO....#........O.O.##...O.#.................OOOO....O..#......O..#.#...O....#.O#OO.#O
....O.O.......##..O.........OO#O..O.O#.#.#.O....#..OO.O..O#O....O..O.O......O.O.#..O.......O.O..O.O#
...........#OO...O....#.O.#..#O.O#.....O..O.....O#.....OO.#O...#O.#O.#.....OO.O.O....OO......O#O.O..
OOOO.OO..O....O.O...O..#.........O#.##OOO#.O..O.O.O......O..#..O..#..#.O..O....O#O.#OO..O.O...O#.##.
##.O.#O.#OO#..........OO#.OO.#..#.#......#.OO...#.O.O.......O##....O..O..#.#.#O....O..##.#OO.O..O..O
#O...OO..#.#....##.O#.#...##OO#........O#.O..O#.........O.O.#....O.#.O.......O..OOO......O#O.###.O..
....O#....#..O...#.#.....O.O#O..#O....O...O.OO#...O..O#.##.O.....O...#..#.O.....O...O#..O.#...#.#O..
O.OO......#..O...O.O....#...OO..O#.O..OO..#.##.....#....O.O#O#.O....O..#..OOO..O....O.O..#..O.O..O..
.#..#..##O..O.....O#.#.O.O..O..OO..O.O..OO.##.O...O..O#........O.............#.OO..#......O..#O#OOO.
.#..##...O.#..OO...O..#..#O#..#..##.O#.#.....#....O.O..O.........#.###...#.O##..O...#.O.OO..........
........#O.......O...O#.#....#.O#....#..O.....OO........O...#.........##.....O...O#.O...O.O..#OO.O.#
.#..#.O##..##.O#.#.......OO...OO#...#O#............#.#...#...O...#.O..#O.#.O.........O..OO.O...O.#..
#.O#OO...OO.O.#...##........#....O.#.O.....##.#.O.O.O.#..O#...O..#......#..O...###O..OO..##..OO.#OOO
.OO...#O....O##.O...O.#....O...#O.......O.....OO.O...O..#...OO.OO.O#...O##.....O..#.#...#OO......O..
..O..#...O...##..O...O..OO.O.O.O.....#.....O.....O..#OOO.....OOOO#.#.O..O..#........O.#O#.#O..O.##..
.....##.....O.....O#...##.OOO....O.O..O.#.#O........OO.....#...##...#.#......#....OO.O.....#O....#.#
..O.OO#....O..O.#O.#OO#..#.O.##.#..#.OO##....O#...#..O.#..#...#.#....OOOO.#...OOOO..O.........##O.O.
O.O.#......O#...O..#.......#O.O..OOOO..#....#.#.OO.O..#O......#.#....#...#..O....#O.OO..O.......#.#.
...O.O....O#......#.O.O....O#.#..#O.#.....#...#...#.O#.........O.OO..O###...O....O.#.O.#.....##..O..
.#.OO...O#O.....O#....O......OO...OO.OOOOOO##....#..#..#O.#.OO....O#..OO.#O........O#..O.O#.#.......
#OO#.#.....O#OOO#...O.........#......O#.......O.....O#.#O...O........#....O...O.....#.......##.OOO#.
..#.O##..#OO..#....#O....#....#..........#O...#...O.#.O.O###O..O..#...#.OO....##..O.O.O.....O..O....
....OOO#.#......#..O.O......##O.#.O.#.O.OO....#..O.......#.....#O.O...##O###.##.##..#.O.#.O#..#..O#.
......O#OO......#.#..#.O#OO#O..O#O.O##.......O...O........O......O#.....#..#....#...#.#..O...O##.#O.
#..OO..O.O.....#O.O.#.#......O......O.#....O.#OO.........#.O.O#..#..#.O..O.#..#...#...O.#..........O
..O#OOO#.#.....O.....O..##.#..OOO.O..#..O#...##O..OO...#....#..#...#...OO.....##OO#.OO...#.O....#.#.
#.#O.............#....O#.....O.....O.##O.....#.#.#.....O....O...O...##..O...#........#O..##.#.....##
.O.....O...#O.#.O#..O#........#.##...O##O..........O##.O......O..#....##....###......O##..##O..#.O#.
.#...#..#..O.O.............#....O.OO.....OO#O.....OO..OOO#O.O.O.O...#...#.........OO..O#.O...#.##..#
..O...#O#.......#OO..........OO#..#.....OO#...#OO.O#....OO....O..O..#....#OO......O#O...#......O..O.
O.......O..O..#O.....O#O.........O##.O#.#.O.O....##....O.#....O....OOO..#O#...#...O.O#.O.....O.O#.O.
O.#O....O..##....O.........##.OO###....O...O...O..O#O#...#O.O.O....#..O..#..#.O.......###..#....#..O
.........O..#O...O..OO.....#...O..#O#.....O....#O#....##...#.OOOO.O..O#...O..O.O#.#..O.O..#..#.OO...
...#.....#..OO.O.#.#.O.....O#...#..O...O..O..#...O..O.O..#...#.###..#..##O.#.#O.......O..##O.O.O#...
.##O......O....#....O....#O..#.....#.O..O.O.O..#.#O.....O#.O...#.#O.#...#.........O....O....OO..O...
.OO.O.O.O#O..O##.O...OO.....O..O....O....#..#...O.O...O....O.#.O......#O.#.O#O..O...O.O.#.O..O.#....
O#..#.#..#..#...#.O...O.###.##.OO.O.#.OOO..O..#O.#.O...OO...O.OOO....#.....#OO.O##.O.#.#O...#.#.....
.#.....#.........O.#.........#...OO..O.#.O...O##O...#..O.O.OO#....###.OO.....#..........#.#OO...O.O.
........OO..O.O.#..O.#.......#.#O.OOO...OO.O............O#O#...O...#.O.....#...........O...#..OO.O#O
..#.#.#...O....#O.......#...#...O###.O.....O.O.OO....#O...OO.O.O........O.O.#O.O....OO.....OO.....#.
#..OOO#......O.#.O#...#..#..O..O.O.O.#...O#OOO.#...O.#.OO.#O..#....#..#O....O.#.O...O...O#OO...#....
.....#.....##...O....#..O..O.....O#OO.#O#.....O...O.##.#........O..O........#.#......##......#..#..O
O..O....O.##..#.#O##.#.....OO....O.##O......#...#..OO.O.....#...#........O..O#O##.O.......#..##O..##
#.....#O....O...#OOO#..O#.O.....O..OO.#..#.#.O#..O..O#.O###....O......O.#.O..#O.....#.......##O.O..O
O.O.#..#....O....O.......#.O..O#O#.O..........#O.....#OO.O...#.OO.....#...O....OO....#...O....O.#..O
..#...OO....OO......O....#..#..........##..##..#.....##...#..#O.....#OO......#........O.....O..O...#
.OO#...O#.O....#.........OO#...O#..O.#..O.O.O.#O......##.O.......O...O...###.O......O....O...#.OO#..
..O..O#O.#..O.#O...OOO#O.#.O....O.#......O....#....###....OO......O...#...OO.#....O........O#..#..OO
#..OO..O......#...##..O#.O........O.O...##.#O...O...#O#.O.O....#.............#.O#.#..O..#..OO#.....#
#..........O...O##.O#..O..OO..O.....#O.#.O......#......O.O....##.O#OO..O.O..O.O.O..#..O....O..#....O
.O.O...O.#..O.O....#.#.O.O.##.##..O..#OOOO.###...#O...#...O.....O...#.##.OO..O.#..#.O.#.......O....#
#....#....OOOOOOO.#...OO....##O.#..#......O..#..........O......##..O..###..#.O....O.......OO......#.
.O.O..##.O.#O.#...#....O..O.....#..##......O.......O..O#.O##.#........O..#.O.#.O.O..##..###..##.#...
..OOO..O##..OOOO.O.....OO##..O..O.#....#.....OO......O.OOO#...#O.OO...O.O......O#..O.##....###...#.O
....O...O.O....#..O#.O.....O.O.#.......O##...O#..OO.O.O##...#.....O#.###....O....#O.........OO..O.O.
O#.O......##..#.#..............#......#.#.OO#......##O#OO..OOO..##.O##....#..O...#......##O.O##...OO
...#OO....OO...O#.#..##....OO.#..#O......O#....#.O.....O.#O..OO.#..OO...O#.O#....O.#.OO.O.O#..O.....
#..O.OO#O...O..O..........#..#.#..#..#O.....#O#..O....#..O...O.#.#O#.#OO.....OOO.#..#.........O...O#
....O......#..........O...#.....OOOO........#.#OO.O............O...#....O........#....#....#........
...O.......###...O.O...#O.##O.OOO.........O.###.O.......O....O.O...O.#.....#..#O..#..OO..O.O...O....
O.O#....##.O.O.....O....#............OO.#O...O..#...##.#.#O#O.#.....O......O....#.OO#.O#....#.....O.
..O####.O.........O...........OO..OO.#.....O.......#..O#.O....O#...##.......#.#....O..O..O#..##.....
.#..#......O.##.O.OOO.O.OO....O.......#......#.O...OOOO...O..#..#.O.#......O...O#.#.O.#.O....O....O.
##....O.O..O..O.#...O##.......O....#...#OOO.O..##.....#....O.......#O..#.#O..O.#.......O..#.O.O#.O##
...O....O#O.#...#......#..O.O.O.O...O.....O..O.#..#.....O#...OO...#.O.O....#..OOO...#.....OO.OO..O..
O##.O.##.O#OO...OO...OO..O....OO#O.#O..O.O....OO..........O..#.O.#O#.......O.O..#O#....#..#...#O..#.
.#.#..........#.......#..OO#....O.#.#.O.....OO.#.O..#.#.O....#..O....#..#..O.#O#O.....#.O.O.#O.O.#O.
.O.#....##O...#..OOO.#......#...#.O.......OO....#.......#..#.OOO........OO..O..###O##..O.....O##....
OO##..O#....O.##.......O...#........O.O...#O#.#.OOO....#......#.#O.O.O..O..O...#.#.O.O.OOO.O#O......
#O...#....OOO.O...#O....O...O..........O..#..O#.O..#O.....#......#.#..#.OO..#....#O#....O...O....##.
.OOOO......##.#O.#O...#......O..#..O..#.O...O.OO...............#O...O..##..#.#....O...O..O.##..O.O..
+157
View File
@@ -0,0 +1,157 @@
package main
import (
"bufio"
_ "embed"
"fmt"
"strings"
aoc "go.sour.is/advent-of-code"
"golang.org/x/exp/maps"
)
// var log = aoc.Log
func main() { aoc.MustResult(aoc.Runner(run)) }
type result struct {
valuePT1 int
valuePT2 int
}
func (r result) String() string { return fmt.Sprintf("%#v", r) }
func run(scan *bufio.Scanner) (*result, error) {
var maplist []Map
var m Map
for scan.Scan() {
text := scan.Text()
if len(text) == 0 {
maplist = append(maplist, m)
m = Map{}
}
m = append(m, []rune(text))
}
maplist = append(maplist, m)
score1 := 0
for _, m := range maplist {
m = aoc.Transpose(reverse(m))
m.Sort()
score1 += m.Score()
}
score2 := 0
type record [5]int
var current record
memo := make(map[record]int)
for _, m := range maplist {
// fmt.Println(m)
m = aoc.Transpose(reverse(m))
for i := 0; i < 1_000_000_000; i++ {
m, current = cycle(m)
v, ok := memo[current]
if ok && v > 1 {
counts := aoc.Reduce(
func(i int, v int, counts [3]int) [3]int {
counts[v]++
return counts
}, [3]int{}, maps.Values(memo)...)
// fmt.Println(i, counts)
i = 1_000_000_000 - (1_000_000_000-counts[0]-counts[1])%counts[2]
clear(memo)
}
memo[current] += 1
// fmt.Println(i, current, v)
}
score2 += m.Score()
}
return &result{valuePT1: score1, valuePT2: score2}, nil
}
type Map [][]rune
func (m Map) String() string {
var buf strings.Builder
for _, row := range m {
buf.WriteString(string(row))
buf.WriteRune('\n')
}
buf.WriteRune('\n')
return buf.String()
}
func (m *Map) Sort() {
if m == nil {
return
}
for _, row := range *m {
base := 0
for i, r := range row {
if r == '#' {
base = i + 1
continue
}
if r == 'O' {
if base < i {
row[base], row[i] = row[i], row[base]
}
base++
}
}
}
}
func (m *Map) Score() int {
if m == nil {
return 0
}
sum := 0
max := len(*m)
for _, row := range *m {
for i, r := range row {
if r == 'O' {
sum += max - i
}
}
}
return sum
}
func reverse(m Map) Map {
for _, row := range m {
aoc.Reverse(row)
}
return m
}
func cycle(m Map) (Map, [5]int) {
var current [5]int
m.Sort()
current[0] = m.Score()
m = aoc.Transpose(reverse(m))
m.Sort()
current[1] = m.Score()
m = aoc.Transpose(reverse(m))
m.Sort()
current[2] = m.Score()
m = aoc.Transpose(reverse(m))
m.Sort()
current[3] = m.Score()
m = aoc.Transpose(reverse(m))
current[4] = m.Score()
return m, current
}
+45
View File
@@ -0,0 +1,45 @@
package main
import (
"bufio"
"bytes"
"testing"
_ "embed"
"github.com/matryer/is"
)
//go:embed example.txt
var example []byte
//go:embed input.txt
var input []byte
func TestExample(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(example))
result, err := run(scan)
is.NoErr(err)
t.Log(result)
is.Equal(result.valuePT1, 136)
is.Equal(result.valuePT2, 64)
}
func TestSolution(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(input))
result, err := run(scan)
is.NoErr(err)
t.Log(result)
is.True(result.valuePT2 < 87286) // first submission
is.True(result.valuePT2 < 87292) // second submission
is.True(result.valuePT2 < 87287) // third submission
is.Equal(result.valuePT1, 110407)
is.Equal(result.valuePT2, 87273)
}
+1
View File
@@ -0,0 +1 @@
rn=1,cm-,qp=3,cm=2,qp-,pc=4,ot=9,ab=5,pc-,pc=6,ot=7
+1
View File
@@ -0,0 +1 @@
rr=8,dd-,qck-,hkk=8,xfmqn=4,sx-,mgm=4,rkbh=8,scdp-,jllv=6,vgv-,bth=3,mmx-,vjbx-,jllv-,mnp-,mtcd-,zdxdbr=8,hjxk-,hcj=4,cbss=7,gds=3,lsk-,tc=1,hfjd-,gz-,bjbjs-,zx-,ldd-,kvp-,jllv-,xhmg=5,nzjmq-,xml=1,dz=1,mpl=6,zkp=5,ksl-,jsb=5,pb-,ffk=6,lsx-,hpb=6,gpkm-,dd-,sqn=9,jsb=8,hvghn-,hfjd=7,mtcd-,dq-,cmfkv-,vmch-,bp-,ftfh-,qck=8,dxxp=4,pkhcz=5,hb=5,ln=8,cpq-,nn-,mhr-,qfz=5,pp=8,lfst=9,tz-,rdr-,zlrz=1,lfcfh-,btnp=8,jgc=6,qrcl=9,hqcs-,bnf-,gsj=4,nmtpp-,hh=8,bq-,vzdt=3,hsr=9,jrj-,sbpc=6,ph=4,znqb=5,mfdc-,cpk=3,srkt-,kb-,sbs-,jfs=8,pf-,xsrqvg-,tkf-,pmb-,vzgr-,zjdzq-,tzn=4,lt=6,fsx=1,bfk=5,hfjd-,zpv-,xldjdr-,vmlz-,gn-,bc=7,mpdgm=9,mnl=1,hn=3,bvd-,cp-,ktl=7,xlp-,gj-,snzvpk=5,sp=4,jbf=6,pxs=7,dsxs=4,tc-,vb-,rpfx=5,rkvv=4,kkmdd-,dd=4,hqsd-,hst=1,kqjzrb=6,njf-,sbpc=8,lsx-,mmx=9,xlp=2,qx=6,jq=9,pb-,ds=5,dk=2,vlv=4,njf=7,lvjhdd=3,bxh=6,bvd=1,kcxfg-,ftf-,gql=8,mpl=1,qr=5,ghg-,kn=7,vcrpbh-,zpv=2,rbkzjv=6,jllv-,ldc=3,blm-,qr=5,mnl=2,cmx-,ccmftg=6,dsxs=8,ndvqm=6,tc=8,csdjh=4,gn-,zdr-,fp=3,qmj=4,fh=9,lvrrk=1,tnt=1,cthbt=3,dxz=3,bvd-,tj=9,rx-,ls=1,ttd-,fg=1,ls-,cpk-,jlt-,nt=8,jnkh-,ccmftg=5,nn=3,dtlc-,bdzht=7,zpdbq=3,hqcs=4,fg=3,kqjzrb=4,ghdft=7,vzdt-,vxr-,pb-,hsr-,kpg-,bfk-,snzvpk-,cbt-,hjxk=3,hlprv=5,fsq-,mtvrb=2,mhr=1,xrpgk=7,jd=1,jt=4,tk=5,pmm=2,jsb=8,xldjdr-,znqb=2,dqdl-,sp-,mtcd-,sd-,jzg-,mpdgm-,grl-,ljfx-,mpl-,gj-,ckk-,ltkdp=4,qb=3,qhx=6,gds=1,bhfb=8,qhx=3,zx=7,dxxp=3,hctrqn-,ljfx=6,rpfx-,jmz=7,jsb=4,mvx=5,rf=9,nfxf-,fh=9,gn=8,fgdbf-,scdp-,cthbt=6,lcrqx-,tzn=3,jrj=4,gpx-,vhp=8,xcrjq=7,xrpgk=3,kvp=7,lp-,dqdl-,ksl-,bj-,chp=7,trj=7,xdz=1,sb=6,bnf-,xml-,ftl-,jszb=2,ls-,qt=9,xl-,xhmg=6,xxb-,vfprd-,kkmdd=7,lghn-,grl=2,tcm=9,nlb-,hlt=2,zdr-,tjlg-,jbf-,xl-,gf-,jhp-,htxs=3,dd-,rtz-,slp=8,vhp-,gn=6,pn=9,dnx-,lfcfh-,dm-,hqcs=8,bbf-,dz-,qglr=3,qcm=5,slg-,hkk-,qbz=2,zbk=4,pz=2,rbkzjv-,sgs=9,fthkvq=7,ftf=4,dq-,mmb-,mf=6,hctrqn=7,lhls-,zbrslm=6,kx=9,vxfgd=1,vgv=8,gpx=1,vh=4,bxh=3,cxkt-,qhb=8,gz-,ksd-,mhp=6,xq-,ksl=9,spc-,ttpk=6,ldd=7,rg=4,pm=9,bfk=4,zv=9,xsrqvg=9,qk=2,jrj=6,csdjh-,vbjch=1,dxz-,vmch=4,px-,jdvn=3,cp=9,lghn-,ttpk-,zbk=7,nqh=6,rkbh-,fgv=8,pvqk=8,jd=5,vmch=6,ln-,jmztc-,pmm-,qfz-,mhj-,rjtdf-,jv=2,jskgmj-,gt=1,jv-,pxj=8,hjs=9,gz=3,kh=2,nqq=7,dtj=8,fsq=8,qglr=3,vgv=3,tjlg=3,rdr=3,lx-,vhp-,jnkh-,pkx=2,chtcdj=9,ksl=2,bcb-,tnt-,gkf=7,kh-,nsp=3,pp-,mmx=7,mgv-,vzgr-,bnf-,tv=7,hctrqn-,xhmg-,hkk-,kkmdd=5,bhfb=3,btg-,bqch-,vbhvv=1,pz-,fbklmr=9,hkhs=5,lppmv=9,ltkdp=9,hlprv=9,ttp=6,gs=5,lm-,pz-,gn=6,qb-,vnv-,vhbf=8,gpl-,pmm-,rsn=2,gqlkm=5,lsk-,hst=7,hv-,pgdg-,hst-,csdjh-,fvp-,cxkt=8,gkf=1,kvx-,rjsb=9,pvqk=9,glp=2,ds-,vbhvv=4,xs-,fgdbf-,blm-,kdr=5,grh-,lfcfh=3,mb=9,jh=4,prs=7,gm=3,dz-,ftbdsn-,jd=2,kjgmr-,dxv=2,qmq-,dtlc-,ll=9,tjlg-,plj=8,ccg-,lt-,vq-,ft=6,lsx-,xcrjq-,rkvv=2,sph=7,vb-,lp=6,xnvm=4,ktd=5,txc=6,zbk=4,lxm=9,lq=6,mhr-,gql=9,gpkm=7,lsx-,fz-,bq-,hlt=3,trj=9,pkdd=9,xnvm=4,hv=5,lppmv-,dg-,vq-,rbkzjv-,srkt=3,cpk=6,vds-,xvm-,mpdgm=3,cc-,xml=3,hcj-,dxv=9,lvjhdd=2,mtx-,dz-,mdtzp-,gj-,zrvk-,gds-,kz-,tj=5,tkk=1,qx=9,tmn-,mnp-,ztz=7,qz=6,ndjn-,tcm=7,pgdg=2,ftfh=2,bfk-,nqq=9,zmft-,rvps-,gmvt=3,pkhcz-,qfz-,bth=8,xb=8,lt=2,zx-,mrs-,tgvkt=2,qt-,dqdl-,fsx=8,mnp=6,hpb=6,pgdg-,vmlz-,prmt=7,bqch=7,bxg-,mvbf=4,qm=7,xq=9,prmt=9,qb-,crhh-,ghv=8,nrk-,qhx-,qz=7,sgs-,lmdx-,sbpc=5,nmtpp=8,bdzht=4,blm=2,kz=9,vgv=5,hctrqn=2,nxc=6,pgdg-,pzllx=6,hx=8,slg-,nmtpp-,nt-,skb=6,mb=6,jk-,fd-,jvn=9,jh=2,lz-,vgf=6,nzjmq=5,kqjzrb-,sbpc=7,cm-,sbpc=8,xxb-,jh=4,jvh=5,hjxk=6,lkxmjz-,trj-,prs-,gn-,tj-,fvp=7,ztz-,vq=4,mdtzp=4,zbrslm=2,fz-,xsrqvg-,ktd=6,hl=5,nrk-,nnhv=3,gc=3,rtl=8,tn=6,tnt=9,jd-,gzt=3,bdzht-,tv-,tk=3,mls-,jnbfd=5,kz-,nzjmq=6,qrcl=4,mrsl=1,sbs=7,gqlkm=3,jsb-,mj=3,mrs-,fgdbf-,nv-,cm=1,zrvk-,njf=7,ljfx=1,zpdbq-,zc=6,zpdbq=6,kvp=5,zsd=9,hjs=7,njf=9,xq-,nrk-,lghn=3,rjtdf-,dqdl-,vlv=2,jrj-,nnhv-,vx-,ffn-,xp-,fsx=2,gc=4,qxmqls=8,mhxczx=7,bxh=6,kb-,dnx-,mxrf=6,btnp-,zpv-,mblp=9,kg=9,tv-,fsq=8,kkmdd-,bdzht-,pt=8,zhsns-,hst-,jskgmj-,chtcdj-,hx-,dtlc-,mfc=3,tkf-,pk-,bhfb-,fh=1,bgtj-,nnhv-,blm-,tmn=1,qhzq-,bdzht=2,cx-,mgv=6,sqn=9,qm-,rf=9,nrk-,fh-,trj-,ttd=5,kh=7,bjbjs=2,pmm-,dd-,ksd=7,cbt=9,ng-,xn=6,mq-,kb-,jskgmj=3,cx=8,rf=1,vbv=9,jfs=8,xl=4,xs=4,cpk-,jc=5,sgs-,tsp-,pn=5,pp-,mhj-,nlb-,qs-,xldjdr-,fgdbf-,vr-,md=7,gsj=7,hjxk=8,tnt-,fvp-,bc-,qb-,ksl-,fbklmr=3,cthbt-,vnv-,lsk-,plj-,hlprv=6,gqlkm-,xm-,ksd-,rx-,kmlszs=7,kkmdd-,vzdt-,ftbdsn-,xhmg=2,sp=2,ng=9,hp-,vgv-,mnp-,grl-,tnt=7,bxg=7,pb=6,sph-,pmm=4,rr=2,nn=7,spc=8,hkhs-,lmdx-,hfjd-,ccmftg-,snzvpk-,dg=2,qhzq-,cjhz=4,qjqhhf=6,hqcs-,spc=7,jnbfd=8,chtcdj=7,mmb-,qmj-,kzkn=4,lp-,nsp-,ffk=5,bv-,hlprv-,xdb=8,qbz=9,mx-,zjdzq-,jt=7,bnc-,ltkdp-,xs=6,qhzq-,cbss-,gn=8,hvghn=4,gf-,gzt=1,vp=3,mj=8,qz=9,xxb-,ftfh=1,kdr=9,hv=1,xb=7,vk=8,mnl=5,hx-,xs-,jk=2,cr=1,dsxs-,spc-,dxxp=7,gchjj-,xldjdr-,zkst-,ftl=7,rpfx-,pkx=3,js-,dj-,dtj=2,plj=7,vbhvv=2,hkk=8,gqlkm=9,gmvt-,bjbjs-,skb-,jskgmj-,vbjch-,jmz=3,nrk=8,nsp=4,mtvrb-,sd=8,ph=2,hpb=5,bgtj-,kn=6,ms-,mrq=1,xz=2,tk-,vhp-,ng=8,xdb=6,sbs=9,pzllx-,mrsl=4,hlt-,jvh=2,bnc-,mhxczx-,chp-,gpx-,fsx=1,cxkt=2,dsxs=4,tgvkt-,bnf=4,csdjh-,xmx-,zxn-,mnl=5,xlp=7,btnp-,sbs=5,zjdzq-,nqh-,kn=2,fp=7,btg-,zm=2,mvx-,Line truncated
+136
View File
@@ -0,0 +1,136 @@
package main
import (
"bufio"
_ "embed"
"fmt"
"slices"
"strings"
aoc "go.sour.is/advent-of-code"
)
var log = aoc.Log
func main() { aoc.MustResult(aoc.Runner(run)) }
type result struct {
valuePT1 int
valuePT2 int
}
func (r result) String() string { return fmt.Sprintf("%#v", r) }
func run(scan *bufio.Scanner) (*result, error) {
r := &result{}
var ops []string
for scan.Scan() {
text := scan.Text()
ops = strings.Split(text, ",")
r.valuePT1 = aoc.Reduce(func(i int, t string, sum int) int {
sum += hash(t)
return sum
}, 0, ops...)
}
var boxen boxes
boxen = aoc.Reduce(func(i int, op string, b boxes) boxes {
return b.Op(op)
}, boxen, ops...)
r.valuePT2 = boxen.Sum()
log(boxen)
return r, nil
}
func hash(s string) int {
var sum int
for _, a := range s {
sum += int(a)
sum *= 17
sum %= 256
}
return sum
}
type lens struct {
label string
value int
}
func (l lens) String() string {
return fmt.Sprintf("[%s %d]", l.label, l.value)
}
type box []lens
func (lis box) String() string {
var buf strings.Builder
if len(lis) > 0 {
buf.WriteString(lis[0].String())
}
for _, l := range lis[1:] {
buf.WriteString(l.String())
}
return buf.String()
}
type boxes [256]box
func (lis boxes) String() string {
var buf strings.Builder
buf.WriteString("Boxes:\n")
for i, b := range lis {
if len(b) > 0 {
fmt.Fprintf(&buf, "Box %d: %v\n", i, b)
}
}
return buf.String()
}
func (lis boxes) Op(op string) boxes {
if a, _, ok := strings.Cut(op, "-"); ok {
i := hash(a)
pos := slices.IndexFunc(lis[i], func(l lens) bool { return l.label == a })
if pos >= 0 {
lis[i] = append(lis[i][:pos], lis[i][pos+1:]...)
}
} else if a, b, ok := strings.Cut(op, "="); ok {
i := hash(a)
v := aoc.Atoi(b)
pos := slices.IndexFunc(lis[i], func(l lens) bool { return l.label == a })
if pos == -1 {
lis[i] = append(lis[i], lens{a, v})
} else {
lis[i][pos].value = v
}
}
return lis
}
func (lis boxes) Sum() int {
// return aoc.Reduce(func(b int, box box, sum int) int {
// return aoc.Reduce(
// func(s int, lens lens, sum int) int {
// return sum + (b+1)*(s+1)*lens.value
// }, sum, box...)
// }, 0, lis[:]...)
var sum int
for b := range lis {
for s := range lis[b] {
sum += (b + 1) * (s + 1) * lis[b][s].value
}
}
return sum
}
+41
View File
@@ -0,0 +1,41 @@
package main
import (
"bufio"
"bytes"
"testing"
_ "embed"
"github.com/matryer/is"
)
//go:embed example.txt
var example []byte
//go:embed input.txt
var input []byte
func TestExample(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(example))
result, err := run(scan)
is.NoErr(err)
t.Log(result)
is.Equal(result.valuePT1, 1320)
is.Equal(result.valuePT2, 145)
}
func TestSolution(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(input))
result, err := run(scan)
is.NoErr(err)
t.Log(result)
is.Equal(result.valuePT1, 503154)
is.Equal(result.valuePT2, 251353)
}
+10
View File
@@ -0,0 +1,10 @@
.|...\....
|.-.\.....
.....|-...
........|.
..........
.........\
..../.\\..
.-.-/..|..
.|....-|.\
..//.|....
+110
View File
@@ -0,0 +1,110 @@
\.......................\..........................................-..................-.../................-..
....../.......\...-......-.|...\..............\.................|............././....-........................
...............-...-........................................\......\..-.............|......-....\....-........
..\..|.|...........................-.|........................................./.|....|................|......
|../................|............................................................\........../..\..............
........\............../................/..........................\...\....|............./....-.........\\...
.................-...-...................\../........-|.................../......-...........|................
........-............/...|-............-.....\.|..............-....-../\../..................\...\././........
........................-|................................................................-........-..........
-......./.................|.....\.................\.....//............-........./..../....|...................
....-.............-........-..........-|.......|...../...\...................\.....................|..........
...|...\.........|.................|.....|....-....\.......\./........................-.../..../.....-........
....|....-.-..............\.........|.......................-.......-..............\................/.........
.....|.\...........-.................-.-........../...\............|...............|...|......./.......|...../
.....\.........................-.../..-./...\...................../......\...-.......|.\........-|............
............|.....................................-....../....\.............../-...|...\..\................./.
......-./|....../............|.........\............-../...-......./.\..\....../......|/...\..................
................................|.......|..-..../.............................../.-..................-..-/..|.
...............................-......./......................|./...............-............./....../........
..................../....................\........\...........................-............/.../..............
.|||......../.................|.................../..\............................-......./..|...|/.-.........
......-......./\....../.........|....../.......-...............|.\........-............/.../..................
.....................-.\/|................//.../.........|.|......\.-..|.........|.........\..................
.........................\/.......|.|............................|........|.............................././..
.................................|.................\../..|/.................\.................-...-........-/.
......................-...-.........../...........................\....\......-..-.......\.-....\....|........
......-......../..............\/..................\..|........-..............|...-...../......|...............
|.......|.../....|..............//.....................|..........|/......../................|................
...|.|..................../|..../.-.......-...........|.....|./....\......-......-................|...........
......\/./.|\..../|.|..|..........-....|...........|.-.|...................-.\.....|....................\.....
......../.\......................|.....|...........|.........../.......|....|...|.......-......../......\...-.
...|...-...||......-..|..-...........|.-.................|.................................-..................
..............-.\.-........|......\..........................................\./.\........../.....|...........
../\.........|...............|............|.\/.-/.................-....|...-.................-.....|..../.....
....................../......../..../-.....\........................\..-.\....|....-.........../-.............
.................................|................|.........|................../|.....|....\\............/.\..
...///./.....\.................|/.....................\...................-............|................|.....
............-...........................--........\................/.............-\................\.....-.../
...............\.........../|............................|.....................\...-...\.....................-
...\.............|.............|................\............\|...../...|.........................|...........
..................|......|..........-.-..............\.........................\..............................
....-................../.........../...|................/...............|./.|.../....\..../......./......//...
...../....../..............................|...\../..........-..........-........-..//..../...................
...............-......|......................|./........./............/..-...........|../.....-........-./....
..\.........................|...-.......\.................|..............-........\....-.............-....|...
.......|......|....../........\...........|......-........../......-..................../....................\
.......................|....-..|........./.|.-...............|..\......\.....-.......\...-/....|/.........\...
\......\..-.....................\..........................\................................../...........\...
-....-......../............................................................../.\.......|..............|....-..
........|......................|.............-....\................................./..\.......|..........-...
...-...............|........./......\...../.......|...|...............\.../...\.../......|.....-.\......\.....
............./.....|......................|.....................................\...||.................-....|.
./.....-................/........|./....-......../......./..............\..................................\..
.../..../\........-..........................|.-/.|..\................\\-.......|......./...||.......|........
.....-.........................-...............\...........|.............-.\.../.|......-.|......../...-.....-
......\....................|...../......................|.../......-..|............|......./.../.........|....
...|...........-....................................../.|............./....|..../........./.....\../..........
....../.../................\........................\...\....\......\............../|...............\.-.......
./....\.../.............|............................-.../............../............/...........\...|........
............................|.................|/..........//.........../..-...............|...................
.....\......\.................|.....|...\-./...............\................|....../.....-..\........-....-...
........................./-........\................./........-/.|....-.......\............-/\......|.\...-...
..../../..|.|...............\.......................................-.........................................
...........|...................................................-...-......|..................\............../.
/....|......................................................................|\.../.......-...........-...|....
......|.-.\......-........|.....-..|.\..............-......./......-|.........................-...............
............\......................................|........................|.-...............................
.........-.........../....\./....../.-...-..//.........../.......\\...........................................
........\......../............./...-......\.../..|..|............................../......../..\..............
--.........|.....-...|............../...|.......|..............\|............|.........................|.-....
-\......./..............-....-....\...|.-........\/.\./............-/...\........|-.........../../...\........
.\|\..............-......-.\...-....\..........................\........|...........-......./.............../.
..........................|...\..../.../..........\.............-...//...............\..................-.....
........./..........................\............|-.....|..-...|......../........-...........................\
.......\.../.....\....../.......|..|...............-......................|....-...................-.|........
......|.......\.../..............................-..............................|......-.-...................\
/.....|.......-............/|.....|-......./..../......-........../..|......../.-..\..../....../...|..........
............/..--..........-............\.......\................\........................../../....|.........
..|..-................|.|..|................/.......\............-//.......................\..\...............
.......................-......-..................|....\................-......\.|....\....|..../../|.-........
........................-..................-...........................-..-................-................|.
/.\....|.-.................................\..-.....\./.........../-.|..............\..\.....--|/....\........
.......-..-../..................\..--|..............|...............|\........|...--................|./.\.....
..........|................-.......|..................................................|...................|...
-.-..|....-.|........-./...|.-.........\.....\/........-........\........../................./.../........\...
..................../...|/......................................../............\.|./../................/\|....
...//.........................\....../..............\../.......-..\....|......................................
............................./..|./../.........-/..\..........................................................
......\.....|..................|..................\.....\.-..\...../............................../...........
..........\...........-..........-.....-....\/................../.................................\.....|..\..
..../.\...................................\............\...\....|.................|.....................-.....
...........-...........................\.......|-../.|....|.....|......................-...../................
.......|.........\..............|....\...-......../...........-.....-..-...........-..................\...\.|.
...........|.......................|....-..........\............................\.................../.\.......
..../.................\.......-..|.................../........................|...............\...........-.|.
............./..|.-\..../.....-............-....|..\......|......../............-.........|................\..
...................\...\/......\............|......................\....|...................-./-..............
..-\...........|.................../.....|....|............................-..|............\.............\....
.|.....\....\........|..................\...............|..-/.........|.-/...........-............-...........
.....\...../......-............|........./..|............-........................\....-......................
......\......../........|..............\...-..-...|.......................................................|...
...................|.................................\.....\...........................|../.|.-......-........
..................|..............\.....\............|........../....../...............\.........\.............
..|...........-..../....\.........--...\................../.............-...-....................-..../....|..
.|...\...................|......-...........-\..........\.....|.....|..........|.........|....|-../...........
.............\|...................../\...............\....../.......-....\.....................-..............
.......//.....................\....\......\......\.........|...................../......../.........\......-..
.\./.........-...-./-.\.............../......|................................\|....\...../....-..............
.......|......../......../......./.........../...............|............................../..|......../.....
............./.........|.....-./.........../....-......./|......-................|............................
+188
View File
@@ -0,0 +1,188 @@
package main
import (
"bufio"
_ "embed"
"fmt"
aoc "go.sour.is/advent-of-code"
)
// var log = aoc.Log
func main() { aoc.MustResult(aoc.Runner(run)) }
type result struct {
valuePT1 int
valuePT2 int
}
func (r result) String() string { return fmt.Sprintf("%#v", r) }
func run(scan *bufio.Scanner) (*result, error) {
var m Map
for scan.Scan() {
text := scan.Text()
m = append(m, []rune(text))
}
rows := len(m)
cols := len(m[0])
options := make([]int, 2*(rows+cols)+2)
i := 0
for j := 0; j <= rows-1; j++ {
options[i+0] = runCycle(m, ray{[2]int{j, -1}, RT})
options[i+1] = runCycle(m, ray{[2]int{j, cols}, LF})
i += 2
}
for j := 0; j <= cols-1; j++ {
options[i+0] = runCycle(m, ray{[2]int{-1, j}, DN})
options[i+1] = runCycle(m, ray{[2]int{rows, j}, UP})
i += 2
}
// fmt.Println(options)
return &result{valuePT1: options[0], valuePT2: aoc.Max(options[0], options[1:]...)}, nil
}
type stack[T any] []T
func (s *stack[T]) Push(v T) {
if s == nil {
panic("nil stack")
}
*s = append(*s, v)
}
func (s *stack[T]) Pop() T {
if s == nil || len(*s) == 0 {
panic("empty stack")
}
defer func() { *s = (*s)[:len(*s)-1] }()
return (*s)[len(*s)-1]
}
var (
ZERO = [2]int{0, -1}
UP = [2]int{-1, 0}
DN = [2]int{1, 0}
LF = [2]int{0, -1}
RT = [2]int{0, 1}
)
type ray struct {
pos [2]int
dir [2]int
}
func (r *ray) next() [2]int {
r.pos[0] += r.dir[0]
r.pos[1] += r.dir[1]
return r.pos
}
type Map [][]rune
func (m *Map) Get(p [2]int) rune {
if p[0] < 0 || p[0] >= len((*m)) {
return 0
}
if p[1] < 0 || p[1] >= len((*m)[0]) {
return 0
}
return (*m)[p[0]][p[1]]
}
func runCycle(m Map, r ray) int {
current := r
s := stack[ray]{}
s.Push(current)
energized := make(map[[2]int]bool)
// energized[current.pos] = true
cycle := make(map[[4]int]bool)
for len(s) > 0 {
current = s.Pop()
r := m.Get(current.next())
// fmt.Println("pos", current.pos, current.dir, string(r), len(s))
if r == 0 {
continue
}
energized[current.pos] = true
v := [4]int{
current.pos[0],
current.pos[1],
current.dir[0],
current.dir[1],
}
if _, ok := cycle[v]; ok {
// fmt.Println("cycle")
continue
}
cycle[v] = true
switch r {
case '|':
switch current.dir {
case UP, DN:
// pass
case LF, RT:
current.dir = UP
s.Push(ray{current.pos, DN})
}
case '-':
switch current.dir {
case LF, RT:
// pass
case UP, DN:
current.dir = LF
s.Push(ray{current.pos, RT})
}
case '/':
switch current.dir {
case UP:
current.dir = RT
case DN:
current.dir = LF
case LF:
current.dir = DN
case RT:
current.dir = UP
}
case '\\':
switch current.dir {
case UP:
current.dir = LF
case DN:
current.dir = RT
case LF:
current.dir = UP
case RT:
current.dir = DN
}
}
s.Push(current)
}
// for i := range m {
// for j := range m[i] {
// if v := energized[[2]int{i,j}]; v {
// fmt.Print("#")
// } else {
// fmt.Print(".")
// }
// }
// fmt.Println("")
// }
return len(energized)
}
+50
View File
@@ -0,0 +1,50 @@
package main
import (
"bufio"
"bytes"
"testing"
_ "embed"
"github.com/matryer/is"
)
//go:embed example.txt
var example []byte
//go:embed input.txt
var input []byte
func TestExample(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(example))
result, err := run(scan)
is.NoErr(err)
t.Log(result)
is.Equal(result.valuePT1, 46)
is.Equal(result.valuePT2, 51)
}
func TestSolution(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(input))
result, err := run(scan)
is.NoErr(err)
t.Log(result)
is.Equal(result.valuePT1, 8098)
is.Equal(result.valuePT2, 8335)
}
func TestStack(t *testing.T) {
is := is.New(t)
s := stack[int]{}
s.Push(5)
is.Equal(s.Pop(), 5)
}
+13
View File
@@ -0,0 +1,13 @@
2413432311323
3215453535623
3255245654254
3446585845452
4546657867536
1438598798454
4457876987766
3637877979653
4654967986887
4564679986453
1224686865563
2546548887735
4322674655533
+141
View File
@@ -0,0 +1,141 @@
222343122415245553243251316124223234134666332224124211645376775672443247264263475261513546522316162532215534453661231232515522214351143451211
422125443253354142511545636246664666565355152246453231651172747635424163415626462753445445312334225221624336126244661514234445544425223533122
131212112421423414125516356342555542626661163526211536677376523712262371162153644117776261645533664544366146314432523222515425314231311544521
131334344235153415214541223454455223563154114267331524774136127715554416125273543276346471735741663351266324144422511534542234341513351345352
314541545523112111131565114333211153312641614321771374726154434476767125613311254537363422511721275135434164664442151263234241114111121141334
435153335153513534132112326653656626231351436457153446433363235565156156723233715473535244413451723176561153261562445512312413413513135513241
235243535523134543445216214455445352435554624255171271225755313626173154112144673146273747537614771377613244145436355342536323123434425211113
132552152551514515631323412533333446136243376366556365574745474652757277632216317677316551253673465513776336664225626313216456312542531241352
311415311541314143614162642634556464574541744355655753776632763662153656721435137347422375344242225276244673434333351454464536453212424421425
453351344131342126143165264626543453632747531417235617257564537542611276314542732241535726557435722271523761452243145343543365433423153132344
424354321333252642533513531241416236636427325176724425161362563217173773414665312244155777552374513335344162564462411154332652126231133233331
433224533551436134314641523151361154615353522622137441214134673454347752343853221756746664765556521762762464233333523123643145626644231443435
243311313556533564523443331214721572253144611715156456321767676655457736255732864573164467712433421256325731135656541255561161224441152415141
511211214252345356344156642436611545463224342452742717585325436325574336455336582448256836717741726221177352616311422112513255165441212221131
244253443163544142511413446172632624762126756145146775348573476557644782564438437852836725866452746165474553473737534665123425113435563332453
232155346345514313654314235557517112176174776332136456448427547478426265844263882743533766568854547675464477171376662424251312612162632514355
424114441642564135264345176163444365144163124128832285838626688224834432458556377773645427653638562736676174576737574642156232566466636441124
543244331213246512421551417132132647763461226245235583478358556478588445828784366325778587856624776125647332126411416416253326543252561355453
513411632124243263566153173255453461117356682265475822242236525286334354628536868726586284535383867467645552277715213631624352612331534144225
234513324414264131211345613416736552211115685767773523645885727834464346536233245827443237753783724626566246761647646475456131431415434413214
132312323255146664114745115275443572754326543474673247542856435836784453584863735676475556838547655484787272216413226712176641452341133361621
324445311115236332563161165371142354332783687877726543524347444677384655338335874866474624655543543466338566764524432633543363631622335214314
452146561262254136627644671525514257523265444635773245326674352228844844533536247443486645863647324742823822411266212747246263222143515531123
323443456261326564347757145611113632534754323645837762327643383533554795688333775647234446628482555868382485343642524356327477353226234131236
323566623463524644662155345214734554448367587534458465333783778836737748873896436675564776876254472473382773351746477537426351164321556552155
411624314463555226413151162214157826642348553426375774773937688356445778864665387877397647688288645648488526683635462551221145364643422311353
632541423444624336526576464457777686224586376437338832948677343497666833369685846994446858346385546773453274862246234173462724342631561154224
353552612514333121215745416727247272652423544685753368594647394695658845883548858535734584333432476287445274435882257755366724515216151451335
532166314441574113623175262414284358754786632434337878589943898388748395969493754638344944356356855723827482463322173565111471477266643531656
116644351623354144151425116542234543365536844644456554366885339853375594997998864974865377578863643354482658652565456654732562467462642222633
425265565534525427323521564886284475834357765873953575557676864375449896735695696945686539933897587748627756658646775714547636543542445454453
535223341313647443711526456446656284686644344893747447894898636684595668686646634379736944587367734766868686525582828566224141647377452234555
363661154543263115262561162483434662346246798873478436638737549697754638834495375733735333645433574877375276735684662372751455123234415466135
233425541263155564422777566657463284532222644739657858356574964435535676435594635788954898867344838753677578547362236357265747553176223645334
516113313346251471245336736766463235445577574763999559496983357388779634999695985559489635746544658453383775634426265623615715313624324613363
325162436525537742416463226466422582452664444569687695737766869564846698477563438574369658749388443473974527623665566388541124766765465414216
246532424466452274271137247462733834328375758733755764656833968984956876697799766884997394499744585594587876625677723447244217267426213343664
164356325132241765153442235356485242287535595375398869579646888545895757975449659944533834737579865398575662388572336243423321763313272155166
563615555622724634724833866443433524894838958833799835363644977657658578544664475868679458747866349983337933858733558557637772576116524351364
415635136113175137578553536586564768643559866697595733497557879468449998976698759797676436636689587877974934738258785642847435574452213713115
611145153512463742256332755487858466583796497738685664885658748948569545664445888744947857868589779795933867483673776857358564657524755764663
235565633417713142257732254688636564985938796475899556649457697557496557466787887559566976984578789695478656638728764846466352277661663613361
621414363456434251274757622526573747939964946885796964745598945469487687577499977988878866574434454755956575894225366755752223145132155653231
345131227736331632753528624737877993467633874573544566489488585879587798745544677645759486797999989373758553748378762622865225676664655255241
211147374365347566347683538644229836375367399779966469889799674657475784657559849567645885568589949973844765649576234674566626355732735375222
123377577423217135757464227844458664877347575684876765589445958984848645558957589999985649678755757487567997496322362828232445742466637677526
664165716524474573468574845478963396633746335989586478477469677874488696466969855457589699479795777786993453995866655558838835473455711456363
645354217411347423778226725287476938984748595969986859957845897656645797969945967774756979786597495489759753559534884668577746471267563715146
641123731653617153523878786635997676839634584755798896844786989789997886975976877949768456676679545757849946967975863276534664727276625714772
115172313432542554343534322666684547383747359496846665858866986576677885977798965677465955688547658777937483437698822255673227856674321437423
412316124234335666538374784464654983653484498444688865778477997658875656978599866558669858496479969969883747883595375635748886535531163731666
126215534552633672772444476653659865338587448788645985679486758768567978966789759768556688875958549895757653789978826784367383554244325537527
252471722164728674273366346869733763887789597776444684764998985757556667899857586887855996664484555498483585754587755247628423684671244526734
616643241174113524686752733973994433637977478579974486858559967566675596878985789668957757945476696698659695977366876442282382768473657366141
433715625621658365787576378559966694694594565764577974766866977599956779776859687775695787565694987685963787977966448785772368444344613132341
542654365337336826434765643879738646353964647955974749776876686976656857777555965796959755779797949695874357763646457888473355582731254116326
461216754736354442526774233456439439344649448885449769679668978899596596779679669865776767595846454969558697477357393642534444663773547743151
242515737157657333842228548349875463457585648494866999577597668698587656558567788999587689857767876885764484449548964773473277753231345166735
654521345226446835568566235799768737539786475876888887965595966585598966967969975867759665599758868667576445864433979732538253832712175534524
115512724255847238822523769738898864344596868468594857859588665686578579798878998656799555798598889485694534558457599364226342568753677472213
111524524557584843753648338688446565566879945758747566968678858898688798787995576956865896565768766698768659698554344826255288878683415552615
775523534424885336584535598468769386864885649976596679699998877966986778776767559667869889767766556949956568378399476985828735885425764761532
617234235723887272453554398456849533986998847969886896697596899979688786876777696866697569685659688446949473894494359678374775655237573674227
731315731775542663287374348536374735499748575465485866966768699899697997797776666566989778755777686999847946948853933693544267753841326646546
722426246522232587267567746363433367778759685487558796666966958776698867986668698666876866775886659846776955633755765593638285378256357434712
174725351666826552875547497865663863549888789874668876958895676696978768897788786788566955869997548858768874638777786742243328886625132571731
611354237262464432722652894576534365759676599966965877965957687768769888968769696957679665987557457444944459839769348686383583662783465636276
435775645554577458385385799454458446877466964957585556758766679978876698869886969697899756896864788684659949467367797467452464686586746747527
326715157438852348356648795697795987947557758498877979757678677886679987996677668886868888557795864545877549896579885386328386465786533157726
453273273424255488663856445483976736667859995777897779896656697978997888787987898778776958957796758748894869487957534497554376546868722122324
224573216435873475783673336556553645879964994546857977556976898696968678989979687688777875655579994576659674597887987885384834758677414425113
356241135726344637684746374354974769468887978766569659956588999669799779786678667886579699675678884889486587434679643859352582448655434457222
466565323122567376356874397989745956794895966548765989989778688799697678896789997978696969665976575677558444868875986457762338452225134143337
362264215456463347238855743779549969969487765646768855768895876877976886666866799968989767688568764586578687569679978449782326532643416155546
671362724447463788282378857469553747694544454845755975585656699878677799678797776968799697957896898878765444867363549353272748888443452166364
632542654733754847425787585687488755596748847964799999775985798869786789699666867675565568797969676665954954838875438688564548862244145146171
333723417316447367476286584684499973896998895898557855668598997699996977697796768788767776689759949696664864687338847464274357245662617625121
732722335132788573566373398994377893654688989578766978658865988697879899789898877758688978567997675756877983739477395738266566365866553224517
147177514747474242267782783587784747967985778647866665897959877679967669667689876857669669767556998597597497483549887695587764775634662343617
152744472376652374322667687839455953897495766449899756875956679668789688868676978978876787578985556849965685833354883453248267842384616432657
217227543612352346346455856939488455758985798868598588765697888677977868879697796686766696678556576857569777547694747435272652536672167123712
744625215616674868776537785459394998859647888485449778786556769796876987889777989756758976977758496584958578978633843394583557326773745211217
353354332722486863626455784779737558677796677557648786868756998567779997999757769989968679778794444858495938377534839655447657354377534537617
351162251452745473452566496983484689397949849568679798775655588857855767769795678968695766898846549555848585493436735966444566758545364773274
546334341147183722785558798496869978864895677895756565879578585766957665575757696669676677769768545948765446463585354842584745473612425647573
235615763364478535767825263879546994497978874484569465769576969857869669765659777668868977865946966479776587987999955433355672374557554754214
162177325222163583735436483646438894396659587698644456886655596959879587966867768858997789444759867989565846639353845278562446263633245724416
324535255452483383635664425784958857579867676497445879975595969977679879855779697798889657664476857564676937793853344868547244368834643131142
121347276513238722442368557665693779499584456766988769868757758795788956896585869778678687556788794995887699638544336543625582864246234111541
357771157266317334828437783465549356369747964978875778866775965679685977988796799568586768676664767564576835757749675276226376757244531177246
336664616327762746632336856333359783983467896468668468658857596888666655696975568657694759566847599666396674475446532283582787232143364371132
644533212754142233635788744897443835653636699755644785889878558985567878858696858779788657475547995487649399794638387758824355331366214575725
222217676717612667687783367437478679946969645869469768494864887557985785659965856994457654994548995554598868743539788752855264561637271324324
356452154463414577848785374339498366535638544946846765677495769785557579699659788879447959897745467466459849543743454246822537753427335371562
343351256333451586862433643627656985753774749546555768998795848687576559887698545798748988498774696693748665338953758884323743215516455337651
511156433162323673647444877388393898578477588665844949845684789786485757669794987664595874795599974455755347864958728824643583546532455523751
156124537652656126446766564883685565845949468648655489495444579455874554846945778967786444756587898964737436487344256846452377111452125151424
515264356113762652852852632686537484556764597765774578755556886965448899978985694964457598494775673883444869546887836668355228143455736361562
263512646525146141226625365446528679473694599878945468469659775468694555669548954648468546665655847884688365888823562232347546127534712221733
631415241711525626678448673422265459959576695493999586674865475767744965494946497644686744965594334353963643655244478563353652375272512755651
233341711151632262167275682837682337594668593834657957999678754665457846558698875995554875885564465558544593484682334467458266753354353656363
222614621174264456548568855775763264556684446457483755666594465554896878549965797747587445795345639937745754468637877328233727712145444373316
551136576466563613374865837744634548656596546959875864946578986489646467467887584454698786369755639588797883757583882864432762672266561742114
311433545766254471655428367633528758869667674337353886355568568977559794557448545869856978986385835684993879575657778365536445625371464633155
223612464456771261577683747465843843667648368983574634838577897765496687876598844667977633334687854753563787465237347324763236171472235426346
411245121677351625555347323585443444334598696449339998397379788744556985684748696646376458494657966586849537253887746577841254462522431254352
344346233632636772414765673728476885836598589955558748979779588656646877576889768598337348786569379345443684386546372358847445714773517622512
155323536362462251246768675874228887274856495665585569666835536867574987794867838438565638693854398377677783434776265675564455312663443423541
331566446775752674417132753235465665833378447847639386878845593445734945386694688999635777683567968539426228468486664337643254264256612362121
243564654224225645722672382353864676463257496747548887493585987546678658735985743376384577953533946647357564447863573451724364472125432653566
342315614225414552353574355435638346877654437484463854837898965395385547754648364866393337683989446882326338262227448314144441743477561422165
513316635431624236671443348277886572254832458877847668477593794644585888563857755634797589885668862754772785358487877315135613177367144545513
463143244643262172563515774358878556748352525757567987986693359853994963575439443448643467386743366524235883462535432614464455735443452664134
365641135114444646623465131227245648484522527682468766639838853356859443957586854538395483886846572325432336737857272623363152162131551135414
416313341334271754356764361744638674522648825426627539586358437534848469663986377869797354638474474353788632454247175546246417444136416435644
224353155431264253763746646441542886447853826453463553364576374757797585985553484899859547773742768633328427884282476754133441524461616242643
141663652631255115673535171111246265842334873322667887864398959494389595436394448689564435578232373254536888873517235136312276614212451451513
124131511566566612435515461237554545678463532355284383577958338477334574565899548354995646534573786226335788675417311262514713363312364535154
423124641651141434731445642547213258886735546328578275442562699767675575457466479427885838355373878586875834224154546773247146645646322335264
412644326632526437735316412561445417468882886666655743427476665574794946797787288666754744722668682487625266217525212752446411411125122652443
533453646465125514654252753512273714342227373732733663723654553522224855828427587263828376724486786422622551345652174733731235533661345526462
431416626556561415256423726364711356216462533453778624228776264745488556248346558664685886255267664468734267241413666377354236365315112133322
115242144546551242654657115464153653733572255453735867582743877872748475375858445224247557346684865447435434415136572343667245436453541641214
211445545143351463615353774344215444543156828652686467572385233427763332873666832447256386848435536242337137777716372765516254142315334335233
345124663224645321264314114673647256557756426376735374628552375257437773764536467386624358238642865332573246663566211211655655563524242452555
314351264524343426135362454521352527263736457447533445374485277766767738682474542365754582457568722614424111744153725635141565436222616112315
525142531331665442641251651451342365334554162254374267466577736465886625773232626738363773743786773241666727445735231415436342625513255235151
543245142256442454155334231734217734761146755176638778856523266374354672783363252424683478557527343237227211135754547531342136551132351221533
241355115114515145351235241342577311663523713245571552423844478483444456674576776374774635321762611146175633416417526461446534624524525232351
413212231435125464562416642131514721163172662635774761555772466528432746222877628357558463622434577676277711461224526611415645224221334321153
424114552242412235261232556412366663124614547557116436567672766285253724382874567666431356536715216512355113511563132462412461555112225422135
322324544333135432235125224253374616723165212337472223432464246434784434268261665524555163346167575177573432151165141342526636661664333152245
533322454514225135644666511564116113743567665217446774461763723457213436114546254524754413534661176555531123216654634336153535555615455221351
345114245113253556125335351622625171466165175642167753751336711273734343723253343654164414153211641676412352766561245653215262351455523141451
142421541514212154334545211465656444644552463442357616615277117635256363621723512341776351424463622726131565431516465664346151153212233245553
444314343434312135211364665242441535527647475416223551347736416724264751235567161762631557147415445546211321423221136662344161541525343455425
513343214231252255165411335621632642146147645756642561211667322537371252122672641421372561555336143123644446534414131135624333443543522413531
151133414553422411155141354122545416221132657162133367556711163132611352466177573117122527412137673543111622364234433423115531533515415532534
344341433553215433332561124312211661162315615567541645475225431414323527474442612165214546553775576346352241352363416414626442233143123431324
312334123334252355135521123323245125516132154636463653576675247514555746177477533534522123547665145656414436131454466514531422525141331441324
221234522113214232242154165523542235561622643243233434644217742623556626525264626677654256257462621433131425222466152534235213545112335523443
+225
View File
@@ -0,0 +1,225 @@
package main
import (
"bufio"
_ "embed"
"fmt"
aoc "go.sour.is/advent-of-code"
)
var log = aoc.Log
func main() { aoc.MustResult(aoc.Runner(run)) }
type result struct {
valuePT1 int
valuePT2 int
}
func (r result) String() string { return fmt.Sprintf("%#v", r) }
func run(scan *bufio.Scanner) (*result, error) {
var m aoc.Map[int16, rune]
for scan.Scan() {
text := scan.Text()
m = append(m, []rune(text))
}
log("start day 17")
result := result{}
result.valuePT1 = search(m, 1, 3, seenFn)
log("result from part 1 = ", result.valuePT1)
result.valuePT2 = search(m, 4, 10, nil)
log("result from part 2 = ", result.valuePT2)
return &result, nil
}
type Point = aoc.Point[int16]
type Map = aoc.Map[int16, rune]
// rotate for changing direction
type rotate int8
const (
CW rotate = 1
CCW rotate = -1
)
// diretion of path steps
type direction int8
var (
U = Point{-1, 0}
R = Point{0, 1}
D = Point{1, 0}
L = Point{0, -1}
)
var directions = []Point{U, R, D, L}
var directionIDX = func() map[Point]direction {
m := make(map[Point]direction, len(directions))
for k, v := range directions {
m[v] = direction(k)
}
return m
}()
// position on the map
type position struct {
loc Point
direction Point
steps int8
}
func (p position) step() position {
return position{p.loc.Add(p.direction), p.direction, p.steps + 1}
}
func (p position) rotateAndStep(towards rotate) position {
d := directions[(int8(directionIDX[p.direction])+int8(towards)+4)%4]
return position{p.loc.Add(d), d, 1}
}
// implements FindPath graph interface
type graph struct {
min, max int8
m Map
target Point
reads int
seenFn func(a position) position
}
// Neighbors returns valid steps from given position. if at target returns none.
func (g *graph) Neighbors(current position) []position {
var nbs []position
if current.steps == 0 {
return []position{
{R, R, 1},
{D, D, 1},
}
}
if current.loc == g.target {
return nil
}
if left := current.rotateAndStep(CCW); current.steps >= g.min && g.m.Valid(left.loc) {
nbs = append(nbs, left)
}
if right := current.rotateAndStep(CW); current.steps >= g.min && g.m.Valid(right.loc) {
nbs = append(nbs, right)
}
if forward := current.step(); current.steps < g.max && g.m.Valid(forward.loc) {
nbs = append(nbs, forward)
}
return nbs
}
// Cost calculates heat cost to neighbor from map
func (g *graph) Cost(a, b position) int16 {
g.reads++
_, r, _ := g.m.Get(b.loc)
return int16(r - '0')
}
// Potential calculates distance to target
// func (g *graph) Potential(a position) int16 {
// return aoc.ManhattanDistance(a.loc, g.target)
// }
// Target returns true when target reached. receives node and cost.
func (g *graph) Target(a position, c int16) bool {
if a.loc == g.target && a.steps >= g.min && a.steps <= g.max {
return true
}
return false
}
// Seen attempt at simplifying the seen to use horizontal/vertical and no steps.
// It returns correct for part1 but not part 2..
func (g *graph) Seen(a position) position {
if g.seenFn != nil {
return g.seenFn(a)
}
return a
}
func seenFn(a position) position {
if a.direction == U {
a.direction = D
}
if a.direction == L {
a.direction = R
}
// a.steps = 0
return a
}
func search(m Map, minSteps, maxSteps int8, seenFn func(position) position) int {
rows, cols := m.Size()
start := Point{}
target := Point{rows - 1, cols - 1}
g := graph{min: minSteps, max: maxSteps, m: m, target: target, seenFn: seenFn}
cost, path, closed := aoc.FindPath[int16, position](&g, position{loc: start}, position{loc: target})
log("total map reads = ", g.reads, "cost = ", cost)
printGraph(m, path, closed, g.seenFn)
return int(cost)
}
// printGraph with the path/cost overlay
func printGraph(m Map, path []position, closed map[position]int16, seenFn func(a position) position) {
pts := make(map[Point]position, len(path))
for _, pt := range path {
pts[pt.loc] = pt
}
clpt := make(map[position]position, len(closed))
for pt := range closed {
clpt[position{loc: pt.loc, steps: pt.steps}] = pt
}
for r, row := range m {
// if r == 0 {
// for c := range row {
// if c == 0 {
// fmt.Print(" ")
// }
// fmt.Printf("% 5d", c)
// }
// fmt.Println("")
// }
for c := range row {
// if c == 0 {
// fmt.Printf("% 5d", r)
// }
if pt, ok := pts[Point{int16(r), int16(c)}]; ok {
if seenFn != nil {
pt = seenFn(pt)
}
_ = pt
// fmt.Printf("% 5d", closed[pt])
fmt.Print("*")
continue
}
// fmt.Print(" ....")
fmt.Print(" ")
}
fmt.Println("")
}
fmt.Println("")
}
+41
View File
@@ -0,0 +1,41 @@
package main
import (
"bufio"
"bytes"
"testing"
_ "embed"
"github.com/matryer/is"
)
//go:embed example.txt
var example []byte
//go:embed input.txt
var input []byte
func TestExample(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(example))
result, err := run(scan)
is.NoErr(err)
t.Log(result)
is.Equal(result.valuePT1, 102)
is.Equal(result.valuePT2, 94)
}
func TestSolution(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(input))
result, err := run(scan)
is.NoErr(err)
t.Log(result)
is.Equal(result.valuePT1, 843)
is.Equal(result.valuePT2, 1017)
}
+14
View File
@@ -0,0 +1,14 @@
R 6 (#70c710)
D 5 (#0dc571)
L 2 (#5713f0)
D 2 (#d2c081)
R 2 (#59c680)
D 2 (#411b91)
L 5 (#8ceee2)
U 2 (#caa173)
L 1 (#1b58a2)
U 2 (#caa171)
R 2 (#7807d2)
U 3 (#a77fa3)
L 2 (#015232)
U 2 (#7a21e3)
+766
View File
@@ -0,0 +1,766 @@
R 4 (#0a7a60)
U 8 (#4453b3)
R 6 (#8e4f70)
U 2 (#4453b1)
R 4 (#0feb00)
U 4 (#355591)
R 8 (#2a09c0)
U 4 (#544c71)
R 4 (#472930)
U 2 (#199e33)
R 3 (#3d8df0)
U 5 (#199e31)
R 7 (#45de50)
U 4 (#57a941)
L 7 (#671c70)
U 5 (#5e5e81)
R 4 (#2e9b60)
U 8 (#490881)
L 7 (#1846f0)
U 3 (#304101)
L 4 (#1846f2)
D 2 (#58f3f1)
L 9 (#2e9b62)
D 2 (#56dcd1)
L 2 (#671c72)
D 9 (#275fd1)
L 4 (#76b7b2)
U 9 (#5b9641)
L 4 (#1d3212)
U 10 (#3d1841)
L 3 (#5ad5e2)
D 6 (#010211)
L 5 (#13ec52)
D 8 (#166471)
L 3 (#53ebc0)
D 5 (#0fdba1)
L 4 (#54e450)
D 9 (#440a21)
L 3 (#49b242)
D 5 (#2f0171)
L 6 (#447332)
D 4 (#182561)
L 8 (#1aaaa2)
D 6 (#0996a1)
L 4 (#1c1212)
D 6 (#5780d1)
L 7 (#0fc1d2)
D 7 (#36cb41)
L 3 (#505552)
D 7 (#8d8b81)
R 4 (#2bf742)
D 7 (#152791)
R 5 (#760492)
D 3 (#11a991)
R 3 (#5debc0)
D 10 (#59f211)
L 4 (#66d342)
D 8 (#1fc6b1)
R 4 (#66d340)
D 6 (#72dff1)
L 2 (#3f1b10)
D 4 (#2fca13)
L 10 (#2d0162)
D 5 (#8b5e53)
L 6 (#2d0160)
U 2 (#317053)
L 2 (#650c20)
U 7 (#2bed01)
R 10 (#409ed0)
U 2 (#166713)
L 10 (#939350)
U 6 (#166711)
L 4 (#38a180)
D 3 (#1d95f1)
L 6 (#11ea60)
D 5 (#931dc1)
R 6 (#11bf70)
D 7 (#536051)
L 3 (#995b60)
D 2 (#254e91)
L 3 (#332fd2)
U 6 (#7669f1)
L 3 (#574642)
U 6 (#1778a1)
L 3 (#1a00c2)
U 5 (#2eaa81)
L 3 (#1cf8e2)
U 6 (#0c71a1)
L 6 (#868472)
U 3 (#0a9fd1)
R 9 (#104c02)
U 4 (#082451)
L 7 (#850d02)
U 6 (#082453)
L 7 (#322552)
U 3 (#1339d1)
L 6 (#8e11d2)
U 4 (#6c5691)
R 6 (#1dda10)
U 3 (#25e5c3)
R 7 (#370670)
U 4 (#9324f1)
L 3 (#451030)
U 7 (#1f1021)
L 7 (#0ba3c0)
U 5 (#8a10a3)
L 8 (#67db30)
U 5 (#282473)
L 4 (#0cd350)
U 4 (#25e5c1)
R 3 (#6b4ee0)
U 4 (#333cf1)
R 5 (#02b610)
D 4 (#4e7cc1)
R 3 (#92abb0)
U 5 (#2f6ff1)
R 5 (#483360)
U 5 (#7b1cd1)
L 8 (#3a5d50)
U 3 (#1d2461)
R 8 (#3b2fd0)
U 5 (#630763)
R 6 (#5033c0)
U 3 (#252523)
R 7 (#08eeb0)
U 8 (#516633)
L 7 (#156240)
U 4 (#2db063)
L 3 (#791070)
D 5 (#2920a3)
L 3 (#0dafe0)
U 5 (#4185b3)
L 5 (#7ac0e0)
U 2 (#5a6cd3)
L 2 (#3ca790)
U 7 (#755403)
L 4 (#3b0740)
U 5 (#2004a3)
L 3 (#2db4f0)
U 6 (#602a23)
R 5 (#32c1c0)
D 2 (#000f53)
R 5 (#388360)
D 7 (#24d9e3)
R 4 (#4703a0)
D 3 (#2f1133)
R 3 (#4703a2)
U 11 (#52e853)
R 5 (#278132)
D 11 (#0665e3)
R 3 (#239112)
U 6 (#8f0ad1)
R 5 (#447de2)
U 6 (#8f0ad3)
R 6 (#636122)
U 2 (#187283)
R 3 (#5aae62)
U 10 (#1d8833)
L 5 (#476db0)
U 5 (#136393)
L 7 (#29e6b0)
U 5 (#136391)
R 7 (#3ba060)
U 3 (#635e23)
L 5 (#2042f0)
U 3 (#181643)
L 6 (#5af952)
U 8 (#28d0b1)
L 2 (#4a98f2)
U 9 (#28d0b3)
L 6 (#27a572)
D 3 (#3d7213)
L 4 (#516842)
D 11 (#21ef63)
L 5 (#38e342)
D 2 (#1118b3)
L 3 (#560502)
D 9 (#1118b1)
R 2 (#1c39a2)
D 2 (#303ab3)
R 6 (#716ba0)
D 6 (#780a93)
L 8 (#77ec30)
U 2 (#780a91)
L 3 (#271100)
U 10 (#5882f3)
L 4 (#2050c2)
D 3 (#434843)
L 3 (#7d9572)
D 2 (#3129b3)
L 5 (#21fb12)
D 5 (#8c2c33)
L 4 (#57bf92)
D 6 (#2730b3)
L 4 (#6a3902)
D 8 (#4656a3)
L 5 (#60ac80)
D 4 (#43b863)
R 9 (#3d69a0)
D 8 (#3ca913)
L 2 (#411d80)
D 3 (#725383)
L 8 (#4a98d0)
D 9 (#274553)
L 5 (#580d60)
U 5 (#568223)
L 6 (#473af0)
U 5 (#827593)
L 7 (#251dc2)
U 5 (#0fcea3)
L 8 (#5ae3d2)
U 3 (#4efa11)
R 9 (#389852)
U 2 (#7f7f91)
R 6 (#618342)
U 3 (#441143)
L 7 (#886df2)
U 3 (#26a093)
L 8 (#886df0)
U 4 (#63c7d3)
L 3 (#04f842)
D 10 (#0fcea1)
L 6 (#388e62)
U 10 (#3ae7f3)
L 3 (#2a6880)
U 6 (#3bfd53)
L 6 (#73a0c0)
U 5 (#3bfd51)
L 4 (#0d18a0)
U 2 (#19da93)
L 6 (#120600)
U 8 (#233b53)
L 6 (#2e1050)
U 3 (#4b2aa3)
L 4 (#5f9930)
U 10 (#6e65f1)
R 6 (#1eefa0)
U 9 (#50b9d3)
R 2 (#548ed0)
U 9 (#50b9d1)
R 7 (#8bd9f0)
U 4 (#5ae473)
R 6 (#0b0490)
U 10 (#186891)
R 4 (#764830)
U 7 (#33b0e1)
R 5 (#363c90)
U 8 (#7bd631)
R 7 (#031e30)
U 7 (#095881)
R 3 (#640e50)
D 5 (#02e7f3)
R 7 (#0922f0)
D 7 (#6b7af3)
R 9 (#0922f2)
D 3 (#62e543)
R 3 (#21e320)
U 9 (#5ead81)
R 7 (#01fd70)
D 9 (#3b0cf1)
R 2 (#2758a0)
D 5 (#7279b1)
R 8 (#5c7dc0)
D 7 (#3c8db1)
R 4 (#3c3740)
U 2 (#26b151)
R 6 (#11eb12)
U 4 (#587921)
R 6 (#11eb10)
U 4 (#320051)
R 4 (#038630)
U 3 (#6a2e61)
R 2 (#4ff680)
U 5 (#3c57f1)
R 9 (#0b2440)
U 8 (#497533)
L 6 (#704680)
U 11 (#549113)
R 6 (#23b470)
U 4 (#9e0641)
R 7 (#1aeec0)
D 7 (#4a6331)
R 2 (#547d80)
D 5 (#457a71)
R 9 (#7daa90)
D 4 (#16d7b1)
L 6 (#266810)
D 3 (#363561)
L 5 (#5312b2)
D 4 (#42c301)
R 5 (#9a0952)
D 7 (#42c303)
R 7 (#7d1df2)
D 4 (#51e321)
R 5 (#609422)
D 4 (#3b8f01)
R 6 (#644792)
U 4 (#2d8b11)
R 7 (#22bbc2)
D 7 (#6b39b1)
R 5 (#680e72)
U 2 (#7f9f31)
R 3 (#0e9b52)
U 3 (#3086c1)
R 3 (#5a60c0)
U 6 (#53b6e3)
R 7 (#8117d0)
U 7 (#53b6e1)
R 3 (#2cb930)
U 3 (#1bffd1)
R 6 (#4539f0)
U 8 (#680411)
R 4 (#6032c0)
U 6 (#255061)
R 3 (#5562a0)
U 6 (#088071)
R 3 (#3bf2f0)
U 5 (#52bdb1)
L 6 (#070500)
U 5 (#69e001)
R 6 (#070502)
U 3 (#071051)
R 2 (#036000)
U 4 (#0ea8a1)
R 5 (#05e4d0)
U 3 (#674de1)
R 3 (#804250)
D 6 (#3ffca1)
R 4 (#23dcb2)
D 6 (#9f9841)
L 5 (#45f210)
D 9 (#15efc1)
R 5 (#45f212)
D 4 (#969551)
L 9 (#23dcb0)
D 2 (#41bea1)
L 4 (#2f2a32)
D 4 (#71ffd1)
R 3 (#5c0bb2)
D 7 (#6f3501)
R 4 (#2b0a72)
D 4 (#7b3571)
R 3 (#1c67d2)
U 11 (#42f011)
R 3 (#51ae62)
D 3 (#75fcf1)
R 3 (#1f4742)
D 4 (#2813f1)
R 4 (#3d1812)
D 2 (#2b1d01)
R 11 (#1eb302)
U 3 (#27b0a1)
R 4 (#227b20)
U 5 (#34b7e1)
R 10 (#201220)
U 7 (#0502f3)
R 4 (#5ab7f0)
U 4 (#0502f1)
R 4 (#5d09b0)
U 7 (#504a81)
R 7 (#1e8250)
U 3 (#715aa1)
R 6 (#26d290)
U 6 (#9a12f1)
L 3 (#18be90)
U 8 (#037d11)
L 5 (#647600)
U 3 (#40b983)
L 5 (#04e450)
U 3 (#9a9a43)
L 8 (#04e452)
U 6 (#8af153)
R 8 (#6cbc90)
U 4 (#04d121)
L 4 (#285292)
U 3 (#688d51)
L 6 (#176332)
U 4 (#400a91)
L 5 (#176330)
U 5 (#43def1)
R 2 (#285290)
U 2 (#3e0711)
R 3 (#7eb9c0)
U 7 (#36f611)
R 7 (#666af0)
D 7 (#381b31)
R 3 (#298922)
U 3 (#475671)
R 6 (#977c12)
D 4 (#602d01)
R 6 (#25b0c2)
D 6 (#7ede81)
R 3 (#1d58c2)
D 8 (#873523)
L 9 (#265ae2)
D 3 (#57d663)
R 7 (#1565c2)
D 8 (#06ed11)
R 4 (#a348c2)
D 2 (#06ed13)
R 8 (#12d052)
D 4 (#2d3741)
L 7 (#0ccfd2)
D 3 (#1fcd61)
R 4 (#39a4c2)
D 3 (#44f7f1)
R 6 (#5c3202)
D 8 (#2625c1)
L 8 (#2b08c2)
D 2 (#20d7e1)
L 2 (#67b892)
D 10 (#546471)
R 7 (#484ef2)
D 7 (#49bc91)
R 4 (#91aa72)
U 11 (#499591)
R 3 (#0048b2)
U 7 (#34a7a1)
R 7 (#514600)
U 8 (#1cdc43)
L 7 (#471470)
U 3 (#8c8393)
R 3 (#18a780)
U 5 (#8c8391)
R 3 (#4e6f80)
U 3 (#1cdc41)
R 8 (#428930)
U 5 (#5dcb51)
R 3 (#4b21e2)
U 4 (#0464b1)
R 9 (#850552)
D 8 (#464881)
R 7 (#543852)
D 3 (#2d3a11)
R 3 (#081b22)
D 5 (#0cc731)
R 7 (#6990e0)
D 3 (#79d7b1)
R 3 (#509520)
D 5 (#438571)
R 3 (#27d510)
D 3 (#30d2d3)
L 8 (#1b7a00)
D 5 (#8a0da3)
L 8 (#1b7a02)
U 5 (#027cb3)
L 7 (#350130)
D 8 (#2ff771)
R 7 (#16dc02)
D 2 (#68f1c1)
R 5 (#02f782)
D 6 (#4e2a41)
R 11 (#448e32)
D 5 (#2cfac1)
L 11 (#417502)
D 5 (#2cfac3)
L 4 (#22f022)
U 9 (#1e9f01)
L 5 (#543572)
U 3 (#076e31)
L 6 (#081b20)
U 5 (#1ae851)
L 3 (#823132)
U 9 (#2d7993)
L 4 (#5738f2)
D 8 (#79e273)
L 4 (#5c9ad2)
D 8 (#4ed1b3)
L 3 (#311722)
D 4 (#0d5493)
L 6 (#5d63e0)
D 6 (#178cf3)
L 5 (#75b1b0)
D 5 (#178cf1)
L 6 (#11d550)
D 6 (#44ed03)
L 3 (#76a842)
U 6 (#3b6993)
L 5 (#184892)
D 4 (#5c8163)
L 3 (#14d872)
U 2 (#261a01)
L 5 (#2d01e2)
U 9 (#326ca3)
L 4 (#59ad32)
U 8 (#326ca1)
R 4 (#389ab2)
U 9 (#261a03)
L 4 (#50cb42)
D 4 (#2f8263)
L 5 (#9f3752)
D 6 (#4bb383)
L 4 (#2693f2)
D 4 (#19dca3)
R 4 (#475bc2)
D 6 (#960e13)
L 7 (#0c90a2)
D 8 (#3463d3)
L 6 (#5a82e2)
D 3 (#5a5c43)
R 7 (#120bf2)
D 3 (#5069e3)
R 3 (#4b47a2)
D 6 (#635b63)
R 4 (#66ca10)
U 4 (#1418f1)
R 7 (#1d5470)
D 4 (#1418f3)
R 8 (#66d4f0)
D 5 (#3c5533)
R 4 (#2f6e02)
D 3 (#2cf5e3)
R 4 (#633ec2)
D 7 (#2cf5e1)
R 7 (#5846b2)
D 3 (#4f9d63)
R 4 (#533380)
D 11 (#13c7e3)
R 2 (#222b62)
D 3 (#928ab3)
R 5 (#222b60)
U 5 (#0a4793)
R 5 (#15d3b0)
U 8 (#363fe1)
R 4 (#2feb30)
U 5 (#05d8b1)
R 3 (#39e030)
U 3 (#05d8b3)
R 2 (#3cd780)
U 8 (#02c781)
R 5 (#186452)
D 3 (#37bba1)
R 5 (#9e1232)
D 5 (#58e6f1)
R 5 (#182c30)
D 5 (#072db1)
R 5 (#85e600)
D 4 (#607651)
R 5 (#186450)
D 3 (#0aca91)
L 5 (#0ceb10)
D 5 (#860001)
L 6 (#54c8b0)
U 5 (#393971)
L 4 (#37c390)
D 3 (#1f1433)
L 5 (#3d8790)
D 6 (#353623)
R 4 (#78c830)
D 4 (#6fafa3)
R 6 (#2b0612)
D 5 (#31fff3)
R 7 (#8b49b2)
D 9 (#6f0ee3)
R 5 (#4212e0)
D 6 (#5d11f3)
R 6 (#648340)
D 8 (#393743)
R 6 (#34ddd0)
U 8 (#346fb3)
R 5 (#34fc22)
D 4 (#71c453)
R 6 (#5048f2)
D 4 (#0bb993)
R 4 (#42b9f0)
D 9 (#5cdf83)
R 5 (#42b9f2)
D 3 (#6f3f93)
R 3 (#3dbae2)
D 8 (#495363)
R 9 (#328ba2)
D 3 (#77afa1)
R 5 (#575710)
D 2 (#10d861)
R 4 (#257822)
D 4 (#6efe61)
R 9 (#257820)
D 5 (#521d01)
R 5 (#575712)
D 6 (#494cf1)
L 5 (#683ab2)
D 4 (#5e79c3)
L 3 (#4242a2)
D 4 (#5e79c1)
L 7 (#2c3442)
D 8 (#2fbd23)
L 5 (#636fb2)
D 5 (#63bd53)
L 2 (#299960)
D 6 (#31ea33)
R 3 (#51dfb0)
D 7 (#4e4ec3)
R 4 (#7b7912)
D 5 (#4b4bf3)
R 4 (#54e882)
D 5 (#7d2193)
R 3 (#3b77d2)
D 3 (#826973)
R 8 (#646ec2)
D 4 (#076c63)
L 10 (#674052)
D 6 (#3676b1)
L 9 (#3bd890)
D 4 (#7feb71)
L 3 (#3bd892)
D 3 (#27fc21)
R 8 (#66bba2)
D 8 (#645c73)
R 5 (#43e132)
D 5 (#51d9e3)
R 8 (#43e130)
D 6 (#2827f3)
R 4 (#412c92)
D 5 (#7e7f63)
L 4 (#218122)
D 4 (#546e83)
L 9 (#82f672)
D 8 (#6ed383)
L 3 (#701412)
D 7 (#47de23)
L 5 (#46f912)
D 7 (#0d9ec3)
L 4 (#515142)
D 3 (#4699e3)
L 9 (#2ed562)
U 6 (#00a273)
L 9 (#8d7d12)
U 2 (#6c3a83)
L 7 (#318fa2)
U 7 (#0bd473)
L 2 (#6d5050)
U 10 (#415673)
R 3 (#9e8420)
U 6 (#1ff213)
R 5 (#0c8bf0)
U 2 (#479a11)
R 6 (#977360)
U 5 (#479a13)
L 8 (#250680)
U 2 (#1ff211)
L 3 (#216630)
U 3 (#22d143)
L 3 (#3b4342)
U 7 (#9d4ff3)
L 5 (#43aca2)
U 6 (#29efd3)
L 3 (#5c6a12)
D 11 (#134a73)
L 6 (#2a0982)
U 11 (#444723)
L 4 (#47e2e2)
U 4 (#6855c3)
L 4 (#06a382)
U 4 (#2222e3)
R 3 (#4edc62)
U 6 (#9a2683)
R 6 (#131872)
U 10 (#4f5a23)
R 4 (#858f70)
U 5 (#4d4823)
L 9 (#3f73f0)
U 3 (#46f5a3)
L 4 (#935370)
U 4 (#46f5a1)
L 5 (#3ca140)
U 6 (#07b1e3)
L 5 (#61ecd0)
U 5 (#654743)
L 5 (#3cec42)
U 6 (#30bb83)
R 3 (#920782)
U 6 (#1f9323)
R 8 (#3d8aa2)
U 8 (#7492c3)
R 3 (#301cd2)
U 3 (#32e2f1)
R 4 (#6936f2)
U 6 (#32e2f3)
R 6 (#5112c2)
U 7 (#535b53)
L 10 (#61f4d0)
U 3 (#915863)
L 2 (#51d540)
U 5 (#32dee1)
L 10 (#4ec320)
U 5 (#406bc1)
L 2 (#1b3890)
U 3 (#681181)
L 6 (#35ed60)
D 9 (#153fd3)
L 5 (#323e30)
U 5 (#381ad3)
L 3 (#69a550)
U 3 (#310f63)
L 4 (#2cbb80)
U 5 (#3448a3)
R 6 (#206282)
U 5 (#202ab1)
L 6 (#83af82)
U 4 (#202ab3)
L 4 (#248d02)
D 9 (#28a983)
L 4 (#32cf10)
D 7 (#249d73)
R 4 (#2f5c70)
D 6 (#021c93)
L 7 (#957782)
D 6 (#550e53)
R 5 (#957780)
D 6 (#50bb13)
R 9 (#49b7f2)
U 6 (#096e93)
R 4 (#769452)
D 3 (#6dc543)
R 5 (#2ad352)
D 7 (#167963)
L 10 (#673682)
D 5 (#152883)
L 10 (#13f332)
D 3 (#996721)
L 4 (#4be2a2)
D 4 (#9c2443)
L 4 (#2b83b0)
D 3 (#5d63b3)
L 9 (#9cfd40)
D 7 (#49e793)
L 7 (#0b5422)
D 8 (#5c51b3)
L 2 (#6db152)
D 4 (#215b53)
L 3 (#38dc12)
D 8 (#7dad01)
L 6 (#559e22)
D 3 (#929d23)
L 2 (#0f7560)
D 6 (#448d13)
L 7 (#73a972)
D 2 (#2221c3)
L 3 (#73a970)
D 5 (#53b553)
R 10 (#513590)
D 3 (#293c83)
L 10 (#58e2e0)
D 4 (#54dd21)
L 5 (#1bcdf2)
D 5 (#4b0b71)
L 5 (#1bcdf0)
U 6 (#43b811)
L 5 (#4df1d0)
U 6 (#36d6a3)
R 5 (#3bfb20)
U 5 (#75de61)
L 5 (#1e0ec2)
U 4 (#30b571)
L 7 (#2dfd20)
D 5 (#49ad61)
L 2 (#2dfd22)
D 11 (#715d41)
L 3 (#1e0ec0)
U 4 (#0f2091)
L 4 (#9d29c0)
U 9 (#475a73)
L 2 (#108610)
U 3 (#1e5423)
L 8 (#394192)
U 3 (#0274b3)
+89
View File
@@ -0,0 +1,89 @@
package main
import (
"bufio"
_ "embed"
"fmt"
"strconv"
"strings"
aoc "go.sour.is/advent-of-code"
"golang.org/x/exp/maps"
)
// var log = aoc.Log
func main() { aoc.MustResult(aoc.Runner(run)) }
type result struct {
valuePT1 int
valuePT2 int
}
func (r result) String() string { return fmt.Sprintf("%#v", r) }
func run(scan *bufio.Scanner) (*result, error) {
var vecsPT1 []aoc.Vector
var vecsPT2 []aoc.Vector
for scan.Scan() {
text := scan.Text()
if len(text) == 0 {
continue
}
v, color := fromLine(text)
vecsPT1 = append(vecsPT1, v)
vecsPT2 = append(vecsPT2, fromColor(color))
}
return &result{
valuePT1: findArea(vecsPT1),
valuePT2: findArea(vecsPT2),
}, nil
}
var OFFSET = map[string]aoc.Point[int]{
"R": {0, 1},
"D": {1, 0},
"L": {0, -1},
"U": {-1, 0},
}
var OFFSET_INDEXES = maps.Values(OFFSET)
func fromLine(text string) (aoc.Vector, string) {
v := aoc.Vector{}
s, text, _ := strings.Cut(text, " ")
v.Offset = OFFSET[s]
s, text, _ = strings.Cut(text, " ")
v.Scale = aoc.Atoi(s)
_, text, _ = strings.Cut(text, "(#")
s, _, _ = strings.Cut(text, ")")
return v, s
}
func fromColor(c string) aoc.Vector {
scale, _ := strconv.ParseInt(c[:5], 16, 64)
offset := OFFSET_INDEXES[c[5]-'0']
return aoc.Vector{
Offset: offset,
Scale: int(scale),
}
}
func findArea(vecs []aoc.Vector) int {
shoelace := []aoc.Point[int]{{0, 0}}
borderLength := 0
for _, vec := range vecs {
shoelace = append(shoelace, shoelace[len(shoelace)-1].Add(vec.Point()))
borderLength += vec.Scale
}
return aoc.NumPoints(shoelace, borderLength)
}
+42
View File
@@ -0,0 +1,42 @@
package main
import (
"bufio"
"bytes"
"testing"
_ "embed"
"github.com/matryer/is"
)
//go:embed example.txt
var example []byte
//go:embed input.txt
var input []byte
func TestExample(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(example))
result, err := run(scan)
is.NoErr(err)
t.Log(result)
is.Equal(result.valuePT1, 62)
is.Equal(result.valuePT2, 952408144115)
}
func TestSolution(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(input))
result, err := run(scan)
is.NoErr(err)
t.Log(result)
is.True(result.valuePT1 < 68834) // first attempt too high.
is.Equal(result.valuePT1, 46334)
is.Equal(result.valuePT2, 102000662718092)
}
+17
View File
@@ -0,0 +1,17 @@
px{a<2006:qkq,m>2090:A,rfg}
pv{a>1716:R,A}
lnx{m>1548:A,A}
rfg{s<537:gd,x>2440:R,A}
qs{s>3448:A,lnx}
qkq{x<1416:A,crn}
crn{x>2662:A,R}
in{s<1351:px,qqz}
qqz{s>2770:qs,m<1801:hdj,R}
gd{a>3333:R,R}
hdj{m>838:A,pv}
{x=787,m=2655,a=1222,s=2876}
{x=1679,m=44,a=2067,s=496}
{x=2036,m=264,a=79,s=2244}
{x=2461,m=1339,a=466,s=291}
{x=2127,m=1623,a=2188,s=1013}
+780
View File
@@ -0,0 +1,780 @@
ztj{s<2703:A,m<1025:vk,ztl}
nqt{a>3513:R,s>2424:R,m>929:R,A}
mr{s>2281:R,A}
gf{x>2746:R,a<3379:jcl,R}
gkv{x>2579:qlx,s>322:rxv,R}
gdl{x<2917:A,s>82:A,s<54:R,R}
hzc{m<1277:R,m>1355:A,x>953:A,R}
xs{x>2337:ft,m>1444:A,R}
hs{m<235:A,a<2424:A,x<3026:pvh,hqk}
cls{a<1361:zch,s<3630:tnh,a<2359:px,spb}
gq{m<1157:A,R}
hc{m<2726:A,s>1302:A,R}
lt{x>3157:A,a<3669:R,R}
sf{x<3199:R,s>2680:jrl,x>3718:jh,R}
hr{m>1737:A,A}
bgg{x<171:A,x<283:R,R}
pgb{m<1624:ksc,x>2675:bzc,bzn}
zm{m<2599:sjc,m>3497:A,m<2946:A,A}
gbb{x>860:bxv,a<2306:br,msc}
gsl{x>53:A,A}
zs{x<1669:kp,x<2690:ns,s>2951:cls,tvv}
qhq{x<1264:A,m<1728:A,R}
gg{s<239:A,s>340:R,x>3642:A,R}
ktx{m>2620:R,m>2073:R,a<3539:R,R}
xg{x<3497:fp,sgc}
pms{m<3366:R,x>3570:A,R}
gsb{x>2077:A,A}
xf{s>3779:A,R}
tfs{s>3844:rb,s<3703:scg,bk}
bgb{a>2837:R,a>2812:A,A}
nvk{s<2358:mr,x>2818:nqt,x<2757:lf,R}
fg{a>1961:A,x<68:R,R}
cfz{x>1567:A,m>951:A,a<2959:R,A}
ljt{m>950:A,m<557:R,m<745:A,R}
zcq{m>1403:th,fd}
tbv{a>1532:R,R}
dq{m>960:R,csz}
tvv{a<2619:zh,m>1623:kb,vh}
dzz{s>3136:R,s<2702:A,a>2889:R,R}
lg{a<66:A,s>784:A,s>263:A,A}
zfk{s<463:R,x>3180:A,R}
bdh{s>356:A,s>193:A,m>482:R,R}
tc{m>3454:R,x>3211:A,A}
tz{x>3191:R,a<1319:R,R}
cpn{m<2478:A,a<2228:A,a>3262:A,A}
qmt{x<2144:R,flt}
nsp{m<379:R,R}
sxt{s<1011:A,a>1135:A,rl}
bjg{m>973:lz,x>243:hh,a>1789:xl,xmg}
cj{x>2137:nst,m<3002:A,s>3193:jc,pfr}
lmc{a>2967:A,A}
tv{m>1493:A,m<769:A,R}
khc{m>2346:mbr,s>596:kvr,a<274:fzh,tb}
zbk{s>1140:qrt,x>1818:pv,a>540:gt,gxc}
kk{s>3728:R,s>3683:R,m<562:A,A}
jv{m<848:zpq,a>1225:fsv,ztj}
shb{a<242:A,m>2625:R,R}
fhg{m>1372:R,A}
dg{x>1246:qd,s<3289:lbf,a<1032:zzp,ks}
cfq{s>2689:A,s>2613:R,A}
gl{m>2798:cqm,s>3029:cnl,m>2233:A,qc}
tkv{m<1884:A,A}
fdm{m<1549:tgt,x<2498:kdf,s>528:jz,lt}
vx{x<2948:xc,mgp}
bs{m<687:A,R}
kp{x>609:dkr,tqc}
xpj{x<934:A,a>1772:A,A}
rhd{x>956:A,a<2471:A,a<3414:A,A}
srg{m>1381:A,s<264:A,A}
szv{s>453:mff,nzj}
ldl{a>3906:A,A}
rxv{m<1632:R,m>1700:R,R}
ch{s<3588:A,a<639:A,R}
sc{s>2789:A,a<1419:R,R}
gk{m>415:R,x>508:A,a<3053:R,R}
rs{s<1893:R,m>2997:R,x<2049:R,R}
ncn{s<722:R,m>3562:A,s>773:jm,vr}
kz{x>3160:A,A}
xxt{s>1035:R,a<942:R,R}
pfr{m<3520:A,A}
nh{a<638:mv,s>865:vm,nrf}
sg{s>3051:vps,m>2918:A,zhs}
xnj{x>3494:A,m>584:A,a<1897:A,R}
jg{s<2380:R,a<2211:A,A}
cqm{s<3107:R,a>3295:R,m>3224:R,A}
hgv{m<203:A,s>107:R,A}
vqt{x<2609:xkn,bnt}
ft{s>3154:A,m>1087:R,A}
qv{a>621:A,a>259:xp,m<2439:fbv,kpq}
lzv{x<2186:gpt,lsb}
lx{x>3655:A,s>2359:A,s>2271:R,R}
xfj{s<407:sxx,R}
tnh{x<3164:vx,js}
mbr{s<671:A,R}
tbn{m<2151:A,x<3001:R,R}
zhp{m<3768:fgp,x>3307:rv,kj}
qd{s<3201:A,s>3491:hgt,x>1468:A,R}
qdk{s<1950:R,R}
vn{s>2814:A,m>386:A,A}
lv{x>3090:A,s>2406:znh,R}
km{m>2029:A,m>1871:A,s<2456:A,R}
ppc{m>2718:R,x<2889:A,x>3361:A,R}
bk{a<3189:A,m>846:R,R}
ht{s>2582:jts,x<3333:hx,rgx}
bb{x<3122:A,x>3258:R,m>3625:A,A}
fd{m>650:R,x<450:A,a<2254:gb,gk}
dcf{s>1084:tzp,gbb}
pm{x>3659:A,m<3539:R,A}
hj{a>3260:hrn,A}
ds{m>767:A,m>718:A,R}
ccv{a<2781:R,a<2905:hd,s<1781:A,qdk}
vh{s<2473:lpg,m>643:cmn,s>2647:vkk,ht}
zld{x<3737:A,xst}
djf{x<748:R,R}
jfx{m>1768:gz,m>802:jfs,m<437:cl,snl}
vft{x<2121:dn,m<2486:kf,x<2180:qmt,vsj}
bc{m<369:hs,a<2050:dfd,m>584:mx,vqt}
dn{a<799:vbr,m<1868:A,s<1387:skb,rs}
kxl{a<1795:A,s>3664:A,s<3514:R,R}
bh{x>3971:A,R}
pv{x>1877:R,s<517:R,m>2313:R,A}
vzj{s<1879:cth,vc}
fc{a<2156:ths,zbc}
cs{a>2745:A,x>2067:A,s>2357:R,A}
nsj{a>2800:A,m<2010:R,R}
lsb{a>2810:R,x>2463:A,m>2877:R,bz}
nl{x<2336:A,x>2529:A,A}
pk{m<2800:A,s>3027:R,x<487:A,A}
bzn{m<1838:R,A}
qrt{s>1765:R,s>1529:A,s>1302:zdc,kzp}
srn{m<3131:zbr,a>3269:phc,x<2610:R,xd}
lz{m<1282:pzk,s>1085:gld,A}
spb{x<3144:krj,sx}
mqz{m>467:sm,m<282:R,s<969:hhs,jfp}
mff{s<632:A,x>625:R,dzt}
hgt{m<2577:A,s<3667:A,s>3805:R,R}
xpv{a<3077:R,R}
rf{m>3497:gv,a>334:vhk,A}
rsc{s>1811:A,jk}
vkl{a>1095:A,a<912:R,R}
mpn{a>3161:pdk,x>3461:zld,ff}
pzk{s>1180:R,m>1114:R,x>299:A,R}
vf{x<492:R,s<3334:R,R}
kjv{m<719:bc,vhc}
ks{m>2088:kxl,a>1906:ll,gq}
vm{m>1632:vb,qcr}
ph{a<2292:qzf,A}
xn{x<2461:qln,R}
px{a<1762:xg,x>3186:jfx,fc}
fzz{x<3174:mq,a>1103:nn,m<533:bgn,mdq}
xl{x>116:lmr,m<712:nvq,a>2807:jmf,R}
br{s>958:xxt,x<537:bnn,a<1228:R,ssr}
mcl{x>3441:R,s<2530:R,R}
gn{a<3598:R,a>3777:A,x>861:A,R}
scg{a>3029:A,s>3661:A,R}
kr{m<471:R,hz}
xfc{s>3354:R,R}
th{a>1860:vf,a>789:pk,mt}
nm{s<2242:A,x>3062:kz,R}
xp{m<2732:R,a<441:R,A}
fzh{a>101:A,x>3191:R,A}
bn{x<3725:R,a>499:R,R}
kmh{s>1727:A,a>1678:A,a<1550:A,A}
dj{m<2927:R,m>3578:A,x>1056:R,A}
jz{x>3123:A,a>3678:A,x>2902:R,R}
qq{m<3557:A,m>3852:A,a<1950:R,A}
nrv{m>1238:qcd,mqz}
pmd{x>3502:R,gdl}
ll{s>3570:A,s<3419:R,x>946:A,R}
td{x<1875:A,a>1161:A,A}
jt{m>1937:A,s<430:tkv,R}
pp{s<1233:mzr,m>2932:vsl,ccv}
ssr{s<903:R,R}
qcd{m>1677:R,R}
sv{x<3042:fv,s<3775:tc,m<3706:ct,dm}
qsg{x>3287:vvt,dbq}
cdt{x<3342:kx,a>1677:btj,nth}
jrl{m>1242:A,m>940:R,m<793:R,R}
dzt{s<732:A,A}
dk{m>1342:rmq,hdt}
rn{x<3645:A,R}
fx{s>1211:jpn,s>785:nrv,m<1357:pd,dcg}
nvh{a<2086:kmh,x<2940:A,m<2730:R,pms}
cb{x<581:sd,psf}
mq{m>678:A,x>2970:qf,a<881:A,ck}
qfn{s>298:A,R}
rss{s>1618:rsl,frj}
sp{x<3759:R,a>512:A,m>3807:R,R}
dns{m>270:A,x<2335:R,s>3567:R,R}
dsr{x<2503:R,m>969:A,x>3358:R,A}
jfs{s>3760:R,R}
zpq{x<2139:td,s>2466:nl,A}
vk{s<2893:A,a<803:A,s>2986:R,A}
rbn{a>3902:zp,m>472:A,R}
tvn{m<2544:R,A}
lqf{a<3601:rnx,a<3691:A,fz}
ls{m<1384:A,R}
rnk{a>3786:R,m<2367:A,zl}
pdk{x>3398:R,s>2636:tnq,a>3510:xt,km}
gm{x>1475:sg,zdv}
ps{s>2886:A,A}
ndh{a<979:fkj,a>1636:A,s>2743:tz,nf}
zhs{s>2501:R,a<3309:A,s>2306:A,R}
zht{a>1418:A,A}
fn{x>3198:A,a>3957:R,m>3278:A,A}
xc{m>1714:xfc,a>2574:cmr,A}
gld{m<1414:R,x<381:A,m<1444:A,R}
pz{m>3006:R,A}
fkp{a>3424:R,m<3526:A,A}
fqc{a<2473:tv,m>2350:cj,a<2565:xs,vv}
bnt{s>1011:R,x>3453:A,R}
xzq{a<3766:lqf,a<3888:kgd,s<1399:zmt,lp}
clh{a<1003:A,s>3818:A,ntv}
rq{s>2799:R,m<1088:A,A}
jfp{s<1113:A,R}
hh{x<466:A,R}
md{s>1194:R,R}
hm{a>1759:gsb,R}
vb{s>1454:A,s<1082:kxs,a>1134:A,hc}
rsl{a<3803:gh,st}
tjb{x>2545:A,x>1949:A,R}
zsp{s<3356:R,A}
bg{x>1362:A,R}
lbf{m>1460:A,mnr}
bt{s<856:R,s>1189:ppc,x>2845:R,R}
ct{a<1119:A,x>3291:A,m<3487:A,A}
drn{s>2455:R,x>3658:A,x>3401:R,A}
xst{m>2109:R,a>2952:A,a<2839:R,R}
pr{a>3195:xxm,R}
rnx{s<926:A,a>3544:R,A}
ngl{a<2849:kzb,x>1007:R,vq}
fhq{m<1694:R,m>3210:A,a>1513:A,A}
ttd{x>952:R,m>216:R,m>132:R,A}
tg{a>447:R,m<3009:R,s<3685:R,A}
cgl{x>2271:A,s>3239:R,s<2541:cs,A}
jh{a>3871:R,s<2611:A,R}
vlx{m>2576:A,a<3152:R,m>1231:A,R}
fh{s>1137:R,s<937:R,djf}
xz{x<2419:sl,x<3456:rt,m>3040:fs,crn}
pj{a<887:sq,s<3315:A,R}
kjt{m<990:hqc,nkr}
tb{m>1009:A,A}
ppm{a<1310:R,a<1850:R,a<2261:R,R}
jm{x<1054:R,a<579:R,A}
fsf{x<3020:R,R}
xxm{a<3299:R,R}
pvh{s>929:A,R}
bfx{a<3017:A,a>3351:gn,grz}
fp{x<2966:tbv,x<3308:R,R}
krr{x<677:tvn,A}
vdz{m<3388:R,x<844:A,R}
hzf{s>385:R,s<196:A,A}
jjf{x>3217:A,m<616:qfn,dr}
nq{x>2432:lg,m<1705:A,R}
cmn{a<3539:rtg,a>3754:sf,dv}
sq{a>365:R,m>2615:A,s>3324:A,A}
xqf{x<554:A,m>1924:A,x>1244:A,R}
gxc{a<350:A,s>506:fhg,vl}
qx{a<3727:A,R}
nzq{m<1027:R,s>1843:R,A}
rv{a<3212:R,x>3734:R,m>3888:tq,tn}
lrn{m>1353:kq,s<3039:jv,gx}
nf{m>2662:A,x<3529:A,m>2179:A,R}
zlz{a<750:mc,clh}
kf{a>756:A,R}
gj{m<1030:A,a>1937:R,R}
gb{s<3174:A,s<3470:A,A}
tnq{x>3001:A,R}
zqv{m>691:A,R}
kj{x<2954:psp,x>3147:mg,a>3127:mjb,A}
tgn{a>1711:lkc,s>541:qt,R}
npt{x<772:R,x>900:R,s<1084:R,A}
cx{x>3400:lxp,lbv}
vvt{s>278:R,A}
vqq{x<3192:R,A}
tq{s>2456:R,s<2301:R,x>3451:A,A}
xxx{m<2342:R,A}
dkr{a<2409:dg,m<1437:lvf,x>1274:gm,qdc}
fs{s>1657:pbv,m<3482:A,m>3677:R,R}
tpg{m<1159:A,x>3135:R,gmf}
qln{a<2906:A,a>2928:R,a<2918:R,A}
lvf{x<1270:bfx,x<1455:bzz,qk}
xlq{m<334:A,s>1515:A,A}
sx{m<1833:tfs,hf}
gpt{a>2836:zxd,a>2730:R,A}
krn{x>1155:ckd,s<1260:A,m>2770:A,zht}
sk{m>348:R,x>1377:A,m>153:A,R}
rl{a<984:R,R}
ntd{a<819:dns,qnm}
grz{x>890:A,a<3172:A,A}
kt{x>967:A,R}
qs{m<1546:A,R}
js{x>3672:qmv,a>2929:hdn,hcs}
bzz{m<647:sk,bg}
vv{s>2934:sj,R}
lbp{s>2775:R,R}
zxd{x>1854:A,R}
crn{s>1724:R,rn}
jc{x>1851:R,s<3672:A,m<3477:A,R}
xxh{m>1324:qqn,qm}
pn{s<976:A,m<2297:R,A}
fv{s>3818:A,s<3658:R,s<3743:R,A}
ck{x>2824:R,m<316:R,A}
vdp{x<3490:A,A}
xq{m>184:A,x>3334:A,A}
fz{m>3339:R,m>2690:R,x>2493:R,R}
jf{m<1773:R,x>659:R,A}
xd{a<3143:A,R}
svq{a<3528:A,R}
cl{x>3473:A,R}
qf{x>3076:A,R}
ktb{m<3197:A,s<704:R,s>1154:A,A}
gbj{m<158:R,m<302:R,m>336:R,R}
ff{s<2459:lmc,s>2743:R,nsj}
rcn{s>3821:R,x>2847:A,a<2261:R,A}
xkn{x>2134:R,x>1785:A,A}
pf{a>3576:A,s>3815:A,s>3737:R,R}
ntv{s<3659:R,A}
psf{m>575:R,a<2611:A,m>319:R,R}
fqz{a>3321:bx,vdp}
tzp{x<554:ph,a>2615:lm,krn}
pht{s>625:fh,x>606:ffn,sxb}
zz{m<1836:ql,s>1299:hp,m<3200:shb,A}
snl{s>3863:R,a<2001:xnj,kk}
qdc{a<3128:ngl,a>3442:rnk,x<874:zm,gl}
rsz{m>1017:R,x<2038:A,m<443:R,dzz}
frj{m>1063:md,a>3826:rbn,s>1317:lb,zkk}
bbt{a>3364:A,a<3152:R,R}
lpg{x>3231:fqz,x<2909:nvk,s<2283:nm,lv}
sd{s<1984:R,a>1624:A,m<729:A,A}
spq{x<3000:A,s>148:A,R}
fsv{s<2728:gj,m<1078:fpf,s>2917:R,R}
rmq{s<3098:A,x<182:fg,cpn}
msc{x>326:A,xxx}
drg{a>1618:hzf,s>486:zjl,a>619:hzc,A}
hx{x>3100:R,m<249:hnq,R}
ksc{a>3214:A,x>2913:R,R}
kxs{x<3497:R,s>949:A,A}
xv{s>311:A,R}
kd{x<3492:A,ppm}
st{s<1839:R,m>810:R,pgj}
ntb{m>3358:spq,m>2731:zhg,s<116:R,A}
lqz{a>3814:A,A}
fb{x>2177:tg,bjd}
dcg{a<3359:pgb,rch}
khp{a<2918:A,x>3796:R,m>378:R,A}
hhs{x<3165:A,R}
bnn{a<1158:R,x<228:A,A}
nx{m>469:R,x>3876:R,x<3760:A,A}
vl{m>1539:A,a>468:A,s>326:R,A}
qmv{s<3328:R,A}
rt{m<2818:fbx,R}
hcs{x<3425:zsp,mk}
mn{m<2363:A,R}
sm{m<839:A,x>2835:A,s>1035:A,A}
zn{x<2270:R,a>798:R,s>3678:R,A}
qqn{m>1794:jt,a<3748:fdm,gkv}
hdn{s>3198:A,s>3046:R,ngq}
mg{x>3205:R,s<2688:R,A}
sgc{x<3807:fhq,x<3919:A,bh}
qhl{m>2988:A,x>3259:drn,xpv}
zbr{x<2841:R,m>2724:R,R}
rjb{x>2706:R,R}
qp{m>1140:drg,tgn}
kkk{s>1408:vzj,m<1501:dnp,s<833:dmc,dcf}
cmr{a>3290:R,m>1084:R,m>506:R,A}
lbv{m<3300:R,a<923:A,s<2435:bb,qq}
mjb{m<3900:R,a>3686:A,R}
clg{s>1434:nvh,m>3229:rsh,bt}
hrn{a>3478:R,a>3380:R,m>1194:R,A}
zhd{s>1275:R,m>3076:R,m<2721:A,R}
hnq{x>2834:A,R}
tbt{x>3131:A,m<3435:R,A}
phc{a>3375:A,a<3306:R,A}
vq{x<800:R,s>2917:R,x<922:R,R}
kq{s<3392:sc,a>1260:hm,m>2319:fb,htk}
fbx{a>3317:A,m<2345:A,R}
cm{m<2219:R,m>2264:R,R}
csz{s>3528:R,A}
nst{x>2459:A,A}
lf{a<3121:R,x<2716:R,m<818:R,A}
xsp{x<2980:R,a>2817:A,A}
qm{x<2949:kr,x<3428:jjf,s<456:jtt,jqn}
qt{s<744:A,x<1059:R,s>816:R,A}
zc{x>3545:qx,a>3625:vn,A}
cxk{a>1449:ntt,s>1617:xbr,s>1504:R,xqf}
cg{x>2245:zx,x<1956:zbk,vft}
zkk{m<649:A,a>3680:R,R}
bx{a<3661:A,x<3529:A,a>3778:R,R}
mv{s>1300:rsc,khc}
qjt{x<3376:A,R}
mgp{x>3029:zq,A}
fpf{a>1769:R,x>2049:A,s<2923:A,R}
lhc{s>1662:A,m>1543:A,a<3599:tl,vfn}
mzr{a<2819:R,R}
psp{s<2611:A,a>3354:A,a>3056:A,A}
vc{m<1333:cb,mp}
bzc{m<1850:R,m<1953:A,R}
kb{m<2614:mpn,m>3380:zhp,gqd}
dv{a<3677:cfq,x<3383:R,s<2710:R,rq}
xh{s<2524:A,R}
vr{s>754:A,x<643:A,A}
sj{s<3498:R,s<3711:R,m<1518:A,R}
bq{a<1413:R,m>3189:A,a<1750:R,R}
bgn{m<197:A,m<353:gbq,xh}
jl{x>2858:R,m<476:R,R}
vbr{x<2055:R,m>2096:A,R}
ngq{a>3426:R,s<3009:A,a<3210:A,R}
krj{x>2852:pjd,gf}
dp{m>1430:A,A}
xkm{m<1913:kjv,vz}
vg{x>224:R,a>1513:A,m<323:A,R}
jmf{s<1182:A,a>3547:A,A}
vqr{a>3441:ljt,A}
ckd{m>3131:R,a<1567:R,m>2271:R,A}
bp{s>3270:A,s>3133:R,R}
pc{x>3663:A,m<491:R,A}
mx{m>663:bs,m<622:tjb,gkn}
qhh{x<1947:A,m>3589:A,R}
ths{a>2010:dp,R}
znh{m>662:A,x>2990:R,R}
fph{a>2941:R,s<1649:R,R}
nkr{x<1012:npt,m>1326:A,s>1224:R,R}
zbc{x>2881:R,x>2784:rcn,x>2722:xf,rjb}
hp{s>1600:R,s>1465:R,a>263:R,R}
kdf{s>420:R,m>1639:R,x>2176:A,R}
hkl{s<3823:bn,m>3668:sp,s>3936:A,A}
lp{m>3026:tbt,s>1876:R,bj}
zmt{a>3930:fn,a<3915:bcz,ktb}
jqn{a<3862:pc,m<761:R,a<3938:ldl,A}
hms{x>3072:A,s<1921:R,A}
sn{s>774:A,s>753:R,x>547:A,A}
kx{m>1998:tbn,A}
mqc{m<2308:A,m>3052:A,m>2635:R,A}
qdj{a>2946:zgm,a<2669:fqc,m>2271:lzv,ndr}
xt{a>3826:A,x<3063:A,A}
kvr{m>1390:R,x>3294:A,R}
hz{x>2278:A,x<1949:A,A}
fkj{x<3168:A,s<2741:R,R}
tn{m<3831:R,s>2560:R,A}
zjl{s>694:R,R}
ndr{a<2827:cgl,x<2240:rsz,xn}
btj{m<1813:qs,m<2042:jg,cm}
bjd{x<1891:A,s>3600:A,A}
gjg{m>2075:rjd,a<3588:fx,s<809:xxh,rss}
zch{s<3538:hl,m<2003:zlz,dz}
nrf{s>428:vkl,s>146:qsg,a>957:pmd,dxn}
vhc{s>1085:tpg,jxf}
lb{m<643:xlq,a>3717:svn,m>911:dsr,ds}
zdc{x>1803:R,A}
bzj{s>3689:A,m<2560:R,R}
flt{s>1360:A,x>2163:A,A}
qg{s>1039:A,A}
dm{m<3816:A,s<3853:R,A}
xmg{m>752:A,x>137:jzj,gsl}
bcz{a<3903:R,R}
lkc{a>3188:A,m<900:A,m>1018:A,R}
jxf{s<527:srg,A}
gx{m>486:dq,ntd}
bd{s>2400:A,x>3671:A,s>2281:R,A}
qc{s<2673:R,A}
lm{a<3182:dj,a>3635:lqz,a>3407:R,R}
qnm{m<247:R,a>1687:R,m>389:A,A}
zq{s>3263:R,s>3111:R,R}
mk{s>3246:A,m>2016:R,s<3088:A,R}
rql{a<3077:xsp,s>2761:jl,s>2722:R,A}
vj{s<2785:ndh,kd}
in{s>2178:zs,skv}
xrc{s>712:sn,A}
jp{a<2589:R,A}
pgj{a>3929:R,x>2479:A,A}
jts{x>3530:R,A}
gv{s>3739:A,R}
mnr{s>2737:R,A}
tgt{m>1439:R,s>292:R,A}
xvs{a<2848:A,A}
vps{a>3227:A,x<1588:R,A}
jzj{m<672:A,s<1122:R,R}
zzp{x<901:ch,R}
sl{s>1542:A,s>1296:R,x>1931:A,zxz}
rjd{a>3500:xzq,s<1086:qj,xz}
kgd{s>1426:A,a>3812:A,R}
dmc{m<2947:szv,kqx}
hbk{m<3419:A,R}
htk{a<729:R,a>1042:A,a>861:R,zn}
zp{s<1255:A,A}
qlx{m>1631:R,x>3329:R,R}
skv{x<1606:kkk,a<1440:ggv,a<3018:xkm,gjg}
zl{m>3149:A,a>3596:A,R}
sjc{m>2149:A,A}
ggv{x>2600:nh,cg}
pd{a<3356:pr,x<2700:xfj,a<3465:zbd,xv}
vhk{a<614:A,a>735:A,m>3340:A,R}
bz{x<2317:R,s<3304:A,A}
zbd{m>889:zfk,bdh}
vsj{a<598:zhd,R}
qzf{a>1455:R,x>340:A,s<1196:R,R}
dz{m<3157:qv,x>3473:hkl,a>877:sv,rf}
rtg{a>2957:R,A}
qk{a>3252:svq,s>3213:R,m>548:cfz,R}
zx{a>871:sxt,a>314:mn,a>186:zz,nq}
kcd{x<2880:R,s>94:R,R}
hqc{m<796:R,m>890:rhd,a<2192:A,xvs}
ffn{m>350:jp,a<2088:ttd,a>2817:R,R}
sz{m<1599:R,x>2121:ktx,m<3075:bbt,qhh}
jtt{a<3836:zqv,m<876:gg,A}
lmr{a<2718:A,a<3149:R,R}
zdv{s>3010:R,lr}
jcl{m<1659:A,R}
mdq{a<479:R,A}
dnp{m<537:pht,s<885:qp,x<582:bjg,kjt}
lxp{m>2932:A,lx}
kqx{s<513:hbk,a<1592:ncn,a>3119:xrc,kt}
cnl{x<1035:R,m<2338:A,R}
mp{m<2347:xpj,a>2221:vdz,bq}
rgx{s<2542:R,R}
rb{s<3903:A,A}
jk{m>2376:R,x>3391:R,m<1198:R,R}
zgm{s>3092:bzj,sz}
gt{a>1014:R,m<2365:ls,R}
jpn{s>1819:hj,a>3326:vqr,ljm}
nzj{s>254:R,m>2156:R,x<991:jf,qhq}
gh{m>856:A,nsp}
kpq{a<110:A,x>3312:R,x<3090:R,R}
hl{x<3177:pj,bp}
gs{a<180:R,s>3703:R,R}
gz{m>3188:R,R}
lft{s>2829:ps,gbj}
kzb{m>2754:A,a<2674:A,A}
vz{a>2453:pp,clg}
tqc{x<360:dk,zcq}
bxv{a<2317:A,m<2884:pn,fkp}
ztl{a<590:R,x<2295:R,x>2529:R,R}
vkk{a>3382:zc,x>3140:xrl,m<384:lft,rql}
fbv{s<3805:R,s>3881:R,a>172:R,R}
gbq{m>279:A,x<3717:R,x<3898:A,R}
svn{s<1485:R,A}
skb{s>589:R,s>295:R,x>2063:A,A}
mc{a>272:A,x>3488:gs,s>3786:A,fsf}
pbv{x<3811:R,a>3290:A,m<3444:R,A}
gkn{s<1377:A,A}
nth{a<1084:bd,A}
vsl{a<2799:A,a<2901:bgb,fph}
lr{x<1407:A,s>2654:R,s<2373:A,R}
dbq{m<1824:R,s>291:R,A}
hdt{s>3011:R,s>2681:A,bgg}
nvq{m>597:R,x>47:R,A}
qj{s>674:pz,s>313:srn,ntb}
fgp{a>3257:R,mcl}
pjd{s<3848:vlx,A}
gmf{s<1729:A,A}
kzp{x>1746:A,x>1670:A,m>2460:A,A}
tl{m<888:A,m<1289:A,R}
zh{m<1334:fzz,s>2674:vj,m<2347:cdt,cx}
ql{s<1432:A,a>258:R,A}
rch{s<485:R,vqq}
hf{a<3208:R,pf}
bj{x<2870:R,m<2489:A,R}
zhg{x>3190:A,s>144:R,m<2941:A,R}
rsh{x<3060:R,a<1833:pm,R}
ntt{a>1930:R,a<1611:A,A}
hd{s>1811:A,R}
dfd{x<2726:A,qg}
gqd{a>3471:qjt,qhl}
xrl{x>3598:khp,m>284:lbp,m<100:R,xq}
zxz{m<2818:A,R}
vfn{s>1502:R,x>955:R,s>1440:A,R}
dr{s<370:A,x>3070:R,R}
cth{a<2210:cxk,a>3174:lhc,krr}
xbr{m<1775:R,m>3200:A,A}
nn{m>718:R,x>3641:nx,A}
dxn{s<55:hr,x>3309:A,a<824:kcd,mqc}
mt{a<423:R,a>555:R,R}
hqk{a>2663:A,s<888:R,a<2564:R,A}
ns{a<2307:lrn,qdj}
sxb{s>318:vg,hgv}
ljm{s<1457:A,m>763:A,s>1648:R,A}
qcr{s<1460:R,m<548:hms,a>1054:A,nzq}
sxx{a>3455:A,R}
{x=378,m=450,a=211,s=36}
{x=220,m=1090,a=338,s=879}
{x=117,m=124,a=2136,s=128}
{x=1392,m=1408,a=126,s=16}
{x=2038,m=278,a=901,s=1801}
{x=323,m=1703,a=964,s=571}
{x=265,m=358,a=456,s=34}
{x=1513,m=144,a=525,s=1341}
{x=355,m=2036,a=814,s=1179}
{x=937,m=701,a=2026,s=1349}
{x=1292,m=766,a=2805,s=16}
{x=319,m=26,a=83,s=1193}
{x=600,m=5,a=242,s=76}
{x=117,m=1415,a=1636,s=1057}
{x=87,m=1530,a=1686,s=386}
{x=36,m=957,a=1712,s=300}
{x=2570,m=49,a=661,s=442}
{x=643,m=698,a=1593,s=854}
{x=1450,m=1410,a=289,s=1342}
{x=1690,m=376,a=584,s=3715}
{x=1942,m=570,a=1726,s=1192}
{x=420,m=475,a=1410,s=863}
{x=550,m=662,a=2140,s=105}
{x=241,m=2370,a=756,s=26}
{x=705,m=425,a=1000,s=160}
{x=1763,m=914,a=197,s=555}
{x=2267,m=323,a=70,s=147}
{x=497,m=392,a=1959,s=360}
{x=428,m=1375,a=415,s=236}
{x=1800,m=96,a=403,s=1227}
{x=216,m=381,a=1217,s=1031}
{x=3129,m=304,a=811,s=1753}
{x=555,m=59,a=3254,s=2896}
{x=397,m=1518,a=740,s=496}
{x=905,m=217,a=1234,s=2319}
{x=283,m=2490,a=309,s=1156}
{x=1777,m=624,a=96,s=2053}
{x=1031,m=481,a=1014,s=198}
{x=155,m=205,a=2460,s=832}
{x=123,m=25,a=3962,s=3662}
{x=3242,m=396,a=519,s=150}
{x=2632,m=1307,a=3594,s=1714}
{x=147,m=285,a=1020,s=40}
{x=1498,m=1133,a=241,s=1263}
{x=1977,m=323,a=1594,s=241}
{x=807,m=1042,a=702,s=295}
{x=70,m=455,a=1328,s=108}
{x=2392,m=27,a=158,s=44}
{x=528,m=671,a=2003,s=935}
{x=1539,m=2002,a=168,s=479}
{x=2121,m=195,a=901,s=1116}
{x=251,m=51,a=380,s=745}
{x=793,m=1959,a=598,s=605}
{x=137,m=261,a=714,s=1548}
{x=2783,m=486,a=2065,s=914}
{x=574,m=387,a=250,s=28}
{x=3,m=829,a=1862,s=2}
{x=846,m=2476,a=841,s=1810}
{x=1020,m=114,a=463,s=323}
{x=4,m=970,a=192,s=142}
{x=942,m=2297,a=125,s=1638}
{x=1664,m=2275,a=2086,s=290}
{x=682,m=93,a=143,s=2033}
{x=1613,m=356,a=463,s=632}
{x=633,m=268,a=150,s=798}
{x=1743,m=1455,a=56,s=487}
{x=2774,m=103,a=739,s=77}
{x=1760,m=2631,a=81,s=138}
{x=461,m=1688,a=1543,s=1712}
{x=1182,m=14,a=566,s=3270}
{x=680,m=467,a=1920,s=297}
{x=1281,m=2355,a=704,s=1340}
{x=142,m=65,a=589,s=20}
{x=1412,m=559,a=677,s=2106}
{x=905,m=2761,a=1526,s=648}
{x=399,m=667,a=1901,s=27}
{x=2241,m=3411,a=1786,s=321}
{x=1395,m=1278,a=508,s=1112}
{x=363,m=35,a=218,s=1280}
{x=829,m=115,a=304,s=192}
{x=1397,m=599,a=861,s=838}
{x=824,m=2140,a=88,s=1736}
{x=661,m=276,a=502,s=731}
{x=585,m=14,a=705,s=473}
{x=747,m=95,a=829,s=805}
{x=2006,m=323,a=982,s=168}
{x=795,m=193,a=473,s=1531}
{x=687,m=428,a=972,s=1154}
{x=254,m=426,a=281,s=552}
{x=171,m=369,a=382,s=1369}
{x=964,m=10,a=322,s=2007}
{x=1960,m=183,a=2153,s=1967}
{x=2315,m=170,a=41,s=727}
{x=189,m=901,a=307,s=3026}
{x=757,m=1235,a=1316,s=335}
{x=836,m=3023,a=453,s=2355}
{x=2187,m=2140,a=683,s=2560}
{x=1772,m=468,a=1812,s=1329}
{x=783,m=601,a=1339,s=3291}
{x=570,m=172,a=1794,s=120}
{x=1207,m=1572,a=700,s=758}
{x=1961,m=3652,a=702,s=153}
{x=1094,m=435,a=19,s=938}
{x=3328,m=166,a=247,s=216}
{x=1500,m=2012,a=1561,s=59}
{x=12,m=2269,a=8,s=796}
{x=193,m=1137,a=328,s=13}
{x=120,m=1179,a=59,s=1829}
{x=499,m=650,a=1049,s=1803}
{x=2761,m=1431,a=389,s=1322}
{x=456,m=2766,a=2165,s=348}
{x=2387,m=12,a=2140,s=556}
{x=387,m=7,a=1514,s=1137}
{x=1111,m=608,a=581,s=965}
{x=1055,m=181,a=754,s=67}
{x=74,m=2582,a=66,s=546}
{x=5,m=956,a=1013,s=657}
{x=262,m=189,a=2496,s=233}
{x=518,m=2821,a=851,s=825}
{x=351,m=1981,a=221,s=34}
{x=995,m=165,a=36,s=2286}
{x=1636,m=335,a=936,s=447}
{x=763,m=692,a=1527,s=210}
{x=301,m=559,a=1815,s=2640}
{x=959,m=2852,a=232,s=53}
{x=136,m=153,a=206,s=11}
{x=1533,m=42,a=2014,s=136}
{x=341,m=378,a=37,s=577}
{x=220,m=1451,a=185,s=421}
{x=1086,m=3265,a=1184,s=2960}
{x=143,m=2701,a=602,s=173}
{x=628,m=1016,a=1642,s=223}
{x=597,m=641,a=1331,s=651}
{x=809,m=1843,a=1111,s=2189}
{x=1385,m=1352,a=238,s=1969}
{x=515,m=1374,a=125,s=913}
{x=798,m=2743,a=1798,s=1045}
{x=2999,m=1787,a=1168,s=188}
{x=57,m=77,a=2652,s=56}
{x=1231,m=304,a=1288,s=523}
{x=1031,m=381,a=558,s=267}
{x=721,m=883,a=2995,s=22}
{x=304,m=846,a=1525,s=30}
{x=446,m=2969,a=412,s=674}
{x=187,m=418,a=1187,s=571}
{x=810,m=515,a=819,s=1393}
{x=740,m=3392,a=1128,s=1114}
{x=137,m=631,a=1208,s=1707}
{x=653,m=2468,a=952,s=811}
{x=33,m=70,a=518,s=464}
{x=3318,m=2,a=3661,s=64}
{x=50,m=548,a=1657,s=704}
{x=2272,m=2684,a=1597,s=2220}
{x=185,m=339,a=460,s=517}
{x=8,m=1651,a=1810,s=354}
{x=548,m=833,a=1703,s=759}
{x=551,m=358,a=390,s=468}
{x=202,m=2260,a=597,s=632}
{x=453,m=1811,a=754,s=2449}
{x=353,m=101,a=1835,s=72}
{x=1451,m=453,a=162,s=13}
{x=125,m=2120,a=627,s=981}
{x=5,m=283,a=1755,s=194}
{x=973,m=835,a=62,s=1184}
{x=346,m=1348,a=442,s=210}
{x=4,m=1242,a=136,s=196}
{x=2388,m=1336,a=1991,s=2873}
{x=561,m=2335,a=1059,s=627}
{x=838,m=3226,a=159,s=1053}
{x=2578,m=49,a=1920,s=2432}
{x=710,m=342,a=182,s=534}
{x=1997,m=1509,a=946,s=1849}
{x=810,m=249,a=495,s=257}
{x=363,m=274,a=2742,s=25}
{x=506,m=565,a=2584,s=731}
{x=508,m=2073,a=21,s=1826}
{x=1413,m=780,a=779,s=378}
{x=1097,m=47,a=98,s=402}
{x=536,m=2,a=2710,s=1499}
{x=548,m=2845,a=2095,s=555}
{x=2963,m=2206,a=1920,s=875}
{x=1783,m=367,a=1245,s=594}
{x=409,m=18,a=408,s=119}
{x=1554,m=3613,a=3002,s=87}
{x=232,m=197,a=63,s=1372}
{x=412,m=1355,a=1673,s=1667}
{x=261,m=142,a=123,s=1187}
{x=1396,m=779,a=287,s=60}
{x=28,m=1350,a=585,s=861}
{x=1123,m=329,a=1166,s=62}
{x=2292,m=73,a=123,s=596}
{x=2400,m=1430,a=390,s=1313}
{x=638,m=2856,a=44,s=488}
{x=294,m=1534,a=1075,s=1914}
{x=1233,m=71,a=253,s=3058}
{x=1536,m=805,a=158,s=738}
{x=2903,m=119,a=2344,s=2387}
{x=142,m=1768,a=940,s=881}
{x=301,m=2748,a=739,s=766}
{x=127,m=18,a=141,s=1398}
+255
View File
@@ -0,0 +1,255 @@
package main
import (
"bufio"
_ "embed"
"fmt"
"strings"
aoc "go.sour.is/advent-of-code"
)
// var log = aoc.Log
func main() { aoc.MustResult(aoc.Runner(run)) }
type result struct {
valuePT1 int
valuePT2 uint
}
func (r result) String() string { return fmt.Sprintf("%#v", r) }
func run(scan *bufio.Scanner) (*result, error) {
var workflows = make(map[string][]rule)
var parts []part
for scan.Scan() {
text := strings.TrimSuffix(scan.Text(), "}")
if len(text) == 0 {
continue
}
// Is Part
if p, ok := scanPart(text); ok {
parts = append(parts, p)
continue
}
if name, r, ok := scanRule(text); ok {
workflows[name] = r
}
}
var result result
result.valuePT1 = solveWorkflow(parts, workflows)
result.valuePT2 = solveRanges(workflows)
return &result, nil
}
type part struct {
x, m, a, s int
}
func (p part) String() string {
return fmt.Sprintf("{x:%v m:%v a:%v s:%v}", p.x, p.m, p.a, p.s)
}
func scanPart(text string) (part, bool) {
var p part
// Is Part
if text[0] == '{' {
for _, s := range strings.Split(text[1:], ",") {
a, b, _ := strings.Cut(s, "=")
i := aoc.Atoi(b)
switch a {
case "x":
p.x = i
case "m":
p.m = i
case "a":
p.a = i
case "s":
p.s = i
}
}
return p, true
}
return p, false
}
type rule struct {
match string
op string
value int
queue string
}
func scanRule(text string) (string, []rule, bool) {
name, text, _ := strings.Cut(text, "{")
var r []rule
for _, s := range strings.Split(text, ",") {
if a, b, ok := strings.Cut(s, "<"); ok {
b, c, _ := strings.Cut(b, ":")
r = append(r, rule{
match: a,
op: "<",
value: aoc.Atoi(b),
queue: c,
})
continue
}
if a, b, ok := strings.Cut(s, ">"); ok {
b, c, _ := strings.Cut(b, ":")
r = append(r, rule{
match: a,
op: ">",
value: aoc.Atoi(b),
queue: c,
})
continue
}
// default queue comes last
r = append(r, rule{queue: s})
break
}
return name, r, len(r) > 0
}
func (r rule) Match(p part) bool {
var value int
switch r.match {
case "x":
value = p.x
case "m":
value = p.m
case "a":
value = p.a
case "s":
value = p.s
default:
return true // default to new queue
}
if r.op == ">" && value > r.value {
return true
} else if r.op == "<" && value < r.value {
return true
}
return false // no match
}
func solveWorkflow(parts []part, workflows map[string][]rule) int {
// var rejected []part
var accepted []part
for _, p := range parts {
workflow := "in"
nextStep:
for workflow != "" {
for _, r := range workflows[workflow] {
if !r.Match(p) {
continue
}
workflow = r.queue
if workflow == "A" {
accepted = append(accepted, p)
workflow = ""
break nextStep
}
if workflow == "R" {
// rejected = append(rejected, p)
workflow = ""
break nextStep
}
continue nextStep
}
}
}
sum := 0
for _, p := range accepted {
sum += p.x
sum += p.m
sum += p.a
sum += p.s
}
return sum
}
func solveRanges(workflows map[string][]rule) uint {
pq := aoc.PriorityQueue(func(a, b *queue) bool { return false })
pq.Insert(&queue{
"in",
block{
ranger{1, 4000},
ranger{1, 4000},
ranger{1, 4000},
ranger{1, 4000},
}})
var accepted []block
// var rejected []block
for !pq.IsEmpty() {
current := pq.ExtractMin()
for _, rule := range workflows[current.name] {
next := &queue{name: rule.queue, block: current.block}
switch rule.match {
case "x":
current.x, next.x = split(current.x, rule.value, rule.op == ">")
case "m":
current.m, next.m = split(current.m, rule.value, rule.op == ">")
case "a":
current.a, next.a = split(current.a, rule.value, rule.op == ">")
case "s":
current.s, next.s = split(current.s, rule.value, rule.op == ">")
}
switch next.name {
case "R":
// rejected = append(rejected, next.block)
case "A":
accepted = append(accepted, next.block)
default:
pq.Insert(next)
}
}
}
var sum uint
for _, a := range accepted {
sum += uint((a.x[1] - a.x[0] + 1) * (a.m[1] - a.m[0] + 1) * (a.a[1] - a.a[0] + 1) * (a.s[1] - a.s[0] + 1))
}
return sum
}
type ranger [2]int
type block struct {
x, m, a, s ranger
}
type queue struct {
name string
block
}
func split(a ranger, n int, gt bool) (current ranger, next ranger) {
if gt { // x > N => [0,N] [N++,inf]
return ranger{a[0], n}, ranger{n + 1, a[1]}
}
// x < N => [N,inf] [0,N--]
return ranger{n, a[1]}, ranger{a[0], n - 1}
}
+41
View File
@@ -0,0 +1,41 @@
package main
import (
"bufio"
"bytes"
"testing"
_ "embed"
"github.com/matryer/is"
)
//go:embed example.txt
var example []byte
//go:embed input.txt
var input []byte
func TestExample(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(example))
result, err := run(scan)
is.NoErr(err)
t.Log(result)
is.Equal(result.valuePT1, 19114)
is.Equal(result.valuePT2, uint(167409079868000))
}
func TestSolution(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(input))
result, err := run(scan)
is.NoErr(err)
t.Log(result)
is.Equal(result.valuePT1, 377025)
is.Equal(result.valuePT2, uint(135506683246673))
}
+5
View File
@@ -0,0 +1,5 @@
broadcaster -> a, b, c
%a -> b
%b -> c
%c -> inv
&inv -> a
+5
View File
@@ -0,0 +1,5 @@
broadcaster -> a
%a -> inv, con
&inv -> b
%b -> con
&con -> output
+58
View File
@@ -0,0 +1,58 @@
%vg -> lf, vd
%dr -> kg
%cn -> mv, pt
%rq -> bk, gr
%vp -> lp, bk
%kg -> lv
%lv -> jc, tp
%sj -> rm, vd
%jc -> tp, qr
%km -> tp, dr
%jx -> cn
&vd -> tf, lf, nb, cx, hx, lr
%lp -> jt, bk
%vj -> ps
broadcaster -> km, lr, xh, rf
%dj -> pt, gc
%cg -> vd, hx
&ln -> tg
%fl -> pt, sk
%lm -> tr, bk
%lr -> vd, vg
&pt -> vq, rf, cm, jx, rg
%cx -> gp
%gp -> vd, sj
&db -> tg
%st -> vd
%jt -> bk
%jh -> lm, bk
%xf -> bd, tp
%gc -> cm, pt
&tp -> dr, km, kg, db, vj, qr
%ps -> xf, tp
%rf -> pt, dj
%lf -> nb
%bd -> tp, gg
%dk -> tp, vj
%mn -> jh, bk
&tg -> rx
%ql -> bk, zx
%tr -> bk, vp
%sk -> pt
%nb -> cg
%sb -> vd, cx
%qr -> dk
%xh -> bk, ql
%rg -> sd
%hx -> sb
%sd -> pt, jx
%gr -> bk, mn
%gg -> tp
%zx -> rq
&bk -> xh, ln, zx
%rm -> st, vd
%hq -> fl, pt
&vq -> tg
%cm -> rg
&tf -> tg
%mv -> pt, hq
+282
View File
@@ -0,0 +1,282 @@
package main
import (
"bufio"
_ "embed"
"fmt"
"strings"
aoc "go.sour.is/advent-of-code"
"golang.org/x/exp/maps"
)
// var log = aoc.Log
func main() { aoc.MustResult(aoc.Runner(run)) }
type result struct {
valuePT1 int
valuePT2 int
}
func (r result) String() string { return fmt.Sprintf("%#v", r) }
func run(scan *bufio.Scanner) (*result, error) {
m := &machine{}
receivers := make(map[string][]string)
for scan.Scan() {
text := scan.Text()
name, text, _ := strings.Cut(text, " -> ")
dest := strings.Split(text, ", ")
switch {
case name == "broadcaster":
m.Add(name, &broadcaster{dest: dest})
case strings.HasPrefix(name, "%"):
name = strings.TrimPrefix(name, "%")
m.Add(name, &flipflop{name: name, dest: dest})
case strings.HasPrefix(name, "&"):
name = strings.TrimPrefix(name, "&")
m.Add(name, &conjunction{name: name, dest: dest})
}
for _, d := range dest {
// rx is present so enable pt 2
if d == "rx" {
m.Add("rx", &rx{})
}
receivers[d] = append(receivers[d], name)
}
}
m.setup(receivers)
result := &result{}
for i := 0; i < 10_000; i++ { // need enough presses to find the best LCM values for each conjunction
if i == 1000 {
result.valuePT1 = m.highPulses * m.lowPulses
}
m.Push(i)
}
// rx is present.. perform part 2.
if rx, ok := receivers["rx"]; ok {
tip := m.m[rx[0]].(*conjunction) // panic if missing!
var lvalues []int
for k, v := range tip.pushes {
for i, h := range makeHistory(v) {
if i == 1 && len(h) > 0 && h[0] > 0 {
fmt.Println(tip.name, k, "frequency", h[0])
lvalues = append(lvalues, h[0])
}
}
}
result.valuePT2 = aoc.LCM(lvalues...)
fmt.Println(tip.name, "LCM", result.valuePT2, lvalues)
}
return result, nil
}
type signal bool
const (
LOW signal = false
HIGH signal = true
)
type message struct {
signal
from, to string
}
type machine struct {
m map[string]pulser
queue []message
press int
highPulses int
lowPulses int
}
func (m *machine) Add(name string, p pulser) {
if m.m == nil {
m.m = make(map[string]pulser)
}
p.SetMachine(m)
m.m[name] = p
}
func (m *machine) Send(msgs ...message) {
m.queue = append(m.queue, msgs...)
for _, msg := range msgs {
// fmt.Println(msg)
if msg.signal {
m.highPulses++
} else {
m.lowPulses++
}
}
}
func (m *machine) Push(i int) {
m.press = i
m.Send(generate(LOW, "button", "broadcaster")...)
m.processQueue(i)
}
func (m *machine) processQueue(i int) {
// look for work and process up to the queue length. repeat.
hwm := 0
for hwm < len(m.queue) {
end := len(m.queue)
for ; hwm < end; hwm++ {
msg := m.queue[hwm]
if p, ok := m.m[msg.to]; ok {
// fmt.Println(i, "S:", m.m[msg.from], msg.signal, "R:", p)
p.Pulse(msg)
}
}
hwm = 0
copy(m.queue, m.queue[end:])
m.queue = m.queue[:len(m.queue)-end]
// fmt.Println("")
}
}
func (m *machine) setup(receivers map[string][]string) {
for name, recv := range receivers {
if p, ok := m.m[name]; ok {
if p, ok := p.(interface{ Receive(...string) }); ok {
p.Receive(recv...)
}
}
}
}
type pulser interface {
Pulse(message)
SetMachine(*machine)
}
// IsModule implements the machine registration for each module.
type IsModule struct {
*machine
}
func (p *IsModule) SetMachine(m *machine) { p.machine = m }
type broadcaster struct {
dest []string
IsModule
}
func (b *broadcaster) Pulse(msg message) {
b.Send(generate(msg.signal, "broadcaster", b.dest...)...)
}
type flipflop struct {
name string
state signal
dest []string
IsModule
}
func (b *flipflop) Pulse(msg message) {
if !msg.signal {
b.state = !b.state
b.Send(generate(b.state, b.name, b.dest...)...)
}
}
type conjunction struct {
name string
state map[string]signal
dest []string
pushes map[string][]int
IsModule
}
func (b *conjunction) Receive(names ...string) {
if b.state == nil {
b.state = make(map[string]signal)
b.pushes = make(map[string][]int)
}
for _, name := range names {
b.state[name] = false
b.pushes[name] = []int{}
}
}
func (b *conjunction) Pulse(msg message) {
b.state[msg.from] = msg.signal
if msg.signal {
// collect frequency of pushes to esti,ate rate
b.pushes[msg.from] = append(b.pushes[msg.from], b.press)
}
if all(HIGH, maps.Values(b.state)...) {
b.Send(generate(LOW, b.name, b.dest...)...)
return
}
b.Send(generate(HIGH, b.name, b.dest...)...)
}
type rx struct {
IsModule
}
func (rx *rx) Pulse(msg message) {
if !msg.signal {
panic("pulse received") // will never happen...
}
}
// helper funcs
func all[T comparable](match T, lis ...T) bool {
for _, b := range lis {
if b != match {
return false
}
}
return true
}
func generate(t signal, from string, destinations ...string) []message {
msgs := make([]message, len(destinations))
for i, to := range destinations {
msgs[i] = message{signal: t, from: from, to: to}
}
return msgs
}
// makeHistory from day 9
func makeHistory(in []int) [][]int {
var history [][]int
history = append(history, in)
// for {
var diffs []int
current := history[len(history)-1]
for i := range current[1:] {
diffs = append(diffs, current[i+1]-current[i])
}
history = append(history, diffs)
// if len(diffs) == 0 || aoc.Max(diffs[0], diffs[1:]...) == 0 && aoc.Min(diffs[0], diffs[1:]...) == 0 {
// break
// }
// }
return history
}
+56
View File
@@ -0,0 +1,56 @@
package main
import (
"bufio"
"bytes"
"testing"
_ "embed"
"github.com/matryer/is"
)
//go:embed example1.txt
var example1 []byte
//go:embed example2.txt
var example2 []byte
//go:embed input.txt
var input []byte
func TestExample1(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(example1))
result, err := run(scan)
is.NoErr(err)
t.Log(result)
is.Equal(result.valuePT1, 32000000)
is.Equal(result.valuePT2, 0)
}
func TestExample2(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(example2))
result, err := run(scan)
is.NoErr(err)
t.Log(result)
is.Equal(result.valuePT1, 11687500)
is.Equal(result.valuePT2, 0)
}
func TestSolution(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(input))
result, err := run(scan)
is.NoErr(err)
t.Log(result)
is.Equal(result.valuePT1, 819397964)
is.Equal(result.valuePT2, 252667369442479)
}