From 7e7cb03ef4ec554d25c374ff125c717941286605 Mon Sep 17 00:00:00 2001 From: James Hallam Date: Sun, 10 Dec 2023 10:36:09 +0000 Subject: [PATCH] Day 1-10 --- 1/.python-version | 1 + 1/1-1.py | 25 ++ 1/1-2.py | 78 ++++ 1/1-test.txt | 7 + 1/1.txt | 1000 +++++++++++++++++++++++++++++++++++++++++++++ 10/10-1.py | 56 +++ 10/10-2.py | 78 ++++ 10/10-test.txt | 5 + 10/10.txt | 140 +++++++ 2/2-1.py | 45 ++ 2/2-2.py | 45 ++ 2/2-test.txt | 5 + 2/2.txt | 100 +++++ 3/.python-version | 1 + 3/3-1.py | 92 +++++ 3/3-2.py | 96 +++++ 3/3-test.txt | 10 + 3/3.txt | 140 +++++++ 4/4-1.py | 37 ++ 4/4-2.py | 55 +++ 4/4-test.txt | 6 + 4/4.txt | 201 +++++++++ 5/5-1.py | 68 +++ 5/5-2.py | 119 ++++++ 5/5-test.txt | 33 ++ 5/5.txt | 197 +++++++++ 6/6-1.py | 29 ++ 6/6-2.py | 24 ++ 6/6.txt | 2 + 7/7-1.py | 99 +++++ 7/7-2.py | 144 +++++++ 7/7-test.txt | 5 + 7/7.txt | 1000 +++++++++++++++++++++++++++++++++++++++++++++ 8/8-1.py | 41 ++ 8/8-2.py | 64 +++ 8/8-test.txt | 9 + 8/8.txt | 704 +++++++++++++++++++++++++++++++ 9/9-1.py | 58 +++ 9/9-2.py | 58 +++ 9/9-test.txt | 3 + 9/9.txt | 200 +++++++++ 41 files changed, 5080 insertions(+) create mode 100644 1/.python-version create mode 100644 1/1-1.py create mode 100644 1/1-2.py create mode 100644 1/1-test.txt create mode 100644 1/1.txt create mode 100644 10/10-1.py create mode 100644 10/10-2.py create mode 100644 10/10-test.txt create mode 100644 10/10.txt create mode 100644 2/2-1.py create mode 100644 2/2-2.py create mode 100644 2/2-test.txt create mode 100644 2/2.txt create mode 100644 3/.python-version create mode 100644 3/3-1.py create mode 100644 3/3-2.py create mode 100644 3/3-test.txt create mode 100644 3/3.txt create mode 100644 4/4-1.py create mode 100644 4/4-2.py create mode 100644 4/4-test.txt create mode 100644 4/4.txt create mode 100644 5/5-1.py create mode 100644 5/5-2.py create mode 100644 5/5-test.txt create mode 100644 5/5.txt create mode 100644 6/6-1.py create mode 100644 6/6-2.py create mode 100644 6/6.txt create mode 100644 7/7-1.py create mode 100644 7/7-2.py create mode 100644 7/7-test.txt create mode 100644 7/7.txt create mode 100644 8/8-1.py create mode 100644 8/8-2.py create mode 100644 8/8-test.txt create mode 100644 8/8.txt create mode 100644 9/9-1.py create mode 100644 9/9-2.py create mode 100644 9/9-test.txt create mode 100644 9/9.txt diff --git a/1/.python-version b/1/.python-version new file mode 100644 index 0000000..11aaa06 --- /dev/null +++ b/1/.python-version @@ -0,0 +1 @@ +3.9.5 diff --git a/1/1-1.py b/1/1-1.py new file mode 100644 index 0000000..edad076 --- /dev/null +++ b/1/1-1.py @@ -0,0 +1,25 @@ +import re + + +def get_alpha_regex(): + return re.compile("[a-zA-Z]") + + +def get_input(): + regex = get_alpha_regex() + with open("one.txt", "r") as f: + return [regex.sub("", l) for l in f.read().splitlines()] + + +def get_first_and_last(string): + return int(string[0] + string[-1]) + + +def main(): + input = get_input() + print(sum(get_first_and_last(i) for i in input)) + + +main() + +# 57346 diff --git a/1/1-2.py b/1/1-2.py new file mode 100644 index 0000000..d440cc2 --- /dev/null +++ b/1/1-2.py @@ -0,0 +1,78 @@ +import re + +NUMS = { + "one": 1, + "two": 2, + "three": 3, + "four": 4, + "five": 5, + "six": 6, + "seven": 7, + "eight": 8, + "nine": 9, +} + + +def get_alpha_regex(): + return re.compile("[a-zA-Z]") + + +def get_input(): + with open("one.txt", "r") as f: + return f.read().splitlines() + + +def sub_nums(input_list): + inp = [] + regex = get_alpha_regex() + for i in input_list: + i = replace_first_and_last(i) + i = regex.sub("", i) + inp.append(i) + return inp + + +def get_first_or_last(positions, pos): + func = max if pos == "last" else min + pos = func(positions.keys()) + return pos, positions[pos] + + +def replace_(string, pos, num): + string = list(string) + string[pos] = str(num) + string = "".join(string) + return string + + +def replace_first_and_last(string): + num_string_positions = { + string.find(i): i for i in NUMS.keys() if string.find(i) != -1 + } + r_num_string_positions = { + string.rfind(i): i for i in NUMS.keys() if string.rfind(i) != -1 + } + if not num_string_positions or not r_num_string_positions: + return string + + first_pos, first_num = get_first_or_last(num_string_positions, "first") + last_pos, last_num = get_first_or_last(r_num_string_positions, "last") + string = replace_(string, first_pos, NUMS[first_num]) + string = replace_(string, last_pos, NUMS[last_num]) + + return string + + +def get_first_and_last(string): + return int(string[0] + string[-1]) + + +def main(): + input = get_input() + input_list = sub_nums(input) + print(sum(get_first_and_last(i) for i in input_list)) + + +main() + +# 57345 diff --git a/1/1-test.txt b/1/1-test.txt new file mode 100644 index 0000000..4316a6b --- /dev/null +++ b/1/1-test.txt @@ -0,0 +1,7 @@ +two1nine +eightwothree +abcone2threexyz +xtwone3four +4nineeightseven2 +zoneight234 +7pqrstsixteen \ No newline at end of file diff --git a/1/1.txt b/1/1.txt new file mode 100644 index 0000000..f7f14b0 --- /dev/null +++ b/1/1.txt @@ -0,0 +1,1000 @@ +two65eightbkgqcsn91qxkfvg +neightwompstbkqv1fourfthdcfgtrkqzgrbfrczxbdn +43qsrrlxxq +898dbpjmdqjgtrvdvlxxdnvlfhncdzrt +jninedsrvftdlcg4hhztwofourskrjhcjvthree +five562 +bpnjmtmeightninesix2391 +rftqshh47n +ctpkqsdqz97zqptzjlfbtwo +sjtwonesix6cqbv4 +9zclhrrssvzpcfpqlshfsxs +ninemcctrb5glhmctwol7 +eight5fourtwotwo +18frdsvjxdpxf8dxsevenm +five55foureight +dbqeightwo4sxzsix +ftjjqbgphtmhthreesix1six +8sczkklgr5ncxkhkq +126dzbvg6two4oneightntd +fiveqcplndmmcsixksmmpdqgttwosixnine7eight +eightseven5threesevennine +nmxmcvrzbcppktgbznz2 +five83 +57rqxmvf12 +4nklcvfsix1jvsvxh8nine +tpjppv6seven4sixsevenvnhcxonefjztthdcv +dfkcrcfxkmxccpf7sixkzlgf +ninetwo6hfg +9sfiveffxqthreeqlvhbvrpbd +gtcmqsheightthree51eight +lhszhqvtn12three8xvfglffivekc +hntwone2cmgppck5oneonesevenone3three +8414onehlxjfqghrklv +cdtlrnine2onexfspkgltjrbone8 +tsjvxqljbfivefive11fourfour1st +dhhrftncnttrqz21fbdkkcdbndmdrp +jsfcqhzstnxxlchnxlztwonine5 +twothree2nhjzlhqdlgnplkjts7 +7zndkjxcp4xvqmqlgrhg +446sixqtk5fiveoneeight +3hdqtn2kjdkbzxx +onethree8ninelggjk38xt +2bdnkxoneeightonetskninefive +xcxfqtnpnmdmtrfivefour1seven +1cf +onefive5 +t5dnseventhreehbvkqzhbbttvd +49kdxj +s743dflzcsfninefour8 +eighteightfive7 +2zjsxntjfbkc15vtfkltb7 +knkmdgggk95two2 +dvjdztx6kfzzsscfcj6zz +xvcnqppc4five7threethreeckhtmfeight +4eightthree9onexmrhrfzjjjmfm94 +threebr7 +four188nine856 +szseven9269 +rppvmpprsgqbvbskg8fivedgpv5 +992one +fxthfh9twothree +jldmzlktzbhlsrndvn398five +vdzhddpsix6sixsixvbqmf8mrgnqxsxvxvdcdzmkc +7tv9 +37seventwofour +seven1six723 +nxjlgr64tjlqzphzjdvgb1nd +zmxldpjdsixvzcmrxxzl6 +91cgn9eightzxdzfmj +skhtxclf2ninemqct +foursixn8two7srvbbdldpbtwo +two5gpnnhtseven +onepqmzphpgfive2three +5vrgsfbj +5xmqhfbdt965 +263nzqjrklqkgtcgjcnprgtfj +78qrpdzmczxj7fourone2 +6threed +eight2twogr +96five +2ndkfivetwo6 +41fourckqxpdxdctnqmljkrl +68fzpjjvfhjv4fourhsvqtwo +ffqnvbxdzxhsxg9sevenkhpmnflbgfqsvfzfmxnlfcq +eight1six38one8g +5xhdtqshnc9foureightwog +two9llmcgxhjdghbv +9twoeightsix +f4qmsfgvzxfvxgq33twocmfnd +vqq8two8nhsqpgqnzrsixsix +dbxfbl98nllgpsix7 +svzgxfspxjfbcvonefour4 +eightonefour3nine8 +tqhgbkzmhseven656tczxkfkztwo +pckdctnzvxdgz4 +5pg +7two7vqtqxmddlbhppmpx8kldcgcfeight +gdbmfmppzl96452 +rpnmhfzclkmftsjkpone4sixmjhbjprx +16ljkbvbbc77sixvjlcpdqkvkcrfqslfzvtrqf +4threetwonedrd +seven5mqgztxfqdfdssbc +6eightsixpb +7jqktjqrthoneeightthreeqpssplvh669 +fivekjfktwo21jgtjdxeightseven +cjfvqzvtsstsvqsdgzlcrqnmmkgtvlclhfddeight6 +8247819snr +684 +threedqsvxzfmgrbrtjmjtzjeight57 +1three1233tvbpqrlrpz +bxlljzgmc4twothreenldkshgt +eight9dmzftbzmsgmxvhx7khsgvgmbgg +threehbvlqone9sevenxbccbppjxj +jthreesixqlxlvtwo8 +cg5nineonejtmpthkqncdmcrjztml +six69sixone5fourvhnzkxqrkm2 +mkpqfbjrninemvngbxl1nine5seven +qgxhthreetphvh4fh +four84 +8cdhf9fivexqsxljf +eighthmfq788eight +sevenktvsvvxj8fourgdbnpnthreethreenine1 +zlcmzfsxdvthree6 +mscdeight3 +lhzcxzthree8seven87 +rnrldrcponeqfdlxgz1lpxtf23sixkdqz +6fiveeightsixthreefour +onetwo1nine5gsvbzlsfrp4 +fivefivesix82qhdhnxbgmbttgdqq92 +jk886lfour +kcqmt6qk7gcdzzzzdljdmh3nineshcfnbnnd +sevenfour2krdvsfour +kbvlbhfbjqnr9three +two17 +dlvndnhdbjgtp57 +pqvxgonesix8k72pfmsjl +eight7xq3 +xgzxgtfqvsvvtfr23fzkvphdjmm +8hbkggrpxq8two3fivefour8six +tcxntnppqtbflnzfour6zzgrpvxjtf +2sevenninefive5 +sdvxrpt5lhzmkknseven2one9 +7pcpmgghrbt1zpllhshcsnine +cf8 +mfxnmj2ninesix58eight58 +8hfnnclmmsg64scdrtdkfivetwo +9four1sixj1three +7nrcxngrxxsixmccsb4rhztxmklmccpttwo +jgtdvpseven7two59 +369seven +onegdlthd9one8sixseventhree +6eight9seven +94five +6one282three9one +7rgxznfbf +zrtoneight9sfnsixninesevenzvqdxqjrcdm +five6sixkxksxone3six +qjqrjkjvplkxqvthree58ktgq +7kkc +hr54pmdtnpvzrlskpqrrqhbrnzz +99sixfgnfour389one +ltteightwothreefourfivenine7 +kzpzschjsptdpd6fiveninemxfxlkbmfl +eight7dqpvvplkjxgrxxtvt +41nine +61 +5qfneight7bhhnine8eightoneightfrx +34cjbcqzeighttwoqfdtqtqbl1 +twofivehbxftnsixhtffgqksdseven6 +84mnkvppxk18 +62four6rsph +8fourctcnnzfz +5jngcrllpnonefive +grmspdlkv42tdzctls +67sixeight1 +ninetwo52 +9jdvzhzflgxmsixzklv4cldfivetdmhrlm +eight7twoghldrbzhleightjs +ninenp8 +jxqjeight48qljhkkbfctonethreejfqlr +z9lxzgzkbmr7jtgpczmvblfour1 +545two +56tkxjhndzmtwofour +1ninesixpxxxlfnfn +6threesix9twojrmtl4 +6rjzjlxh5tdfkbjzvm +g8one7ccsix +4jxhxrgrhxv6threegkdsgvzxpzzrjclzrn5 +qhdjbsh5 +8mmngf4lpngqnbtxz +zstqrl5sevengcndbztdcr +mmdsseveneightfdbthreezbqkdbb3 +kkntgp94937 +2zrzntn8three +klklfnxcnmczrjlprktwo55 +7ninecqjtkjsdkqgqvcxtcone6 +bgjjheight5txcsjbvv1 +rqbk4 +soneight2qxbfdkdn51ttfourfiveninesix +czxhmh73llnlspseven8hfqzdpdqmg +26zmphsljkkddzbkninesixnine7 +45six +9f +6five6nine2sevenzzzmvzlh +hfnfour8blpsixvhdz26twotwoneft +87twofive +6one92six34vfive +nine82nine5dbmjmsixseven2 +6rmgq8eightqxrj3tkljktsjxz +onefour49sevenfour5 +sevenftckbsfivegfbgmpcvvvtqdhmbfive8 +hqrdprfhxpfjnlqvx2fivethree9onevxbqtpg6 +clz76eight +seven6fourjvxzrfivethree7cgtvmsfzb +4sixseven7jktrblrk7five +tqlgpnp682qnhpspbfm +mtfive4 +6ninexkds1slbdnlfp66nine +9sevencdqf +jcqccfzmgffrxjcvhpzonerlzkpvk71four38 +fourtwofourfivetjzpqmzvmmcseven3 +zqoneight9 +4twotwo +eightgfqzzcs8eightkkklhsvkmsseven +twosix4 +eightfkthjb83 +8gmqlpdbftwo15sevenjllkpnp +378onefourlqcq +rxlnmcphmzckgz9bpzonezcjcgvdteight +sevenfive2rmzbpmfvplxdvvldnghmfive +tvbctwo1twofoursevenkjbjd +veightbkkp9vntmeightjdrc +ltdmmnlsjzzxqtvnghxjnvg48bqvvvcj +seven4frssnmkjhf +nine975 +zcpdghhlhrvcmxftoneeight4 +rgkxgfkx6cqdxjhdqdf2eight2vzkbbpklqnine +one6six5 +six5seveneight +23krkcf +sdpthreetwo3 +eight28 +3twomdpsvbpvhthreegfrdfqtnttk +9sixsixcqbdd94bzxmjn +6fbbbrvzkzbhhlgthree +hgrnflhgqhd6628three +58tfxks +rfcmcfive51nine +3eight9 +6threecktkhlvcdkmcxdflsdrcfmkpxrmq +fourssvlkcsninesix38fourkfrgbdxlhx +mbhqsceightnine5bzxfnrzdgcvsg +gfjlsvmkfourhf9qfpxmlqkninecrbnjrfpninejdntmjglk +fiveonesix58onefourdnl +hkd33lgcjrpf6four +ftsbbgmv3fourrmctcsxrfv +rkmgfour58841 +gmgskgrfhc54cvpgkkhdhfseventhreefour +three9onegjdmsfthreelrpqfj1hdmbd5 +mkjbxcc9375 +onejxpczj2twofive5one7 +vhclzbp77 +8onesevenseven1 +3seventhfivefiveseven +bpnrkxlnxrq4dzjljgjg2five4three +fivekpxonegm76jqtjrlrns +pmmqkgdmljhdvsixsix6gdrrx +6rzjmrhlr +sixqnblcchkfnstwo9two4xdjns +twolmffnfmdfptjcdtwogqzhtbvph18six +5threefivefive2czfcvqrjcmlcctgninefour +9cvntxx +4sevengzlzjnntxz9ghcpcgvbm9three +2qcck3one +sixqxqnjxk6ls1rdtxkb31 +8onefiveeightljp2 +six7one85ptxktrlbtfdtz +ltgnfzcjblvrdclkonesqgbgplqm3threeeighttwo +1xmnr +pcxkjdtcmnineeight1rl8four5eightwoqvc +twovlhtdxctsnsixfourvsixsqfhbjzklsix2 +6hcdhsgzv +1six8qjdsfbnlzj93gpj +twoxfktts2xmjvcxkjjf +gkgqmdxcfkb6fjjzfsqbhnzxjzsvzkfv +6oneonefourxrnpf19 +qqgsckgrrh5svt2vsd6 +sixtns37 +jqgfcbrd7eightsixrgkqtkf +4bkfpntttsjonemhtcgsnzvjxcftzssdlntlv7 +9jvjqzgrzxslffdfhmcfournhqfckgmfnone +dgeightwothree2zhzfb2 +tldpeight77mh88two +49fiveeightfiveseven4 +three3rpbrvnp2rgnppsctpcqqfd +1one2sixfleightwokhz +7cnnnp6lzcjxfsqbbfqgvnqhklcktrvrlmfszmqchfnine +one9sdqnzhhnine5pkqthqsskrfourgkxbqpzkrxpkrvnk +gbhvg145twohnqfqnj2mxg9 +2sevenoneqfzbfqpcfour +pgcxrr3qhvngreight3four7 +vvbfrnqvgmq3eight3sevenllllfn +twonineqtklzqnd7fourjpqthree +82sixtwonez +nfmjv8pgqtqnkpmb83 +seventwontjbdcs8mthreeqdgfg1 +2fiveqeight +3ninexqt6fourfourone +9ninesevenzmhskrfour2qpqzhqpbgrfiveeight +twofxmpt7fvxkqbht +xmtgrngscqninesix5twotwo7 +onetwo8nvhckltwo +686one1seven +986l +4ninepxhzxmhgsixjncqfhqlnb +5tkvsnpp +njfqd5eighthgzsixnhxgt +seven3seven8seven +zceightsixninetwo9vxmfscp +threemgb77nineg1vzlbvhgrms +5onelfpdchkrqpshsixtwofiveseven +6zmjpkzxttksevenpkbdvksphjseven +smeightwo993 +one987cckfncdctz15sevenkdtrzkkmdz +8rhbpeightseventhree9 +nrnxccfzhrrxhsjhlthreethreenk1nine73 +nineone5threekxv2 +fivertwotwonnrlhqzfpbntdjhv5k +ppqtrhfkdbpkflpnlx85nddjxdctf4fx +lmtwone472 +3vcpbonejmtssvkn3one +8twoninembzfkjdtvdnd1three +eightsixzrrv35hmcpmgjkchfourrg +h87lhbgmzg48twoonenine +six1289src +5fiveqrmscnnqn21 +ninefourfiveninexlcpxt1 +onesix181onesixjds7 +4zvqzgvcd9dzhjzkcgflnhhfive +6threefive7dlvgpzh +3xtvthree +one3cjckmone1six +sixsdtgjtxhsh4qmkqgsp +bznsevenfive6seven6eight7 +7ninetwo4scmttkmkmhjgz1 +32fiveffxpvvfive +8twotwosglcjkxtfour +8ninetwo6fivetwo +ninevjfqnbqshgcnznb2two4 +1btbsqfgxz7 +37skthonehgnine +qprsldzcbzcskqpgpnvjt4fivegpqllvq52 +qnqpzpkmfj5ninejsix6bpcn2 +28jmvbtljsldltwo68fssrjvqtwonev +fourthreefivepxqrrjm7threezjsdhfs +7kmhsdlrsqlonegbr7 +onesixfourbdcgeight53lzpgjlsz +qgpgg377 +five17 +zpmslnjkqc3 +fourvmqhvhdgseven7jtpttjlzvsbfkdrj +bdgcfcsevenfive8527 +1ninesevennine +4sixfour4nh7sixnlkdk +shjz737 +7onecrhjhbqqnn2sixqqgseven +6six1kxpczbxoneone +512vnxncqgtsevenfivesnc +sevenrrdrzlht5 +6ltsix +87sixfourgjh +ngtzsrpxsfpmjzk2 +onefour462ql5mcfqrglrp +l88oneninetbh5nine2 +scgzzmeightqrltnkbjxrglbvsrpd2 +7krheightjlzzmthdrqsnkdqqlkone2 +three4fivexn2nine +sixseven8one6 +seven46five8 +bmbfd8 +one99xgk2 +fivetxfjpmnhdl7 +gktgcbronefiver2d +444six6 +dpdbxrtnnlsfkh694xnqhszfbvcc2 +53mznqnine4dpkkx82 +6sixldcgszrhhvrbhdnc +djfpppftbx6three9ncfour5two +eightljcvn565fivethreegsjbfsjsc +grdtdczfm5krxslvfk +1threekpnhkjbgch2 +four37 +ctlxgcgzj57gmninethree75three +lffrgk4 +one256jxbthjxhtj989kfqnrdhhxz +three3ddsxpt1lgkzlpxfiveninebsnbntpnnine +qxskrjjvtp1chgksksxksg79 +8zjvmfkpnrc32twotqdc6vshzv +8hgdrds54zk +twokr6vkbflkfrcjxvmninenineeight +grjxdtngmrthreerqjvmxbrdvlmqninegslrzfgmcpdhmg8 +5tkdszfcjdm +7jbzvrdprgdx7npn +ctwoneqcmffptjzpone3brdtb4bjnzqx +eight4tjfvrvlcfgdtk61fouroneightjvf +eightsix9four7 +827 +8pgcksninemrt +bggbhgh8 +fiveqsqvlsxc9jnhfdtqvsq71zvlh2 +3z1mrzxfdkqsixseven +kbrtclpktwo6btgpxnbrz8 +5ninefour6three +8ninefxfivekrkklfvnr6 +ftkndksixznvhxrdmj414seven +fourdjjxhb3 +four82 +277leightsixseven91 +4czktzmzctsdqgpqthreekjfm4 +78onezmcxjbrheightfourtltlrnjpg +zvclmdhrrbmslgfmrgtvzpnvqmth1one281 +dnkf3seventwo +sdtpcdc5 +rtn6vfmtvg +gkeightworqtjvmc3fqpzqsevenfivecxff +four49gxrkmfdl5three +9nine3326bcxnclqgsgbng +mjrvfrz7frq2sixfour +twosix3 +j7 +four73zfrdrns +st14pjnfgqpj +dlceightwo53dcjzxft9 +333mzmtlrhkjgsixcjzdrshhpv +vp6stsvtntboneseventwokmdvgthnine +92v2thc +seveneightfivetwofour6 +three76jfx3ninekndxqschpfive +fivefxgbhfour58n +nineninezgn6kbblgf +rjvrx4four71one51 +4mvmdqjfxhzpddseven7nine76 +86mbxjvs +3twosevenfiveh8fiveseven +54bczbfjq9cseven5 +nvghzbcjxn57nineldlklgb5fdkqvbzftl +97mtvstpkrzkrg46four +tp8 +four8sixphlcct5 +2pkccvfmp +ninevmvlmvqqnone69foureight9 +four2xlqrmlp48vdzsevenhtrcjbpc +ffvhhtgz78threeone +bfjnjxr342555 +4czvdggxlbzcthreerjfshqhmj7 +6three24khccsqcnddq +659 +five3lxchdtfvlnjn9mcs9jlsvzbcgvk +mfnonefivetwon2mrbsc +hvxv9three5 +75ninektwoseventhreefour +zvjrcxchzrz7seven +jhmbsknfm5498qtwo +scjnfvnld72gvtzd +8fivesixtwo +tdjkrtrdj7twoneg +8one3five +2nncbsevenseven +fourtfqfnsixfourtwo9threerblgths +twoninebgxnphjsixseven4 +threesevenxjgbpl321 +fourtwopjzfourqvnknmmdlsrhnkonefour1 +six9ninevkxnpmnpjrmnptwo +eightseven4fivethree8 +nine6nineonezdbrz621 +4fivezhvzlvrblm3mgzhf56 +dfkdbtreightfhrp1 +oneeightonecpnkkhpcpqt73 +nine9fdgbzxhvbslzlhkpone78five +two74 +5three36rl7vnk6one +onetj152twoqtjgvsnjpd +6ninefive +fourszvmjknhhvmznine73eightklhbbnrljk4 +89eightjcdftnine +gn7oneeightzcshvfttpnvxrxjdc +four78five44 +tnqmjzd2fivehqpkrkdrkqr +eight6eightfhbqqsqqs1twolhbfsjxfxj +4two4xhppfx +gnfqgghz4xnlcxqpccktwofivextpskbcnn7six +seven133bpthreeone5x +3five55four +6pgmbbbnmrrpdqzjkbsrpfhstwo +556vfzmcbxsqg8 +59fiveflckfmthdd3nine +2nine5six2twosevenqrdp +qsghpdqfivethreefive8 +ninesevennine1 +onevkqcgdc6 +bcdspxmhzsqfhhlghmqh5794blxm +8eight2twomd9gvtd7 +gfjxcczktc8 +ccpgbl3zqtmqjztwox +jvkvvklb5nine2dfsmkljl4hpjbhlpdmt +3rxzrnkdrnltzd +fivetwoone6 +zcsf5rnxgckhktworqsqngvk8xdgtfcdseven9 +rsbfcsix3jbqnqeightsixonelrhfhlldhhfg +njpnzndmdfzkpdseven5rvcsxheightthree +ninethree6zplfz1seven +7dknfz +ninebkhfqdsrone2two5six4 +1x +mhrzpkcmf5three +9vzrqrmtzqnkdhrhv +g3 +sixthreefourtwonln9fourvqgbbht +vfvzttx86db +cpcrxvp5eightfourseven5fivetqnine +7fsfmgbntxrmjmpmmkcnbx +sevenrkmm6threeseven +fivefivebgdssdxqfnthreethreelvln5eight +vxrxtzmtmtssjsevenfourmnhtzdthree4fivesrpcrb +t8fxpzbnfivesix6fhrcklhvfive +6threetzjvzkbdp +gflz6nine5 +ldnn7qjz1lcgsmvjpbtplztmvseven3 +threefourtwoeightdfpbjbggx3m +4nineonenine6kkzsmfdrl +lmmpsdmnnsrgkbzcdfive5 +4onethreejcrgddkxthree +9twonexr +pvjdlxv1xlgkdsixsixone1four +fourtwofivenine2 +xl8 +tfmfive7 +9q8svkhxgvbmhseven +fournmtqnnphzckqsnpqddlvgff1ninetfhdknbnl +6fivetwo59gxbzxrkdvhfive3 +ndbrshkmc9 +4fourseven +lkdcxdkkxthq5 +ftwo2pgpljh11fpbgl2 +hhjrfcchcjlhninexmv6 +9bpzdrrfqcs7eightwob +8eightfive +57nnbqt5eightzvfblxstz9scfnnv +92three7xkkdskhvseven +ghlbrzxhlkh63three +5nine7fourtwo78 +3dvxdphhxgrbfrlq4qxzslfng8rrfjnpjdnxc +brq68eightoneightvrx +four7twooneeighttwo +onenine2nineninesixfive +slltwone8kngkhvgkkphrmgprnm9 +twonhsxggcslm3zqmsixfive +pzgpspbfivetwosix9btjbdfbdeightj +fivezpdk34ninephlzvddrmzvkztwo +sevenfour223qvxrdrvqgkqpctbrzeightqtxjnhgz +7373sevenrrsfzsfour +rttwovggcqtzx2993 +twonineonegpcpdqrpd284 +2fourfrzkbkhninegseven83one +1pjqvdntbseventhree +eight19tszhr +hngn5fqfcfxrnfs +6xsxcgkdstncdl19c1two +cvrdkrqrmssevenfivecjblqxjbzqtvkqhmcm18 +zqtblgtqttwo9gmkcfkdcgbq83 +bdrmrsrdfponeeight3fvvsrfbshbzbqztmhbbzpkxxnb9eight +4trjldtsjdc8vkgvseven +37fourfive9three7nine +fourseveneighteight7fiveonexxmmjzlbhk +fivetwothree8seveneighttwo5nine +mqmeightwo3 +8cjkdcdk +6cjnjht51knzzcsqkvtwo +5dshlzzxxggninesix1two +9seven1eightonef7 +two75sixfivesixhthreethree +1fntfzqrjcxlfprglcsix7 +4lgcgkseven +r15two +eightdsxsnqgfnbntvnqtsfpr1 +sddbms6nine6 +7tpdrfpbd +flmztqone7sixzdqlxhfiveoneone +jzpvdcvnzmmgzhxlcsevennine2 +nineseven3cqktfscgtf +rdhrxhfn8hbhctkkxz3 +7cjzxmlvq48kvmxgmcd +twoeightlqpfv5fourdfv77 +8sixfivegnsevenlgdkfcfznine +fk8hcndpfflmsbjlseven +1onesscdrlztwoonezfm +n8xdcmfxvvgm1b +psix3 +gmpnine5ninekfmmhbrnq +713six +gqplptccrthreethree3jdgbtx +1onergncpbv +5fivetwo7two6nine +4sixqrrtqjnv7 +onetwo7364fqrjghsbzp +five7shstn +5sixkcspphnsxndzfdghh +jhxpxxpfz4sfkpgeight9ninedclxgv3 +fourqfzqsgpt4ljtrrxn2 +8seveneight6fhnf9onethree +bjgdq8two8m6bnnbdtqvlf +eightgjrvdjhz6 +rdkvkqhfourdpn7tkjbflm7 +1ptthreeeightonetwogbh95 +92four96 +2sevenpkfgj75 +lpfnmmp2eightmbrzxdskx7ninetwo +gjmxfive7qqrbsr +qxprvlrhxlj1threethreevrvvc2eighttwo +vdqmnccqsplkpmspqcggvllsxvh1 +fvdhvmgzseven2fnrrslbdtwo6 +fivefive9smbxkkp192 +vbsdstvbknldcgkzkgqjln7 +mklnltnfsixphfgfzseven8fivenine +jbshrqn2three844 +6nspp1one7three5 +six3four571 +nqjssphmsbhbfhp822one +9kffmtffiveeight3 +sbfbphdgjh4sixbfcrzmnlhxcsksctb5tdtm +7bfzk7mvrglxjfour2tzrkz4 +onethree36 +zdtcr45four2tpgqsix +sevenmqgjhcjpnine63zllrtnm1 +jnccdbplkfq6oneightd +one8flhbdbl93 +rrmd34 +six1lkthggkbtwo5onesixthree +eightl294eightlb +eightzngvqdmfgvfvhlrxnfourcfggfgp9 +dkmzgc73l +839fourone5 +xfklsdj6three22 +soneight6cvgndhbtttlbpqktwo +5nine1four471pnnvsix +zqrfmnpgzkqrshrpktfbndvfmrcjhfqlhcbn9rrffzngrhnthreedbgcm +xcmt2fournine +seventfgnkd87sixthree +77fktkx +3mdzzsvdmltl7jeightfivenine +seven988five +9975 +eight4sbc5eight9 +mxj53bsh8fourzv4 +817 +99ninevnonecfcbsjgnrzrdffll +twofftvkshm4 +one221jjbtlgdtt +68sevenfive2lhrblxpkdq8nine3 +39cjrgljlvxdfivenhptwoccjbhtnmqreighteight +sixfoursix74fzdtnx92 +rhpktnqsvqxn51 +35nine1 +43gqzppsnktxm2 +5five566dtbppfp +nine7one23sixsix +93fourbqmsspdhr +cm5qcfxfcsg3qcvstwozhsnspg +227two +qfrtvpnh8 +one4jzmmmjjk +4vxvngmtjxldcn2 +bjgb2kvrlshdvfj1hnpfbtxkp +7eightpzmxcmcnsmtkxjt +hzhjbddqj961zkxgmhxdthreetwo3 +7fivetwo5dvpplrmxqrzxtwofive +717mfszgrbt +chqhsqt7hcmbjqstfive +threesevenkknvhhtt7399k +7n +6twohzlngv +eightthreekkgt9mqzvkql9txh4 +8fcsndmltseven +twodjscb5sxfourtwod +5ssbz +onedvpnnfvqxvfour1jggdsxfdgrqfrgvssix +sevenk94mthklgmsxhxdjxslvfive +bjqshcpk26 +nine7sixzx7 +9threexsfqxqhvvbsjzrbmxcfssix +geightwonineqp7twoeight79 +8b8dllrmvgnmhshvkhm +7grpghbfourlsixthree7 +1xzrhgxsh7threetrqqvsl1hcmmk +fivetwoppnseven9sltkmcsntzldvqzfour +6flgcsj +nine44onedninesix7 +hrlfdsmjqtbpfpxljhjrrxrrdnrlzf34eight +sevenrzgsvq6 +39sixjshdjrfmstwo2tzmzhgggdqgflp +tcrvlffrmqrcx6bqbvhlcbgtwo351 +9281qzt35jmtpjgqq +qpdtvpmfbqrmthreetvlsr2fzbzkthreerhqvqbcnj +two3fgrnggpcl +7onexrnvssfjczlmkzgprnone2khmhntg +6lzggxthreefour26tnxfcqbl37 +8rgnffphzgponejfive +bmpsevennhrkphhbfz8nine +5mkbbjdcqninenine9 +zrfvhcreightone9five +19chrfkm6gqlfcfhmslmcmr +dzrt197twonine +vmrlbm5five +pthree3six417frljvddzjtgdvmmh +fournine7lmzdrxvjsixlmfsgtwonesn +ngt8fdcsgmbbvrone3 +3hfhppzdfp +sevenqvrlkpgxnqfivexnzpxcnine99 +38oneightg +4fivezjzsstlfxp1pdjmmnvjvtthree +xfngrdrfseven5rcsqtflhsqz +three3jtndtxpx +eightfour8xxtkjsjlrsmg6 +1qnjttkhzltvj2xtlts6lqlxrf +eight817two52sixgmhsrnlzm +fourgxbk81 +eight6eight +4pllfiveeightsixonekhxvhvx1 +41twothree +9pcdldnine +vkkncnrblg2x36 +sevenzrqsix3 +ccpnk5threeeight1 +rj69 +ninedzgnsvrjbg4eight +nine3onesevenxvpmmt5eight +drcbrg9eighttvdqgrchlqnineseven +five6two3bgzgtvxmj8 +sixfive9 +7txddsmg2hzhz1fourkkthree1 +3pvgxxxmpt5eighttwocnvnine +cdnbkl3 +twosix9sixninevftwo1 +392 +427twozqp79sixtwo +2jpkrm16 +threelbspfkeighthxmmcpprmeightthree3 +bvtfzpr36nine +qdzfdzbvnk47twofive4two5 +ninethreedfzrphlvkpbvtvmzjxgmrh6five +cjnq7gnpnpt +six8nine2 +chsdgnlrzqnddfjthreebhfdvlgfpfshkeightseven6 +nmlqvslhk6fourninexpzlf9pfnbrnhphxzxh +eight9nfgtsjxnteight8pfpfctjxxbffxsmjtwonegcd +nine8m1 +9sixseven +218 +6brzzmkxsm +ftxrrhzz1five98kninepc +3kkmbvvvtwoksspmqksevenoneplone +eight3sevenfour7two8md4 +jvtk22472 +threetmpkcsjsixfour6twoseven4 +kclmjgdplc23ninekmqbrkxrkdhsnnhmthreecfive +xkzbzkszml641one54phdfghtbdd +3442four8vr7 +6lthree +lfrlxpczfiveseven2 +fhjjlb1fiveninempnvlzbkhsvqf6 +fiveone66onesix6dtwo +91bgqfz1four8 +7two8sevencvfjhqmdtfone +889two3db36 +sevenhlljx5qoneeightfivemvsmbzdbznine +one45sixft6eight6rbf +gdsevenknlfourkmzlpvv3flsfvnmfseveneight +3qbs622fivemzqpxdfkssix +275fr2eightoneone +lktbgbhngfbrzdponerqstslfourhjxgmv1qcj +two9fivelsxpd2six +9eightnine +qmteightwosixseventznkgmnhjvdfxvqv8 +ninenine9jdgndgnfour3pgb4gdpjnt +three3sevenzcbllclmseven1threeeight +xzbkxnttninexsj2 +ngrgdonefive94fivehgnt7 +3nineqnvhsninetfeight22eightwoqf +phrzskrhbd9five8nine +dqqnfive1 +hsjrhjvmlqxltxxgqx6qbfsnrhgbkl +four5hrpnq +vfsqhhgb6eightgtjlvnxnqsrjn3pg +71fiveknrgx7 +dpeightdbvpnfour1 +two59blldsls85 +three22nfvmtd77mbjnvxqbdxkxvp +five56five22 +jtqeighttnkzkbbtwoninepzxphtlbzsv8 +1zhktrqsklfivegxdhrqt +three422 +8sqlrqn9 +zh8 +1fourone8 +94kkqb9four9 +6sixkbvxf +rbvxqgztwopcbhhgzthl6xsix1qjrvfive +two29one594brhbpnine +7fivebczzcfeightfour +bxqrdcx7sixthree +xjqchs31twoeightthreesevennine +83five8qvnrcllfhddhltsevenone +gsjjxtvtck7six +cxsbtkzcgjbgninehhmzzfnine3bpzg7 +six7threedbhtvcvjtmeightz +pdfmjbqgvkr5t +cqbkrkfivexkmvgqfbfsg5zmfhbqkdcq1 +6ptrseven65tvbjkqlhjhjq26oneighthsp +39eighttwoninetwomnszqrmtvj +hfpcgzrp8pmmvonevtnfpfltmgxqzntwo +seven6cd8eightr +1vbpfiveseven5gsqdpchrjzfour +7zlxvvjmlnonesix67two2sfggmgbmm +rmgvfvdhhgztrrn966six9oneone +6nkvznctwoone +eightthreeg9nine7six +shthreethree1 +tm1eight8rone575 +nv6 +tpkgndlhdzlfour1fouronethreenhmgtjzn3 +9onetwol2qmltninehtrmfxcsbfghk +2vbqxkgp5two89one +428ninefcskeight +g3fournine55eight +hmnvcgtqsixfivebone6 +mpcp55xdfive33mdbsc +bfpfrrlqsixfq9cnzvffncbn +hmpvxz3fiveklnnjcvgxtplhhzdrn8seven +gqr6fiveltkqqfvkhconeseven4rlqnvmmkgcx +two2eightwokcr +eight1zmqpcjbbxkkcnk8 +pq6qhfnm +sevenseventwo5three7 +7eight1mkpmsvpmqfjnvqzgbjkmpc2 +gtwoflpblvv6xzpblmfcbx +32five +four3two843nlxxhktmcdoneightjh +89gjs7eightnineonethree4 +4rfcbkgrcfb6three7jblgcrrxp5 +mhs47tqvkt31twofive +pspptsbp55 +fourfour5twogdvjvskqx8foursix +eightxfvnrpcvjtfkvlng91eightcdgzhxzcm +nine5psngtrxms5vnrbjjrpgt +5xnlqscssbfiveeighteight14 +svzlbtdkhs5eightfourgzhsix944 +fourbphkpbkcfss5l +4four6 +onetwo99 +nzhlddbkgcbxvpfour1twofiveseventhree3 +2one2txrzz8fivethree +seven86 +two3tznttbfkzzbthreexqhxqmbj +dskppdthree2 +seven4lfive +hnftvrk8fhhzrqzxxqzbhvjhflv2nine +eightsix2zbsgtdvrone +rmssljck3sixfivehvsvtwo9ctrbfvhpxfrr +3nphszlp7ktrtzflbvxnfive +cfrrckdlfmjkmvjbtxnsdq613hxlsix6 +spljfjrlrsix2fsl +threeonezdbmxps9 +two2lnbvmmpnqq8ssonethree +vvpjpvm6two7 +424 +threek811nine1five2 +82mfsgmh +ninerrjtnkm4nine +sevenonenine7 +nine16698llgxbbglggone +knhnxtj6ntkxnine2eight7 +286nx +twocbxfonenineonerxvdjzjzcp2 +2one5 +ninethree25sevenfour69 +chthreeone9eightoneshlgndnrjoneightcs +2onenvfszxbphone +9threefour +eightonenine28one +3bshksixrlncdqtk3foureighthjcmmktsvx +prlsj7seven +gqxoneightzmcsqsbvhbthreefive16 +3kbqbzm2sixnine52onekrtoneighttq +hqnfive2one +jfive17onemzd +6one2eighttnjzjk +vtmcxnttlxltcmseven2svp2pnzkbgzzzj2one +54mhqbcpzgsd2ld +3fvbnineeight +fivejrxqnqp11cxeighttwojqbqnhmeight +twoonetwo49sixxjbkdoneseven +7qnqpfb9xrhtxkfz9three +one8four1 +2r3lrgjltxxlrhrvfltwoonevq +jkptfcvdtwo347mjrqd +eight9cxstff +7nqqbkcsftknhqffjvr2sevenpkjvtc +seven5sevenrsthreefiveone +8mmvdqhone584eighteightfive +7sevenjjgvr4 +465nineninesqnslzrfpl +ljqnr737gvfmpjztrsbns8two +hkmdgbbrzpjczpqkhzkdmndlftxgtwoeight26 +nhskzhxfk26lpklkkkdnxeight +sixrqcjqseven7sbqlnpqvshxninebxmkxfrznine +xlrrfnt7jjhfqzr +one9six3 +sevensevenpsbgtgqpmbsbbpldvbz2qsstxlcgkd +5qpmvbnpfiveoneeightsevenone78 +four69seven +2nv +1twovfmvk33gcrsfgdbms +fivetwoone93 +g4sixjbcqttbhnp6fourfplmzdtnltnjqdsthree +f3 +one3ninefiveone3hlsthrp7 +lmdgzgkrq747nine +fourtwo7 +7353bdninesixxtc +njnsprmjxcjn42sixp1 +92onefour +5eighthkdf +263fiveeight +four96one52fivendcnqcl +rcntpkdtjlcxkdg8 +nt7g55ninetfzrjmhrv33 +two19 +ninefive5threetwo73pxjfive +onethree42 +9dctnplfgkeight9 +xpjtknfive6five +q1ninefour7 +twohfdckgcddpmjbpmgbxnineeightxcxkhssjt1 +8hgcs3onemnrcfbgsh9fdc +7zmgns94ninenmm +3four3 +hrrt3nine292fourfour +ljsbmrfmnpgg799twosixfoursix +sixjj6 +gqmvmmjsjrgn7fiveninetwovnjbs +m2 +525onefive +ninesixlm7fiveeight +fourfour6eight5gpkpjdxqvrsp +two5sixkrmxnszf1eight6seven +1bbmmf +26two +9eighteightfivesix7 +mcjcdnhlxv92qfbfbdpxfnxgbqsnxkonethreeseven7 +9qlvlrfivefzdxpmttsllhntpxpfthree +djdjgxdpnd82five +fiveonenine19four4two +five69two7sfj +twoonelvmdbdq2two +qxeight6trprdmgqzj4 +eightfourdvmbvnjthreetwormzfr4qgdctg +fournngpdffcxt1six +seveneight6zeight9 +fkkmfbd7nineseven +twobtkvbzgplfpjfiveseven5 +9jsjkjhgtghbqltldlcpqtvgpmhsixsix1four2 +kxcgkvkmnblfive438 +six6lbbqlttnvfiverxceightwobx +8sevenseven6three9ptfggzkhm +one7ninemdjznbqhfkckpjkxtwo12 +1bvjgdjlll +43kjdtwofiveseventhree9 +fourlgzcrldtwoseven9xndlqvbrtonennvlvzplrt +8twohzmcknlmqd +gshhvf5twodqgdseven8fourfoursix +nineone47sixeightrp +4stonekdgdhxrtqv9sixonevhhmhqzp +8lmpppc +4five8ffive +fivefivesmmkh6jhtggr4 +tjrr9ninenine +six6fiverqdlm67hztn2five +six3278xsddmnz +8qlhdpxn645nhrjm +xlfttcfs6jgtbeight6sixdvpl22 +87tcj6gkjfrrmdjbgh4 +6eightsevennmdpkkmkqrffgshrfhml7two1 +ninemglsrmvqrk5six +9nfgt1rntwo1826 +three2fiveonexrllxsvfive +9zjfkmdfbfqqf2mxpnqsmsthjzzszdxl +43eightnvdrthree1eightoneggrdmnp +pffldcmnlpsevensixqxhdncrclbc51five +5bqnlphone6 +195one \ No newline at end of file diff --git a/10/10-1.py b/10/10-1.py new file mode 100644 index 0000000..7c33663 --- /dev/null +++ b/10/10-1.py @@ -0,0 +1,56 @@ +DIRECTION_MAP = { + "|": [[1, 0], [-1, 0]], + "-": [[0, 1], [0, -1]], + "J": [[-1, 0], [0, -1]], + "L": [[-1, 0], [0, 1]], + "7": [[1, 0], [0, -1]], + "F": [[1, 0], [0, 1]], + "S": [[-1, 0], [0, 1]], +} + + +def get_input(): + with open("10.txt", "r") as f: + return [l.strip() for l in f.readlines()] + + +def find_start(input): + for i, l in enumerate(input): + for j, c in enumerate(l): + if c == "S": + return [i, j] + + +def get_next(input, current_coords, prev_coords): + y, x = current_coords + current_val = input[y][x] + possibles = DIRECTION_MAP[current_val] + for pos in possibles: + next_coords = [y + pos[0], x + pos[1]] + if next_coords == prev_coords: + continue + return input[next_coords[0]][next_coords[1]], next_coords + + +def get_furthest(input): + start = find_start(input) + count = 0 + prev = start + current_coords = start + while True: + count += 1 + next_val, next_coords = get_next(input, current_coords, prev) + if next_val == "S": + return count / 2 + prev = current_coords + current_coords = next_coords + + +def main(): + input = get_input() + print(get_furthest(input)) + + +main() + +# 6875 diff --git a/10/10-2.py b/10/10-2.py new file mode 100644 index 0000000..e261159 --- /dev/null +++ b/10/10-2.py @@ -0,0 +1,78 @@ +from shapely.geometry import Point, Polygon + + +DIRECTION_MAP = { + "|": [[1, 0], [-1, 0]], + "-": [[0, 1], [0, -1]], + "J": [[-1, 0], [0, -1]], + "L": [[-1, 0], [0, 1]], + "7": [[1, 0], [0, -1]], + "F": [[1, 0], [0, 1]], + "S": [[-1, 0], [0, 1]], + "O": [[-1, 0], [0, 1]], +} + + +def get_input(): + with open("10.txt", "r") as f: + return [list(l.strip()) for l in f.readlines()] + + +def find_start(input): + for i, l in enumerate(input): + for j, c in enumerate(l): + if c == "S": + return [i, j] + + +def mark_loop(input, current_coords, prev_coords): + y, x = current_coords + current_val = input[y][x] + possible_coords = DIRECTION_MAP[current_val] + input[y][x] = "O" + for p in possible_coords: + next_coords = [y + p[0], x + p[1]] + if next_coords == prev_coords: + continue + return input[next_coords[0]][next_coords[1]], next_coords + + +def plot_loop(input): + start = find_start(input) + count = 0 + prev_coords = start + all_coords = [] + current_coords = start + while True: + count += 1 + next_val, next_coords = mark_loop(input, current_coords, prev_coords) + if next_val == "O": + break + prev_coords = current_coords + current_coords = next_coords + all_coords.append(tuple(current_coords)) + return all_coords + + +def count_within(input, poly): + count = 0 + for i, row in enumerate(input): + for j, l in enumerate(row): + if l == "O": + continue + if poly.contains(Point(i, j)): + count += 1 + return count + + +def main(): + input = get_input() + all_coords = plot_loop(input) + poly = Polygon(all_coords) + + print(count_within(input, poly)) + + +main() + +# 471 diff --git a/10/10-test.txt b/10/10-test.txt new file mode 100644 index 0000000..1ddc980 --- /dev/null +++ b/10/10-test.txt @@ -0,0 +1,5 @@ +7-F7- +.FJ|7 +SJLL7 +|F--J +LJ.LJ \ No newline at end of file diff --git a/10/10.txt b/10/10.txt new file mode 100644 index 0000000..b7c7066 --- /dev/null +++ b/10/10.txt @@ -0,0 +1,140 @@ +..77LJJ7|7.|F-L77.F77FLF-L-777L7.77.F7-77-F|-7-F-FL-LF7F77FFF-7F7F7F-7F7FFF777|.FL|.F|.FFF-7|FL777FF.FFF77F--L-77--|FJFFF7FLF-|-JF7J-F--7-77 +-||L7L-7LJ7L7J|LJ.|.J7|L--7||7FFFJ..-F7.7F7JF--J7|J|||LJ|F-7L7LJLJ||FJF-7FJL77J-L-77F|F-J.LF77-||F-F--F|--777|7|||7JL7LJF7-JJFLFJF|J.|||L-7J +L|7L7F--J.|-JF-7J-77F7J-JFFJ-|-J|L-L7J|.L||L|J|.|L-77L-7||FJFJF7F-J||-L7LJF-JJ.LJ--7JL77LJ7LLJ-LJJL7-7J|J.|F-J--J.7|FJ.|||LJF7.J---7-J-|.|F7 +.J7.JJJ-F|JF-7.|7-L|7JL7J7.FFLJF77-LL.L-FF7-F7-F7.FF7JFJ|||FJFJLJF-J|F7L7FJJ|..FJFL-.L|-J.|-7||JJJL|FL-JJF|.L-777LF-F7--.J..FJ|JL|-|7FFJ-F|| +FF--|J.|.LF|F7-L---LFF-J-J-J-7LL|LFJ|7J-LL-.LJFF|-FJL7L7||LJFJF-7L-7LJL-JL-7J.F-FJL|J.LL7J.-.|.L|7.F|.|.FLJ-L.|L7J..LLLJ7|FFLF-.L-.||7L-F|L7 +L77F|.L---JLJL|77LFJ|.F--LJF|J|F|-|LL7L7FLL7-FF--7L-7L7||L7FJLL7|JL|F----7FJJ-LFFJF7L7JLF77..7-J|LF-JFFLF.||JLJ.|.FJ.LL.L|F7JLF-77-|L7J7||F| +LLFJJ.JJ.J--7-L7|-|J|L7L-J-LJ7F-7||7|.-L-.LFF7L7FJF7|FJ|L-JL-7FJL7FJL---7|L--7.L--7J7|.F7J77..|7F-L7F-L-7FJ77.F7L-F7F7J.||LL7L7.FJFFF7---FLJ +7J.|-7F7.F7L|7LF||FJF-|7|.||7L--J7L-JJ.LL7.FJL-J|FJ||L7L--7F-J|F-JL7F---JL---JJJ|FF--7.||.7FF|-FLJLF--|-L7F|--L7|.LF||7--LJFJ7F---7J.|J|F77. +.7-F7-J|LJ7.LF-J|LFF77LJF-F-|JL7FJ.|J.|7-FFL---7|L7||FJ-F-J|JFJL-7F||F--7F7F7L||LFL-7|FJ|7LFF.|..-JJ|JL-J|FJJ.L|77..||7F|FFF|-L7L-J.J|-|LJL7 +JL7JL-LJL|.7FJL|LJJ||L--LJLF7-.FJJ.|JFLJ.LF----J|FJLJ|F7L-7L-JF7FJFJ||F-J|LJL-77.F--J|L7|7-LF--7.|-F-7J.||LL-7.L|7-F||7--F7--J.||.|LJ-FJ---| +L-JJ|FJ.L-L-7|FJJ.-JFJ.LL.LLJJ-|J-7JFJJ77FL--7F7LJF-7LJ|F7|F--JLJ-L7LJL--JF7F-JJ7L--7|FJ|F7F|F7L--7L7|-.FJ7|7L-J|JFFJL7JF|LL7F-77|7|F7L7F|F| +|77.||.F.L|.|F|L-7J.J-7.|J.|JF-J-F7-7J|7|-F-7LJL7FJFJF7LJ|||F--7F7FJF--7F-JLJF7||-FFJLJFJ|L7LJ|F--JFJ|L|J|F7J.FFF7FJF-JFF77-L7LJ7LLLJ|7-7-|7 +--|-7-----7FLFL7..-7.FFF7FFFJFJ|J||-F7-F-7L7|F7FLJ-L-JL-7LJLJF7|||L7L7|LJF7F7||-|7LL--7|-|FJ7-||F-7|FJ.FF-7.LFF-JLJFJ7F7|||LLL-J|.J7|F-.L-L7 +L7LLF--J.FL7L|J.FF--F--J|7F|-|FF7||||L7L7|FJ|||F-7F7F--7|F-7FJLJ|L7|FJF7||||||L7F7-F--JL7||F7F|||FJ|L--7|FJ77|L---7L7-||||7.LL7LLL-L7.|-...| +LJ7-L7|7L|---L777|FFL-7FJ7F7LLFJ||L7L7L7||L7||||FJ||L-7|||FJL7F7L7LJL-JL7|||||FJ|L7L--7FJ|||L7|LJ|-|F--J||F7F7JF-7|FJFJLJL777.FF..FLJJJL-J-L +.J|FJFL|.||F|JF----7LF|L7-||77L7LJFJLL7LJL-JLJLJL-J|F-JLJ|L7FJ|L7L7F----J|||||L7L7L7F-JL7|||FJL-7L7||F7FJLJ||L7L7||L-JF--7L7JF-7.F-7J.7..|.| +7.F|L|.J.7JF|7L---7L-7L7L7|L7-L|F-JJ-FJF-7F7F-----7LJF-7FJFLJ.|FJFJL-7FF7|||||FJFJFJL--7|||||F7||FJ|LJ|L--7|L7|FJ|L7F-JF7L-JJ7LL-F-|-7|F-J7- +L77.F|J.-J-FJJJFF7L-7L-JFJL7L--JL7|.-|FJ7LJ||F7F--JF7|FJL---7FJ|FJF--JFJ||||LJ|7L7|F7F7|||LJ|||FJL-JF7L7F-J|FJLJFJ.|L--J|FLJJL-JF||J|LF7|LJJ +L7J7LJJ-|L-JJ|-FJL--JF-7|7FJF7F-7L77FLJ|F7JLJ||L--7|LJL7F-7FJL7LJFJF7LL7||||F-JF-J||LJ||||F-J|LJF7F-JL-JL-7|L7F-JFFJF--7L7J.7J.|FJ-J|7-L--JF +.L.|JLJJL7JJFJFL----7|FJL7L7|LJJL-JF----J|F7FJ|-F7LJ-F7|||LJF-JF-JFJ|F7||||||F7L-7|L-7||||L-7L7FJLJF-7F-7FJ|FJL7F7L7|F7L-J7.L7.LFJ.L||FJ.L7- +L7FJ.L|.|.F-|LF7|F-7LJL-7|FJL--7FF7L----7|||L7L-J|F7FJLJL7F7L-7|F7L7||LJLJLJ|||F7|L7|||||L7FJFJ|F--JFJL7|L7||F-J|L7|LJ|7F-7-J.|-7L77-F7F7-|J +LFLJ7L7-7JJFF7|L7L7|F-7FJ|L7F--JFJL7F7F-JLJL7L7F-J||L--7FJ||F7|||L7||L---7F-J||||L7L-JLJL-JL-JFJL7F-JF-J|FJLJL-7L7LJF-JFJFJ7|.77FJ||F|LFJ-|. +L7.|.FJJJL7FJLL7L-J|L7|L7L-JL7|JL7FJ||L----7L-J|F-J|F7J|L-J||||||FJ||F7F-JL7-|LJ|LL-----7F----JF7|L-7L-7|L-7F--JJ|F-JF7|FJLF77LLJ.L|JJ-|7-LL +7J77.|7--7LLJLFL7F7L-JL-JF7F7L7-FJ|L||F7|F7|F--JL-7|||FJF--J|||LJL7||||L--7L7|F-JF--7F--JL---7FJLJF-JF7||7FJ|F7F-JL-7||||F7||7F7|...L|-77JJ| +|7FJFFF7FFJJ.-LJLJL------JLJL7L7L7|FJLJ|FJLJ|F-7F7||||L7L7F7|LJF--J|||L7F7L7|||F7L7FJL--7F---JL7F7|F-JLJL-JFJ|||F---J|LJLJLJL7J-L7LL.L77|7.J +LL|---J|||-7..FF--------7F7F7L7L7||L-7FJL-7FJL7||LJLJL-JFJ||L-7L7F7|||FJ||.|LJLJ|FJL7F--J|F7LF7||LJL---7F--JFJLJ|F---JF7F-7F-JJLL-.J-7|L-J7| +|J|||.FLL77|FF7|F------7LJ|||FJFJ|L7FJ|F7FJ|.FJ|L----7F7L7|L-7L7LJ||LJ|FJ|FJF---JL7FJ|F-7LJL-J||L7F--7FJL--7L7F-J|F---JLJ|LJ.|JLFLJL|LJ.|-LJ +||LJ.-F-LLFF7||LJF7F-7FJF7|||L7|FJFJL7|||L7|FJFJF-7F7LJL7||F-J7L7FJL-7LJFJL7L7F7F7|L7LJLL-7F--J|FJL-7|L7F7FJ.|L-7|L7F-7F---77L7-J7J|||LFJL|| +-77JFFJF|.FJLJ|F7||L7LJFJ|||L-J||FJF7|LJ|FJ|L7|LL7LJ|JF7|LJL-7F-JL7F-JF-JF7|FJ||||L7L7F7F-J|F7J||F7FJL-J|LJF7|F-J|FJ|FJ|F--J|-F7.J7FJ7.-J7|J +|.|L-7.FLFL7F7LJ||L7L--JFJLJF-7LJL7||L-7|L7|J|L-7L-7L-J||F--7|L-7FJL-7|JFJ|||-|||L7|FJ||L-7||L7|LJ||F--7L7FJ||L7FJL-JL-JL7|F7FJL7.F.|F.LLFJ| +|.7-JJ7|LFFJ|L-7|L7L7JF7L7F-J-L--7LJL7FJL-JL7|F-JF7L-7FJ||F7LJF7|L7F-JL7S7LJL7||L7LJL7||F7||L7LJF-J||F-JFJ|FJL7LJF------7L7|LJF-JF7-F|77LF7- +-FJFJ7LL7.L7|F7|L7L7L7||JLJF7F7F7L7F-JL-7F--J|L-7||F-JL-JLJL7FJLJFJL--7|.L7F-J||FJF--J|||||L7|F-JF7LJL-7||||F7|F7L-----7L-JL7FJJ.-LF-7FJ-LL7 +FL7LF-JJL7-LJ||L7|FL7|||F-7|LJ|||FJ|JF7FJL7|FJF-J||L-7F-----J|F--JF7F7||F-JL7L||L7|JF7||||L7|||F7||F7-FJ|FJ|||||L------JF77FJ|J77-FJLFF7LL|F +L-JF7|JFF7J|FJ|J||F-J||||FJL-7|||L7L7||L-7|FJFJF-J|F-JL7F--7FJL-7FJ|||||L--7L7||FJL7||||||FJ||||||||L7|FJL7LJLJL7F--7FF7|L-JFJL-F-7J.LJJ..F7 +LL7FF|-F||J-L7|FJ|L-7LJ|||F--JLJ||L7|||F7|||FJJL-7|L-7FJL7FJL-7FJL7|||||F7L|FJ||L7FJ||||||L7||||||||FJ||F-JF-7F-J|F7L7|LJF-7L-7J||J-JJFL-7LJ +|.J-||-FJ|FF7|LJFJF7L-7|||L----7L--JLJ||||LJ|F7F7|L7FJ|F7||F-7|L7FJ|||||||FJL7||FJL7||||||FJ|||||||||FJ||F-JJ||F-J|L-J|F-JFL--JFL|--|-L--7L7 +-J.F|LJL7L-JLJF7L-JL--J|||JF7F7L-----7|||L7|||||||FJ|JLJ|||L7|L7||FJ|||||||F-J|||7|||||||||FJ|||||||||JLJL7F7LJ|F-J7F-JL-7FF---77J..|-L.L7JL +FLLJL.FLL7F-7FJL------7LJL-J||L------J|||FJFJ|||||L7L7F-J|L7||FJ|||FJ||LJ|||F7||L7FJ|LJ||||L7||||||||L7F--J||F-JL7F7|F---JFJF-7L--77|JFF.J.. +|7.F.-|.FLJ-LJF7F7F--7L----7LJF7F---7JLJ||JL7|||||LL7||F7|FJ|LJF|||||||F-J|LJ|||FJL7L-7|||L7||||LJ||L-JL---JLJF--J|LJL--7FJFJLL7F-J77-7JFF-. +.FF-FJL-FF7F7FJ||||F7L----7L-7|LJF--JF77LJF-J|LJLJF7LJ||LJL7L--7||||FJ||F7L-7|||L-7|F7||||FJLJ||7FJ||F7F7F--7FJF-7|F---7||FJF-7LJF-7-7L-FL-F +FL|--7LFFJLJ|L7LJ|LJL-7F--JF7LJF7L---JL-7.L-7L----JL7FJL7F-JF7FJ||LJ|FJ||L7FJ|||F7||||||||L7F-JL7L7|FJLJLJF7LJ|L7LJL--7LJ||L|FJF-JFJ-|J.|-7| +J7LJJ|JLL7F7L7L-7L-7F-JL7F7||F-JL-7F-7F7L7F7|F--7F7FJL7FJL-7|LJFLJF-JL7LJ|||FJ|||||LJ|||||FJL-7FJF||L7F7F7|||F7FJF7F--JF-JL-JL7L-7L77F7-|7|F +L7.LF|||L||L7L7FJF7LJF7FJ||||L---7LJJLJL-J|LJL-7LJ||F-JL7F-JL----7L7F7L-7FJ|L7|LJ|L7FJ|LJLJF--JL7FJ|FJ|LJLJL-JLJFJ|L7F7|F-----JF7|FJF-7JL7F| +LF7F7|F7|LJFL7LJFJL7FJ|L-JLJL---7L-7F7F7F-JF7F7L-7LJ|F7FJL--7F7F7|J||L7FJ|FJFJL-7|FJL-JF---JF-7FJL-J|FJF------7FJLL-J|LJL7F--7-|LJL-JFJ--J|J +-J|JLFFF----7L-7|F-J|FL--------7|F7LJLJ|L7FJ|||F-JF7LJ||FF--J||||L7|L7||FJL7L7F7|||F---JF--7|FJL-7F-J||L-----7|L-7F7L|F--J|F-JFJF7F--JJFLJJ7 +LLL-FFFL---7L--J|L--JF--7F-----J|||F---J7LJFJ||L--JL-7|L7L7F7||||FJ|FJ|||F-J-|||||||F--7|F-J|L-7FJL--JF---7F-JL--J|L7|L---J|F7|FJLJF7.|77J.| +L|L7.||LF--JF---JF--7L-7|L-----7LJ|L--7F7F7L-JL7F7F7FJL7|||||||||L7|L7LJ|L7F-J|||LJLJF7LJL7FJF-J|F7F-7L--7LJF7F---JFJ|F----J|LJ|LF-JL7F7|JFL +||F7FLJJL--7L7F--JF7L--JL-7F7F-JF7L--7LJLJ|F-7FJ|LJ||F7|L7LJ|||||FJL-JF-JFJL-7|LJF7F-J|F7FJ|JL--J||L7L7F-JF-JLJF---JFJL-7F-7L7FJFJF-7LJL77|. +FJFJJ7L.J7LL7||F7FJL-----7LJLJF-JL--7|F7F7LJFJL7L-7|LJ|L7|F-J||||L---7|F7||F-J|F7||L-7LJLJFJF-7F7||LL7|L--JF7F7L----JF-7LJFJ-||-|FJ-L---JJFF +F--JLF-FLFJFLJLJLJF------JF-7FJFF---JLJ|||F7L-7|F7||F7L7|||F-JLJ|F-7FJLJ|L7L-7||LJL--JF-7FJLL7LJLJ|F7|L----JLJ|F-----JL|F-JF-JL-JL-------7-L +J|FJFL.7J|7F----7FJF7F7F7FJ.LJF7L-----7LJ||L-7||||||||FJLJLJF---JL7|L--7L7|F7LJ|F----7|F||F--JF--7||||F7F7F7F7LJF-7F--7|L--JF7F-7F--7F---J7. +FLJ.JJ.JFF-JF--7|L-JLJLJLJF77FJ|F----7L-7|L-7LJLJLJLJ|L-7F7FJF7F7FJ|F--JFJ||L-7||F7F-JL7||L7F7|F-JLJ|LJLJLJLJL-7L7LJF-JL-7F7|LJFJL-7|L--7L7J +77.L.L-7FL--JF7||F7F--7F--JL-JFJL---7|F-JL--J.F7F7-F-JF7||LJFJ|||L7||JF7L7||F7LJ|||L7F7||L7LJLJL---7|F7F----7F7L-JF7L---7||LJF7L-7FJ|F7FJ-L. +LLLJ|FLL.LF7FJLJLJLJF7LJF-7F-7L-----JLJF------JLJL7L--J|||F-J|||L7||L-JL7||LJL7FJ|L-J||||FJF7F-----JLJ|L---7||L--7||F7F7||L--JL7.|||LJLJ|-|7 +F7-7JF-|FF||L-----7FJL-7|JLJ||F--7F7F7F|F-----7F--J7F7LLJ|L-7FJ|F||L-7F-JLJF-7LJJL7F7|LJLJ7||L-7F7F--7L----JLJF7-LJLJLJLJL-7F7FJFJL7J.|.F.77 +F--J--77FFJL------J||F-J|F---J|F7LJLJL-JL-7LF7LJ.F--JL--7|F-J|FJFJL-7||F7F7L7L-7F7LJLJF7F--JL-7||LJ.FJF-------JL------7-F77LJLJ-L--J-FF||F|| +L|7FLLL77L-7F-----7|FJF-JL---7||L--------7L-JL---JF--7F-J||FFJL7L7F7||LJLJL7|F7LJL----J|L----7|LJF--JFJF------7F------JFJL--77F---7JL7|.||L- +--FLJ|FLL7.LJ-F7F-J|L7|.F----J|L7F------7|F7F7F7F7L-7|L-7|L7L7FJJLJ||L7F-7FJ||L7F-----7L-7F--J|F7L---J|L-----7|L--7F---JF-7FJFJF--JF7J-F.JJ| +.F7|.||L7F7F--JLJF7||LJFJF--7FJFJ|F---7FJ||LJLJLJL--JL7FJL7L7LJJ||F|L7||FJ|JLJ7||F7F--JF-JL7F7LJL--7F7F7F--7FJL7F7LJF-7FJLLJFJFJLF--7JJLFJ|| +FJ|FF.|.F|LJF7F7FJ||F--JFJF-J|-L7|L-7LLJ-|L7JF--7|F7F7LJF7|FJ|7JFJFJFJ||L7L7F--J|||L--7|LF7||L----7|||||L-7||F7LJ|F-J-||F77|L7|F-JF-J7.7|.FJ +7.|L|-|--|F7|||LJ|LJL---JLL-7|F-J|F-JF7F7L-JFJF7L-JLJL--J|LJ.|J-7LL-JFJL7L7||F7FJ|L---JL-J|LJF----JLJLJL--JLJ|L-7|L7F7LJ|L7F7|LJF-JF77-LF7JJ +|.|.||L--LJLJLJF7F7|F------7LJL--JL7FJLJL---JFJ|F7F7F---7|.|7J|F--J.L|F-JJ||LJLJ7L--7F7F-7|F7|F-7F7F-7F7F---7|F-JL-J||LFJFJ||L7FJF-JL7|-|||7 +LJ||J-.J7L..LJF|LJL-JF--7F7L7F7F7F7LJF7F--7F-J-||||||F7||L-777FJ-|..FLJJJ.LJ-F------J|LJFJLJLJL7||||FJ|||F-7LJL---7FJL7L7L7||FJL-JF-7L7FJL-7 +|.7J.F|FJJ-F7JFJF7F-7|F7LJL7LJLJLJL-7||L-7LJJF7LJ|||LJL7L--JJF7.77JF7|FL--JJ.L7F7F7F7|F-JF7F-7FJLJLJL7|||L7L------J|F-JJL7||LJF7F-J|L7LJF-7| +|7L-F-JFL|.||FJFJ||FJ||L7LFJF----7F7LJL-7L--7|L7JLJL--7|FL7L7|77L-.FFJ--J|LJ-L||LJLJ||L--J||.LJF-----J|LJFJF----7F7|L-7F7|||F-J|L--7FJF7L7LJ +||F|J.L|--FJ|L7|FJ|L-JL7L-JFJF---J|L-7F7L---J|FJF----7LJ7|F-||L|L|.FJ-LLF-7|.L||F---J|F---J|F-7L------JF-JFL7F--J|||F-J|||||L-7L---JL-JL-J7| +FJF7.-.L||L7|JLJL-JJF7|L7F7L7L7F--JF7LJL7FF7J|L-JF--7||F7F7FLJFL--JJ-FJ.F7-|7.LJL---7|L-7F-JL7|JF7F7F7JL----JL7F7|||L-7|||||F7L7F7F7|F--77L7 +J.|F-|-FFLFJL---7|F7||F7|||FJFJ|F--JL--7L-JL7|F-7L-7|L7||F-7--LJJFJ-F|.FJJ|.-7.L-F--JL-7LJF--JL-J||||L--7F---7LJLJLJF7LJLJLJ|L7LJLJL7|F-J-FF +J.LJFF.F|LL-7F-7L-JLJLJLJ|LJ7L-JL--7-F7L----J|L7L--JL-J|LJFJ|F-7FJ||.--L7.LJF|7-FJF-7F-JF7L-7F7F7LJ|L--7LJF-7L7F-7F-JL7F-7F7L7L--7F7LJL-7-J| +FJFFLJF7|.LLLJFJF---7F7F7L--7LF7F7|L-JL------JFJ7F-7F-7|F-J7L7LLL-|7FJ|FJ77L|L--L-J.LJLFJL--J|LJL-7L---JF-JFJFJL7|L--7|L7||L7L--7||L-7F-JF|| +L-F|F--|-J.J.FL-JF7FJ|LJL---JFJLJL----7F7F--7FJF7|FJL7LJL7L-J7--J-L77JLJJ|F7|7JJF-7F7F7L-----JF7F-JF7F-7|F-J7L7FJL-7FJ|FJ|L7|F--JLJF7LJF7-L| +LF||LJ.7.L|FFF-7FJLJFJJF--7F7L-------7||LJF7|L7|LJL7J|F7FJ7|.|F7J.FF7.||FJ||J|JFJFJ|LJ|F7F7F--JLJF-JLJJLJL---7|L-7FLJ|LJFJFJ|L-----JL--J|JLJ +LL-7|LFL--|7LL7|L---JF7L-7LJL-7F-----J|L--J|L7LJF-7L7||LJJ|-7|L7F|7.L-7-FJ||-|-L7L7L-7|||||L-----JF7F7LF7F---JL--JF---7FJFJFJF7F-7F7F7F-J|FJ +7.FJ77.|FL7-F-J|F----JL--JF7F7LJF----7L7F7FJ-L7FJLL7LJL-7.|JFJ-LJJ..J7L77|F||JF7L7L--JLJLJL-------JLJL-JLJF--7F--7L7F-JL-JL|FJ||FLJLJ||J|F-| +.|7LL-F-F7JL|F7LJF---7F---JLJL--JF---JFLJLJFF-JL7F-JF7F-JFL.LJFF7|F|-|L77FF7F-JL-JF-7F7F7F7F--------------JF7LJF7|FJ||F---7|L7|L--7J.LJ|FJFF +FL7-|..FJ|FLLJL-7|F-7LJF---7JF7F7L---------7L-7FJL-7||L-7F|7|JF7JJJLF77L7|||L-7F--JLLJLJLJLJF7F7F7F--------JL--JLJ|FJFJF7FJL-JL-7FJL-7FLJLLJ +FL.|L|.L.FF-----J|L7|F7L--7|FJLJL----------JF7LJ-F7LJL-7L--7|.LJ.|JF||77|FJL7LLJF-7F----7F--JLJ|||L7F7F7F----7F7.FJL-JFJ|L-----7||L-J-7|7F.| +LL-7F7-|FFL7F----JFJ||L---JLJF7F-7F7F7F---7FJL7F-JL---7L--7|F77JFF--J|F77|F-JLF-JFJL-7F-JL----7LJL7||LJLJF--7LJL-JF---JFL------J|L7J7FJ-|L-7 +||LFFJ7|--LLJF7-F-JFJL---7F-7||L7LJLJLJF--J|F-JL-7F---JF7FLJ||F77L-7FJ||FJL--7L-7|F7FJ|F7F7F7.L--7LJ|F---JF7L-7F-7L--7F7F-7F--77L-JL7-JFF7L| +LJ||.LL.7JJFFJL-JF7L--7F-JL7LJL-JF7F7F-JF7J|L----JL----JL7F-JLJ|F7|||FJ|L7F--JF7||||L7LJLJLJL--7FJF-JL-7F-JL-7|L7L7F7LJLJFJ|F-JF-7J.||J|LJJJ +FL7F-7L..LFFJF--7|L7F7|L7F-JF7F--JLJLJF-JL7|F---------7F-JL---7||L7|LJFJL||-F-JLJLJL-JF7F----7FJ|FJ.F-7LJF---J|FJJLJ|F7F7L-JL--JFJJF-|-L-J|J +|-F-FLL7--FL-JF-J|.|||L7LJF-J|L------7|F--J||F7F--7JF7LJ.JJLF7||L7|L-7L--JL7L7F-7F7F7FJLJF---J|FJ|F7L7|F7L---7|L7JF7LJLJL--7F-7FJ.LF---7|.F7 +L7JL--J77JL.F7L--JFJ|L7|F7L-7|F-7F7F-J|L--7|LJLJF7L-JL-7J-F-JLJL-JL-7L--7F-JJLJFJ|LJLJLF-JF7F7LJFJ|L-JLJL-7F-JL-JFJL-----7FLJF||.F-J7J.F7--L +JJLF|.J.7.LFJL7F-7L-JFJLJ|F-J|L7LJLJF7|F--J|F---JL-----J|FL------7F7L7|FJL-7F-7L-JF----JF7|LJ|F7L7L7F7F--7LJF7|F7|F---7F7L---7|L77F.F7|L||.| +|7.|-FJFLF7L-7||FJF7FJF-7LJF7L-JF7F-JLJL7-FJL--7|F7F7F7F7FF7F----J|L7L-JF-7LJFJF-7L---7FJ||F-J||FJ|||LJF-J.FJL7|||L-7LLJL----JL7|7J7LL7-F|-L +||.|LJ.-J|||FJLJL-J|L-JFJF-JL-7FJLJF----JFJF7F7L-JLJLJLJL7||L-7F--JLL--7|FL--J-L7|FF7LLJ|LJ|F7|||F-JL-7L---JF-J|||F-JF7F------7LJ|.F7L-JLJ7| +|7-J7.F.L|L-JF7F7F7L-7-L-JF---JL7F7L7F-7FJFJ|||F7F----7F-J||-|LJF7F----JL7F7F7F7||FJL77F--7LJ||||L-7F-JF----JF7|LJL7FJLJF7F--7L---7-JJ--JF77 +F-7||F77FL-7FJLJLJ|F7L-7F-JF-7F7||L-J|FJ|FJ-LJLJ|L---7LJF7||F7F7||L-----7LJ|||||||L7FJFJF7L7FJ|LJF7LJF-JF7LF7|||F-7LJF--J|L-7|F--7|JFL7.FF|. +L--|.F-J.LL||-F---J|L-7LJF7|F||||L---JL-JL-7|F7-L---7L7FJLJ||||LJ|F-7F-7|F-J|||||L7|L7L-J|FJL7L-7|L--JF7|L-JLJLJL7|F7L--7L--JLJF7LJ7F-F77J.- +J|J|77.LL7LLJFL-7F7|F-JF7|||FJ|LJF7F-7F-7F-JFJL----7L-JL-7FJ||L-7LJFJL7LJL-7|LJ|L7LJFJF7FJL-7L--JL----JLJF-7F-7F-JLJL7F-JF7F7F7|L-7LJJ|L7F-J +F-F-77-7J|L|||FFLJLJL-7|||||L-JJFJLJ-LJFJ|F-JF-----J.F7-FJL7||JFJF-JF7L---7||F-JF|F7L-J|L7F-JF-7F---7F7FFJFJ|FJL-77F7LJF7|||||LJF7L7JF7LJJ7| +7JLJ7-FLFJ.F|JLF------J|LJLJ7F--JF----7L7LJF7L----7|FJL7L-7LJL7L7L7J|L-7F-JLJL--7LJL7F7L-JL7||FJL--7LJL7L7L-JL7F7L-JL--JLJLJLJF-JL-J.J7F|-F7 +|--|J-L-JJ-|J|FL--7F-7FJF----JF7FJF--7L7L-7||F7F7FJFJF-JF7|F--J7L7|FJF7|L--7F---JF7-LJL--7FJFJL7F--JF-7L7L--7FJ||F7F---7F--7F7L-7J7L|L|7|L|| +|.LJJ.L7|-F|.-LF--J|FJ|FJF7F7FJLJ7L-7L-JF7LJLJLJLJFJFJF7||||F7F--JLJFJLJF--JL--7FJ|F-7F7FJL7L7FJL-7FJLL7|F7FJL-JLJLJF7L|L-7LJL7FJFFF|.LFL-|| +L-7F-7FL-7FJ||.L7F-JL7||FJLJLJFF----JF7FJL-7F7F--7L7L-JLJ||LJ|L----7L7F7L--7F--JL7|L7|||L-7L7|L7F-J|F--J|||L--------JL7L--JF-7|L77L7L|7L-L|7 +L7F-J|L-LL7JF--7LJF-7LJLJF7F7F7L7F---JLJF7FJ|||F-JFL--7F-J|F7L7F7F7|FJ||F7F|L7F77||FJ||L7FL7||FJL-7|L7F7LJL7F7F---7F-7L----JFJL7|7||JL|L7L77 +LL77.|.F7F|7|F7L--JFJF--7|LJLJL-J|F-----JLJ.|||L-7F7F7|L7JLJL7LJ||||L-JLJ|FJFJ|L7||L7||FJF7|||L-77LJ-LJ|F7FLJLJ.F7LJ7L--7F-7|F7LJ--7L7.FF7.| +FLJJF-7.L7FFLJ|F7F7L7|F-JL-7F-7F7|L-----7F7FJ||F-J||||L7L77F7L-7||||F----JL7L7|FJ||FJLJ|-|LJLJF-JF-7F7FLJL------JL7F---7LJ||LJL-7.-|JF-FJL77 +F7FLF7|.J.|LL|LJLJL7LJ|F7F-J|JLJLJF-----J|||FJ||F7|||L7|FJFJL7FJLJLJL7F7LF7L7|||FJ|L7F7L7L-7F7|F7|FJ|L-------7F7F7||F--JF--JF7F-J7-J7L-|7L|| +L77JJL--J-L7FF7F7F7L-7LJLJF7|F---7L7F7F77|||L7|LJ|||L7|||FJF-JL---7F7LJL7|L7||||L7|.LJL7L-7|||LJ||L7L-------7LJ|||LJL--7L-7FJ|L-7LFJJ7.L--JJ +|L7--J.|.|FF-J||LJ|.FJF-7FJLJL--7||LJ||L7|LJFJL7FJ||F||||L7|F7F--7LJL-7FJL7LJLJ|-|L7F-7|F-JLJ|F-J|FJF7FF----JF7LJ|F7F--JF7|L7|F7|L-JL-J-|7JL +F-JF--F.FF-JF7LJF7L7L7|FJ|F7F---J|F--J|FJL-7L-7||FJL7|LJL7||||L-7|LF7F|L7FJF---JFJFJL7||L7JF-J|F7|L7|L7L-----JL-7LJ|L---J|L-JLJLJ-J77.L----| +J7|7|7|7|L7FJ|F7|L7L-J|L-J||L---7|L7F-JL7LFJF-J|||F7|L--7LJ||L7FJ|FJ|FJFJ|FJ.F7FJFJF7||L7L7L7FJ|||FJL7L-7F---7F7L-7L-----JF7F7J-|-JLJ7.|LLF| +LFF-77-F-JLJFLJLJJL-7FJF--JL----JL7|L7F-JFJFJLFJ|LJ|L-77L-7||FJL7||FJL7|FJ|F7|||FJFJLJL7|FJFJ|FJ|||F7L-7||F7.LJL-7L-----7FJLJ|-F|-F7--7-.FLJ +7LJFLJLFJ.|.F-LLF---JL7L7F-7F-7F-7LJF||F7L7|F7L7|F7L7FJF7.||||F7||||F7|||FJ||||||-L7F--J||F|FJL7|||||F7||LJ|F7F7.L7F-7F-J|F-7|7-77||L|L7F-J. +L7LJFF7.F||F.-.LL----7L7||FJL7LJ7L7F7|LJL7|||L7|LJ|FJL7||FJLJ||||||||LJ||L7|||LJ|F7||F7FJL7|L7FJ|||||||||F7LJLJL-7LJ-LJ|FJL7|L7F|77L7JFJJ-LJ +.|7FFFJ-J|FF--F-F7|F7|FJLJL7FJF---J||L-7FJ|||FJL-7||F-J||||F7|||||||L7F||FJ|||F-J|||||LJF-JL7||FJ|||||||LJ|F7F7F-JF7F---JF7|L-JF7F7-..|J-FJJ +F--7FJF-J-F-.-FFJL-J|LJF7F7||FJF--7||F-J|FJ||L7F-JLJL7FJ||FJ|LJ||||L7L7||L7|LJL7FJ|||L7FJF7FJ||L7||||||L-7LJLJLJF7|||F---J|L--7||||7F|..-|-7 +.FF-L-7-F-LL-LJL---7L--JLJLJ|L7|F-J|||F-JL7LJFJL----7||FJLJFJF-J|||LL7||L7||LF7|L7|||FJL7||L7||JLJLJ||L-7L-7F7F7|LJLJL--7L|F-7LJLJL7LL7..JJ. +F-LL|FJ.-.|.LLJF7F-JF-7F7F7FJFJ||F7|||L7F-JF7|F--7F-J|||F7FJFL-7||L-7|||FJLJFJLJFJ|||L-7|||FJLJF----JL-7L7FJ|LJLJF-----7L7|L7|F7F--J-FJJ.FLF +-J|7F-L-7.LJ7|-|LJF7|FJ||||L7L-JLJLJLJFLJ7FJLJL7L|L7|LJ||||LF7FJ||F7||||L-7JL-7FJ7LJ|F-J|||L--7L--7F7F7|FJL-JF7F7L----7|FJ|FJLJLJJ7.-7.FFF7| +LFF7JFL-|7|-|.-L-7|||L-J|||FJ-F-----7F7F--JF7F7L7L7L7F-J|||FJ|L7|LJ||LJ|F7|F--JL---7|L7F||L-7FJJF-J|||LJL7F7FJLJL--7F7||L7|L----77F---7FF-77 +.7LL-FJF-77FF-.F|LJ||.F-J|||F7L----7LJLJF--J||L-J-L7|L7FJLJL7L-JL-7|L7FJ|||L-7F-7F7|L7L7||F-J|F7L-7||L--7LJ|L---77FJ||||FJL--7F7|FJJ.LLJ7FFJ +F-FJ--F7.LJF|7L-FF-J|FJF7||||L7F7F7|F--7L-7FJL----7||FJL-7F-JF7F-7||FJL7|LJF-JL7|||L7|FJ||L-7||L--J|L--7|.FJF7F7L7L-JLJLJF7F7LJLJJJF7LFL-LJJ +|-||LLJJFFLJJ7.F-JF7|L7|||LJL7LJLJ||L-7L7FJL7F---7|||L7F7||F-J||-|||L7.||FFJF7FJLJ|FJ||.LJLFJ|L7F-7|FF7LJFJFJLJ|FJF------JLJL--7JJ.FF7JFFJF7 +J.-J7-F-FFJ7F|.L7FJ||F||||F--JF7F7LJF7L7||F-JL--7||LJL||LJ|L77||FJ|L7L7|L7|FJ|L7F-JL7|L7|F7L7L7||FJL7|L-7L7L-7FJL-JF7F-7F7F7F-7L7-J.|LF-JJ.| +LF-||77.L7L-.|7-LJFJ|FJ|LJ|F--JLJL7FJ|FJ||L7F7F-JLJF-7|L-7|FJFJ|L7|FJFJL7|LJ7|FJ|F7FJ|FJFJL-JFJLJ|F7LJF7|FJF7|L-7F-JLJ.|||||L7|FJ7J.F-JJ|.FF +--.-77FJJ|-7.---J7L-J|FJF-J|F-----J|FJ|F||-LJ|L----JFJL-7|||LL7L7|||FJF-JL--7||-LJ||FJL7L---7|F-7LJL7FJLJL7|||7FJL--7F7LJ||L-JLJ.FFLF77F|77J +L|J.L|FJLL7LJ.L-LF---J|FJF-J|F7F7F7|L7L7LJF7FJF7F--7L--7||LJF-JFJ|||L7L-7F--J|L-7FJ||F7|F--7|LJFJF--JL---7|||L7|F7F7LJL-7LJ-F7JJFFF.|L7JL-J| +.|F|JL|J|.J...|--L7F7FJL-JF7LJLJ||LJ7L7L--J|L7||L7FJF7FJ||F7L-7|FJ|L-JF7|L-7L|F-J|FJ||LJ|F7LJF7|FL7F7F7F7|||L7|||||L7F-7L---J|F-J-L7|--7|JLL +.|-|.LJ7L-J7FF-F.LLJ||F---JL7F7FJL-7F-JF7F-JFJ||FJ|FJ|||LJ|L--J|L7L-7F|LJF7L7|L7FJ|FJL7FLJL-7||L-7||LJ||LJLJF||LJ||||L7|F-7F-JJ.|J--.|FF-7J7 +.|7.|F|||7-7FF-L.|FL|||F---7LJLJF7FJ|F7||L-7L7||L7||FJL--7|F7F7|||F7L7|F7|L-JL-JL7||F-JF----J|L7FJ||F-JL----7||F-JL7|FJ|L7||J|J7J-FL7-F|J|F| +7L7J|L7LJ-FLJJ.|FFF-LJLJF7FJF7F7|||FJ|LJ|F-J-|||FJ||L7F--J||||LJFJ||FJLJ||F7F7F-7LJ|L7FJF7F7FJL||FJ||F7F7F-7|||L7F7||||L-J||||F|...FF--L-FFL +|-F-J.F7J-|7|--J7JJJLF--JLJFJLJ|||||FJF-JL--7LJ||||L7|L-7FJ||L7FJFJ|L-7.|LJLJ|L7L7FJFJL7||||L7FJ|L7|LJ|||L7LJ||LLJLJ|L---7LJ7-JJJFF-|JJ|FFJ| +|.77L-J|-FJF77LLJFF.LL-7F-7L7JFJ|||LJFJF7F-7|F7|L7|FJ|F7|L7||FJL7L7L7FJFJF--7L-JFJ|FJF7LJLJ|FJL7L7|L7FJ||FJF-JL----7L7F7FJJJ|.L|7L..|||.||L7 +||L7-|LLLL7LL|7||F|F|.LLJFJFJFJFJLJF-JFJ|L7||||L7|||FJ|LJFJ|LJF-JFJ7LJ.L7|F7L7F7L7||FJL----JL7FJFJ|FJL7|LJ7L--7F7F7|FJ|LJJJFL|.||.FF-JL-7J-7 +7L|L-J7.F-J7.L7-LJL-77-J-L-J||FJF--JF7|L|FJ|LJ|FJ|||L7L-7L7L7|L7FJLF7F7FJLJL7|||FJLJL--7F7F-7|L7L7||LF|L-7F---J|LJLJ|FJ.|LLJFJFJJF|-7|-LJ.F| +F--J77||JF.FF-J.LFJ..F7FF7F--JL7L-7FJ|L7|L7L7FJL-J|L7|F7L7|FJF-J|F-JLJLJF-7FJLJ|L--7F--J|||FJ|7|FJLJF-JF7|L---7L7J|7LJJ7|J|L--L7FJL-LJ7JL7LJ +F-J-FF||F--7.|F-7J77.LF-J|L7F7FJ7FJ|7|FJL-JFJL--7||FJ|||FJ||LL--JL--7F-7|J|L7F7L7F7|L--7|LJ|FJFJL--7L7FJLJJ.FFJFJF--J.LL|.7.JFL||FJ|.LJLLL-F +.F-LF..F7J7|7|FLJ-FJ-7L-7L-J|||F-JFJFJL7F--JF7F7L7LJFLJLJL||J|-F7F7.||FJ|FJFJ||LLJ||F--J|F-J|FJF7F7||LJF7|-FFL7L-7.-|7|F|7L7FF||7JFJ7F|J7.|F +-7-.LLF7J.F-.FJ-J|J-LJ.LL--7||||F7L7|F7|L--7|LJL7|JLJ.LF--J|-|FJLJL-J||FJL7L7|L-7JLJL-7FJ|F-J|FJ|||L---J|7J|L-L--J7|LFJ-J|.L-F7J..LJFLJ77.-J +J|.L.JLLFF.LL7.|.-77LF7JLLLLJ|||||FJ|||L7F-JL--7LJ7.L77|F7FJ.LL7F7F7FJ|L7JL7||F-JL|JF-JL7LJJFJ|J|||F7F7FJJL-|FJ|LLLL-7J||F-L7.L|F7LLFLLJ7L.| +.-J77J||.|77.|7||LJ-.JJ7.F||7LJ||||F||L-JL7F---JJ.J7J-L||LJJFL|LJLJ|L7|FJ|FJLJL---7FL--7|J.LL7|JLJLJ||||7.77||-JJFJJ-L||F7JF|7F7F|.FF7|.|JJJ +.||F|L-JFLF--L7--.|.|J|.F-7JJ|LLJLJFJ|F7.FJL---7J-|LJJ|LJFJLF-LJJ|LL-J||F7L7F7F7F-J7LJFLJ.|.|LJ7J-J.||LJJ7.F-.7|.LL.|F-.L-.|.|LF|JF|||F-|J7. +LF--J-JF7-|.F-JFL-L|J.F77.LJ.J.FJ.FL7||L-JF7F7FJ7..|.L||LJ7.|J||LJLL|J|||L-J||||||L77L7F|.F-7.JJFF|FLJ.|J-FJ7|-LJ-F-7JF7..LJ.-7|L7LFLL7J|L|. +|LFJ-LLF|F|JJ.FLJLL-7.LF|F|.||-J7LF-J|L--7|LJLJ.|7..-F--7LL-|-FL-JFJ||LJ|F7FJ||LJ--LL---7||L.J.7-L7||JLJ.L7.FLJL77FLJLFL7-L-.L|7-|L77-|-|.|7 +7.|J7|.L|LJF77F7L-J|7.L7|F|--|7L|LL--J|F-JL--7JF|----|J.FJ|FF-J|F-|-7FLJLJ|L7LJ7-J||F-7.-7-|7||L7FLLL7|JF-J-J..F|7|LFJ.|L-F---.7L|||L-|.LL-7 +F-L7LF7.|FFJ|L.FJL7LJ-7J--F77L7F||L|J--L7F7F-J7|||-LJ.FLJ-F|.FFJL7.FLF7JJFL-JL|F77F77-FJ||.FJ-.F-|7LLLJ.FJ|.-7-F|-F-|JF77F-7|L|J--LJJ-|F|L-L +L|JL7F-L-7J7|..L7LFFJJJL7LF77L7JLJ-.L-LFJ||L--7F-L7.F|FL.-LJ--.J7L.J--J7LF-JJF-7J7F777J.F7FL7.F-7L-7.|77L-F|F--7J.J-7-L--||L-.L-JLJJ..L-L--| +|..LL-7J.-.LLF.L|.FJJ...J..L7.LJJLJLJ.LL-JL---J-J..F-L7LFJJJ-|.LJLJJLLLJLLJJLLJLLL-L--J.L|J---|L|JJL7LLL-7-J-|-|J.L-J.J.J.LJ-7J.LL7J..LLJJJ. \ No newline at end of file diff --git a/2/2-1.py b/2/2-1.py new file mode 100644 index 0000000..c64de95 --- /dev/null +++ b/2/2-1.py @@ -0,0 +1,45 @@ +CUBES = {"red": 12, "green": 13, "blue": 14} + + +def get_input(): + with open("two.txt", "r") as f: + return [ + l.replace("Game", "").replace("\n", "").split(":") for l in f.readlines() + ] + + +def get_game_dict(games): + game_dict = {} + for g in games: + game_dict[g[0]] = g[1].split(";") + return game_dict + + +def strip_impossible_games(game_dict): + for num, sets in game_dict.items(): + for set in sets: + cubes = set.split(",") + for cube in cubes: + quant, color = cube.strip().split(" ") + if CUBES[color] < int(quant) and game_dict.get(num): + game_dict[num] = None + return game_dict + + +def get_score(game_dict): + score = 0 + for num, sets in game_dict.items(): + if sets: + score += int(num) + return score + + +def main(): + input = get_input() + game_dict = get_game_dict(input) + game_dict = strip_impossible_games(game_dict) + score = get_score(game_dict) + print(score) + + +main() diff --git a/2/2-2.py b/2/2-2.py new file mode 100644 index 0000000..8a12649 --- /dev/null +++ b/2/2-2.py @@ -0,0 +1,45 @@ +def get_input(): + with open("two.txt", "r") as f: + return [ + l.replace("Game", "").replace("\n", "").split(":") for l in f.readlines() + ] + + +def get_game_dict(games): + game_dict = {} + for g in games: + game_dict[g[0]] = g[1].split(";") + return game_dict + + +def get_game_totals(games): + game_dict = {} + for num, sets in games.items(): + game_dict[num] = {} + for set in sets: + cubes = set.split(",") + for cube in cubes: + quant, color = cube.strip().split(" ") + if int(quant) > game_dict[num].get(color, 0): + game_dict[num][color] = int(quant) + return game_dict + + +def get_total_score(game_dict): + score = 0 + for _, quants in game_dict.items(): + prod = 1 + for quant in quants.values(): + prod *= quant + score += prod + return score + + +def main(): + input = get_input() + game_dict = get_game_dict(input) + game_dict = get_game_totals(game_dict) + print(get_total_score(game_dict)) + + +main() diff --git a/2/2-test.txt b/2/2-test.txt new file mode 100644 index 0000000..1cd7d33 --- /dev/null +++ b/2/2-test.txt @@ -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 \ No newline at end of file diff --git a/2/2.txt b/2/2.txt new file mode 100644 index 0000000..3e16549 --- /dev/null +++ b/2/2.txt @@ -0,0 +1,100 @@ +Game 1: 18 red, 8 green, 7 blue; 15 red, 4 blue, 1 green; 2 green, 17 red, 6 blue; 5 green, 1 blue, 11 red; 18 red, 1 green, 14 blue; 8 blue +Game 2: 16 blue, 12 green, 3 red; 13 blue, 2 red, 8 green; 15 green, 3 red, 16 blue +Game 3: 6 green, 15 red; 1 green, 4 red, 7 blue; 9 blue, 7 red, 8 green +Game 4: 8 red, 2 blue; 11 red, 5 blue, 1 green; 12 red, 1 green, 5 blue; 1 blue; 2 blue, 9 red +Game 5: 9 blue, 3 red, 12 green; 3 green, 4 red, 17 blue; 15 blue, 2 green, 5 red; 3 blue, 5 green, 6 red; 6 red, 4 blue, 7 green; 3 green, 10 blue +Game 6: 11 red, 2 blue, 6 green; 2 blue, 9 red, 4 green; 3 blue, 12 red, 8 green; 5 red, 11 green, 4 blue; 2 blue, 9 red, 13 green; 15 red, 3 blue, 7 green +Game 7: 2 red, 9 green, 12 blue; 14 blue, 1 green, 6 red; 7 blue, 9 green; 9 green, 8 red, 4 blue; 5 red, 3 green, 16 blue; 4 red, 8 green +Game 8: 11 red, 12 green, 1 blue; 4 red, 7 green; 11 red, 6 green; 17 green; 15 green, 1 red +Game 9: 1 red, 1 green, 12 blue; 3 green, 12 red, 6 blue; 14 red, 1 blue; 9 blue, 1 red, 3 green +Game 10: 1 red, 4 blue; 3 blue, 4 green; 3 green, 3 red, 8 blue; 2 blue, 3 red; 3 green, 4 red, 3 blue +Game 11: 8 blue, 1 red; 8 green, 1 red, 1 blue; 13 green, 9 red, 6 blue +Game 12: 2 red, 2 blue, 1 green; 3 red, 1 green; 1 blue, 3 green +Game 13: 12 green, 4 blue; 2 red, 2 blue, 8 green; 6 green, 3 red; 3 red, 5 green; 9 green, 7 blue, 1 red +Game 14: 1 red, 7 green; 5 green, 12 red, 10 blue; 9 red, 11 blue, 7 green; 7 blue, 3 red, 9 green +Game 15: 7 green, 1 blue; 1 red, 2 green, 1 blue; 7 green +Game 16: 1 green, 1 blue; 2 blue, 4 green, 2 red; 2 green, 2 blue +Game 17: 6 red, 11 green, 7 blue; 1 blue, 13 green, 4 red; 4 green, 6 blue, 7 red +Game 18: 2 red, 8 blue; 7 red, 11 blue; 1 green, 16 blue, 7 red; 18 blue, 1 green, 14 red +Game 19: 2 red, 2 blue; 1 green, 6 red; 1 green, 3 red, 2 blue +Game 20: 6 red, 2 blue, 5 green; 4 red, 1 blue, 9 green; 3 blue, 2 red, 9 green; 8 red, 12 green, 5 blue +Game 21: 6 red, 7 blue; 3 blue, 16 red, 2 green; 2 blue, 13 red; 3 blue, 11 red, 3 green; 1 green, 18 red, 6 blue; 12 red, 5 blue, 2 green +Game 22: 9 red, 6 blue, 14 green; 1 blue, 5 green, 13 red; 6 red; 18 red, 4 green; 2 blue, 10 green, 16 red; 1 red, 18 green, 1 blue +Game 23: 6 green, 4 red, 3 blue; 1 blue, 2 red, 9 green; 5 green, 1 red, 3 blue; 5 blue, 4 red, 4 green +Game 24: 1 red, 5 green, 2 blue; 4 red, 7 green, 9 blue; 9 blue, 7 green; 7 green, 13 blue; 4 blue, 1 green, 4 red +Game 25: 13 blue, 10 red, 11 green; 10 green, 1 blue, 3 red; 15 red, 5 green, 8 blue; 19 red, 10 green, 13 blue; 12 blue, 4 green, 16 red; 7 red, 5 green, 9 blue +Game 26: 20 red, 6 blue, 12 green; 15 blue, 17 red, 9 green; 19 red, 6 green, 3 blue; 8 green, 1 red, 15 blue; 10 green, 8 red, 5 blue; 4 green, 20 red, 18 blue +Game 27: 2 blue, 3 green, 7 red; 2 blue, 4 red; 5 blue, 5 green; 8 blue, 6 green, 2 red +Game 28: 1 green, 6 red; 3 red, 3 blue; 1 green, 4 red; 1 red, 2 blue; 2 red +Game 29: 8 blue, 1 green; 7 blue, 1 red; 6 red, 2 blue; 2 red, 3 green; 3 red, 6 green, 5 blue +Game 30: 11 blue, 17 green, 10 red; 9 blue, 12 green, 14 red; 16 green, 2 red, 8 blue; 18 green, 1 red, 1 blue; 5 blue, 7 red, 18 green; 9 green, 3 blue, 11 red +Game 31: 5 blue, 13 green; 2 green, 3 red, 4 blue; 3 red, 15 green, 2 blue; 5 blue, 19 green; 5 blue, 18 green; 3 green, 7 blue, 3 red +Game 32: 12 red, 2 green, 3 blue; 2 green, 16 red, 1 blue; 13 red, 4 green, 6 blue +Game 33: 18 green, 8 blue, 3 red; 15 green, 2 blue, 4 red; 14 blue, 3 red, 6 green; 20 green, 13 blue; 1 red, 19 green +Game 34: 1 green, 7 blue, 2 red; 8 green, 10 blue, 2 red; 3 blue, 1 green, 1 red; 6 green, 13 blue, 1 red; 1 green, 4 blue, 2 red; 1 red, 5 green, 7 blue +Game 35: 7 blue, 8 red; 2 blue, 3 red; 4 blue, 3 red; 7 red, 4 blue; 1 blue, 1 green, 3 red +Game 36: 1 red, 8 green; 1 red, 6 green; 3 green, 8 red; 1 blue, 2 red, 1 green +Game 37: 3 blue, 13 red; 2 blue, 7 red; 5 red, 1 green; 3 red, 3 blue; 1 blue, 12 red, 1 green; 14 red, 3 blue +Game 38: 7 blue, 18 red, 12 green; 11 red, 6 green, 1 blue; 9 green, 1 red; 9 green, 13 blue, 16 red +Game 39: 12 red, 3 green, 2 blue; 3 blue, 3 green, 10 red; 2 blue, 5 red; 2 blue, 1 green; 5 blue, 4 green, 7 red; 2 green, 1 red +Game 40: 1 red, 7 blue, 5 green; 1 red, 4 blue, 8 green; 3 red, 5 blue, 14 green; 10 green, 2 blue, 1 red; 11 blue, 7 green, 1 red; 14 green, 2 blue +Game 41: 8 green, 5 red, 3 blue; 5 red, 4 blue, 12 green; 10 green, 6 blue; 13 green, 7 blue; 1 red, 2 green, 15 blue +Game 42: 17 red, 1 blue, 5 green; 9 green, 16 red; 1 blue, 15 green, 2 red; 1 blue, 12 red, 12 green +Game 43: 12 green, 5 blue; 3 red, 8 blue, 10 green; 8 blue, 2 green, 1 red +Game 44: 1 green, 7 red, 2 blue; 1 blue, 10 red; 4 green, 3 blue, 19 red; 1 blue, 3 green, 1 red; 1 blue; 4 red, 2 green, 3 blue +Game 45: 16 red, 12 blue, 1 green; 13 blue, 16 red, 9 green; 7 green, 3 red, 8 blue +Game 46: 1 red, 17 green, 6 blue; 6 blue, 1 red, 3 green; 12 green, 1 blue; 4 blue, 2 green +Game 47: 2 green, 12 red, 15 blue; 9 blue, 2 green, 2 red; 3 green, 6 blue, 2 red; 11 blue, 3 green, 5 red; 6 green, 9 red, 17 blue +Game 48: 5 blue, 6 red; 7 green, 14 red, 4 blue; 2 green, 5 blue, 2 red; 11 blue, 5 red, 5 green +Game 49: 7 green, 7 blue, 4 red; 11 green, 12 blue, 2 red; 12 blue, 4 red, 9 green; 3 red, 8 blue, 17 green; 16 green, 3 red, 14 blue +Game 50: 5 green, 4 red, 10 blue; 7 green, 14 red, 5 blue; 12 red, 18 blue, 14 green +Game 51: 12 green, 3 blue; 10 green, 4 blue, 2 red; 3 green, 5 blue +Game 52: 12 green, 6 red, 7 blue; 20 green, 6 red, 18 blue; 1 green, 5 blue, 11 red; 2 green, 15 blue, 6 red +Game 53: 6 red, 2 green, 5 blue; 13 green, 1 blue, 14 red; 7 green, 1 blue; 3 green, 4 blue, 6 red; 10 red, 6 green, 4 blue +Game 54: 4 blue, 1 red; 1 red, 1 blue, 9 green; 3 red, 2 blue, 4 green; 3 green, 2 red, 5 blue; 9 blue, 2 red, 7 green +Game 55: 7 blue; 6 blue, 1 red; 4 red, 7 blue; 3 red, 3 blue, 1 green +Game 56: 2 green, 7 blue; 3 red, 10 blue; 1 green, 2 red; 3 red, 8 blue, 4 green; 1 green, 11 blue, 3 red; 2 green, 8 blue +Game 57: 3 red, 1 green; 1 green, 1 red, 1 blue; 1 red, 4 green, 15 blue; 9 blue, 2 red, 1 green +Game 58: 12 blue, 13 red, 5 green; 2 blue, 6 green; 12 red, 15 green, 7 blue; 5 red, 4 green, 14 blue; 15 red, 2 green, 9 blue +Game 59: 5 green, 5 blue; 4 red, 6 blue, 2 green; 5 blue, 3 green, 6 red; 3 red, 6 green, 4 blue; 3 blue, 7 green, 10 red +Game 60: 1 red, 1 blue, 3 green; 1 red; 3 green, 6 blue; 6 blue +Game 61: 7 green, 1 red, 1 blue; 4 red, 3 green, 1 blue; 7 blue, 7 green; 11 blue, 2 green, 5 red; 5 red, 4 green, 5 blue +Game 62: 17 green, 2 red, 3 blue; 1 red, 3 blue, 2 green; 1 green, 3 blue, 2 red; 1 red, 17 green; 2 red, 15 green, 4 blue; 5 green +Game 63: 2 green, 4 red, 3 blue; 9 blue, 10 red; 1 green, 13 blue, 2 red; 2 green, 1 blue, 5 red +Game 64: 6 red, 8 blue; 3 red, 6 blue, 5 green; 13 red, 11 blue, 8 green; 11 red, 3 blue, 1 green +Game 65: 4 green, 1 blue, 2 red; 3 blue, 3 green, 11 red; 6 green, 3 blue, 3 red; 5 red, 4 blue; 8 red, 5 blue, 2 green +Game 66: 10 green, 13 red; 1 blue, 2 red, 4 green; 7 red, 7 green; 19 green, 9 red, 1 blue; 16 green, 16 red, 2 blue; 10 red, 11 green +Game 67: 3 blue, 4 green, 2 red; 6 blue, 19 red; 4 blue, 2 red, 5 green; 4 green, 5 blue, 1 red +Game 68: 13 blue, 15 red, 7 green; 5 blue, 20 red; 6 green, 12 blue, 8 red; 5 blue, 8 green +Game 69: 13 red, 13 green; 13 green, 3 red, 1 blue; 8 green; 9 green, 9 red +Game 70: 8 blue, 11 red, 2 green; 12 red, 2 blue; 13 red, 6 blue, 3 green; 7 blue, 3 green, 5 red; 15 red, 1 blue, 3 green +Game 71: 7 red, 9 green; 4 blue, 9 green, 7 red; 4 blue, 2 green; 6 blue, 2 red, 9 green +Game 72: 14 blue, 1 green; 4 red, 1 green, 9 blue; 6 blue, 8 red, 2 green +Game 73: 17 green; 10 blue, 2 red, 9 green; 1 green, 10 blue, 2 red; 8 blue, 1 red; 5 blue, 16 green +Game 74: 12 green, 6 red, 5 blue; 2 red, 4 blue, 10 green; 3 green, 4 blue, 2 red; 8 green, 2 red, 5 blue; 5 red, 2 blue, 2 green; 6 green, 1 red, 1 blue +Game 75: 4 blue, 19 green; 15 blue, 7 green; 18 blue, 5 green, 7 red; 16 green, 15 blue; 7 red, 4 green, 13 blue; 9 green, 13 blue +Game 76: 1 red, 2 green, 7 blue; 13 blue, 7 green, 1 red; 13 blue, 5 red +Game 77: 3 red, 10 blue, 6 green; 1 green, 2 red, 10 blue; 7 green, 1 red +Game 78: 11 green, 2 blue; 6 blue, 8 red, 5 green; 10 red, 6 green, 4 blue; 6 blue, 3 green, 10 red; 5 green, 6 red +Game 79: 4 red, 6 blue, 1 green; 1 red; 2 green, 3 blue, 4 red; 4 red, 1 green, 2 blue; 2 green, 1 red +Game 80: 2 red, 1 green; 1 red, 1 green; 7 red, 1 green; 1 blue, 7 red, 3 green +Game 81: 1 blue, 15 red, 4 green; 2 green, 12 red; 4 green, 13 red; 1 blue, 3 green, 13 red; 12 red, 2 green, 1 blue; 3 green, 8 red, 1 blue +Game 82: 18 red, 4 green, 1 blue; 14 red, 1 green, 2 blue; 10 red, 2 blue, 7 green; 13 red; 3 red, 7 green, 1 blue; 5 red, 4 green +Game 83: 4 red, 10 green, 5 blue; 2 red, 12 blue, 13 green; 19 blue, 9 green, 1 red; 2 red, 14 blue, 3 green; 13 green, 8 blue, 5 red +Game 84: 12 blue, 7 red, 9 green; 1 blue, 1 green, 14 red; 1 green, 8 red, 11 blue; 11 blue, 12 red, 3 green; 11 blue, 8 green, 13 red; 7 green, 7 red, 10 blue +Game 85: 10 red, 2 blue; 11 green, 9 red, 4 blue; 3 red, 5 blue, 13 green; 5 red, 5 green; 5 red, 2 blue, 4 green; 11 green, 4 blue, 19 red +Game 86: 1 blue, 6 green, 2 red; 1 red, 1 blue, 8 green; 3 red, 1 blue, 4 green; 1 green, 4 red; 9 green, 2 red; 6 green, 7 red, 1 blue +Game 87: 8 green, 8 blue, 4 red; 5 red, 2 blue, 10 green; 3 red, 13 green; 1 red, 3 blue, 4 green +Game 88: 3 blue, 9 green, 3 red; 2 blue, 15 green; 2 red, 9 green +Game 89: 9 red, 6 green, 15 blue; 10 blue, 7 red, 2 green; 7 green, 16 blue, 4 red +Game 90: 1 red, 1 blue, 7 green; 7 green, 1 blue, 8 red; 3 red, 1 blue, 1 green +Game 91: 1 green, 2 red, 6 blue; 4 green, 4 red, 3 blue; 4 red, 11 green, 4 blue; 3 blue, 5 red; 8 green, 2 red, 8 blue +Game 92: 2 red, 3 blue; 3 blue, 2 green, 2 red; 9 red, 3 green +Game 93: 2 blue, 5 green; 2 green, 5 blue, 3 red; 2 green, 5 blue, 1 red; 7 blue, 4 red, 9 green +Game 94: 1 red, 9 blue, 14 green; 6 green; 2 blue, 11 green; 4 blue, 16 green, 1 red +Game 95: 10 green, 2 blue, 7 red; 4 blue, 4 red, 6 green; 3 red, 2 blue, 3 green +Game 96: 12 red; 3 green, 10 red; 6 blue, 14 red, 2 green; 7 green, 15 red; 3 green, 3 red, 1 blue; 5 blue, 1 red +Game 97: 3 red, 1 green, 1 blue; 1 green, 3 red; 4 red, 1 green +Game 98: 4 red, 5 green, 6 blue; 2 red, 9 green, 6 blue; 2 blue, 11 red, 14 green; 6 green, 4 blue; 11 blue, 11 red, 8 green +Game 99: 2 green, 20 blue; 12 blue; 3 red, 12 blue; 7 blue; 3 green, 10 blue, 2 red; 3 red, 2 green +Game 100: 2 blue, 8 green, 12 red; 2 green, 13 red; 2 red, 4 green; 2 green, 7 red; 10 green, 5 red, 1 blue \ No newline at end of file diff --git a/3/.python-version b/3/.python-version new file mode 100644 index 0000000..0c7d5f5 --- /dev/null +++ b/3/.python-version @@ -0,0 +1 @@ +3.11.4 diff --git a/3/3-1.py b/3/3-1.py new file mode 100644 index 0000000..81aa7b6 --- /dev/null +++ b/3/3-1.py @@ -0,0 +1,92 @@ +def get_input(): + with open("three.txt", "r") as f: + return f.readlines() + + +def get_neighbours(coords, lines): + y, x = coords + neighbours = [] + if x > 0: + neighbours.append([y, x - 1]) + if y > 0: + neighbours.append([y - 1, x - 1]) + if x < len(lines[y]) - 1: + neighbours.append( + [ + y, + x + 1, + ] + ) + if y < len(lines) - 1: + neighbours.append([y + 1, x + 1]) + if y > 0: + neighbours.append([y - 1, x]) + if x < len(lines[y]) - 1: + neighbours.append([y - 1, x + 1]) + if y < len(lines) - 1: + neighbours.append([y + 1, x]) + if x > 0: + neighbours.append([y + 1, x - 1]) + return neighbours + + +def get_all_neighbours(coord_range, lines): + neighbours = [] + for coords in coord_range: + neighbours += get_neighbours(coords, lines) + return neighbours + + +def get_full_num(start, lines): + y, x = start + num = lines[y][x] + end = -1 + # assumes that the number is at most 4 (3?) digits long + for i in range(int(x) + 1, int(x) + 4): + if i >= len(lines[y]): + end = i + break + if lines[y][i].isdigit(): + num += lines[y][i] + else: + end = i + break + return num, [[y, i] for i in range(x, end)] + + +def is_symbol(chr): + return chr in ["+", "-", "*", "/", "#", "&", "$", "@", "=", "%"] + + +def add_component_numbers(lines): + nums = [] + for i in range(len(lines)): + # in_last_num prevents double counting of numbers + # e.g. 123, 23, 3. + in_last_num = [] + for j in range(len(lines[i])): + current = lines[i][j] + if current.isdigit(): + # if this is a continuation of the previous number: + if current in in_last_num: + in_last_num.pop(0) + continue + # if this is the start of a new number: + full_num, coord_range = get_full_num([i, j], lines) + # add the new number's digits to in_last_num, minus first digit + in_last_num = list(str(full_num))[1:] + neighbours = get_all_neighbours(coord_range, lines) + for n in neighbours: + if is_symbol(lines[n[0]][n[1]]): + nums.append(int(full_num)) + break + return nums + + +def main(): + input = get_input() + nums = add_component_numbers(input) + print(sum((n for n in nums))) + + +main() diff --git a/3/3-2.py b/3/3-2.py new file mode 100644 index 0000000..f293369 --- /dev/null +++ b/3/3-2.py @@ -0,0 +1,96 @@ +def get_input(): + with open("three.txt", "r") as f: + return f.readlines() + + +def get_neighbours(coords, lines): + y, x = coords + neighbours = [] + if x > 0: + neighbours.append([y, x - 1]) + if y > 0: + neighbours.append([y - 1, x - 1]) + if x < len(lines[y]) - 1: + neighbours.append( + [ + y, + x + 1, + ] + ) + if y < len(lines) - 1: + neighbours.append([y + 1, x + 1]) + if y > 0: + neighbours.append([y - 1, x]) + if x < len(lines[y]) - 1: + neighbours.append([y - 1, x + 1]) + if y < len(lines) - 1: + neighbours.append([y + 1, x]) + if x > 0: + neighbours.append([y + 1, x - 1]) + return neighbours + + +def get_full_num(coord, lines): + y, x = coord + y, x = int(y), int(x) + num = lines[y][x] + + # start at x + 1, go right until you hit a non-digit or end of line + for i in range(x + 1, x + 3): + if i >= len(lines[y]): + break + if lines[y][i].isdigit(): + # append to end of num + num += lines[y][i] + else: + break + # start at x-1, go left until you hit a non-digit or start of line + for i in range(x - 1, x - 3, -1): + if i < 0: + break + if lines[y][i].isdigit(): + # add to start of num + num = lines[y][i] + num + else: + break + return num + + +def get_num_neighbours(coords, lines): + neighbours = get_neighbours(coords, lines) + num_neighbours = set() + for neighbour in neighbours: + y, x = neighbour + if lines[y][x].isdigit(): + # this would be bad if there were two equal numbers around one gear + # should really add coord ranges to a list of 'registered_nums' + # rather than relying on a set + num_neighbours.add(get_full_num(neighbour, lines)) + return num_neighbours + + +def find_gears(lines): + gears = [] + for y, line in enumerate(lines): + for x, chr in enumerate(line): + if chr == "*": + num_neighbours = get_num_neighbours([y, x], lines) + if len(num_neighbours) == 2: + gears.append(num_neighbours) + return gears + + +def get_ratios(gears): + sum = 0 + for g in gears: + sum += int(g.pop()) * int(g.pop()) + return sum + + +def main(): + input = get_input() + gears = find_gears(input) + print(get_ratios(gears)) + + +main() diff --git a/3/3-test.txt b/3/3-test.txt new file mode 100644 index 0000000..b20187f --- /dev/null +++ b/3/3-test.txt @@ -0,0 +1,10 @@ +467..114.. +...*...... +..35..633. +......#... +617*...... +.....+.58. +..592..... +......755. +...$.*.... +.664.598.. diff --git a/3/3.txt b/3/3.txt new file mode 100644 index 0000000..4c9a7f3 --- /dev/null +++ b/3/3.txt @@ -0,0 +1,140 @@ +48.................501....33.....622..............763.........331.................161.683......................................980.......... +...491.842.....948*..................338.....*......=...........-...309.......633*....*....................*990...706...452......*..+....... +...*...*....................426........*..408.........................*............659...............250.........&.......*.....767...403.... +363.....961...959#.508*223......843.406..........690................%..479.....................398.../....*............458.................. +......=.........................................*....@946........767.........907=.................@....158.850..+670..............10*790.... +.......39.306...679.%113...............665....874....................597...................861.........................840...855............ +.................*.........864.....154*....#..............1*......4..........341..................731*..........783.....#.......*204........ +..919...........706.....*......891........840..%473.........379....*149........-..115..519............668..........*423..................... +...*.................398.190......$.............................#.......=.%530......$..*..............................................475... +.543...@.............................834..729.&.........146......789.189........511...17........455*308..662.............530................ +.....142....437....138*755..&53.....*..........783........./.......................*......................................./....674..315.... +..........-./.......................826...%.....................752........414......480.................276.952...................-...*..... +.......131.......*654..590.................819..........$..........-.347*..................294.....776...&...*........741.....830....230.... +..586%.....968...........+..........319..............628......516............933..........&........+..........600.....*........*............ +............*...................-..*.........................%........................726...876..........772..........99......145......785.. +...........710...............352...842..941...802.....133............474.&235.................*.............*561..........#...........*..... +.......................................=...............*........=...................642.......774......*.........67..@921.374.......165..... +..250........................8..........................968...375........224...#.......*............497.833........-........................ +...$.....................584..*978..107&....471...............................486....408......................................@241.-555..... +......662$........%......&.....................*..#186...550........=309............................76.......399............................ +................281.........808....666.......207.........-...615.................59=....569.....197*...42...%...........572....+231...%..... +....758.$777................%.....*...............433................646.834.............@.............*.........543...................769.. +....*................995...........628...............*..................*..............=..........341...583.112+...*.......74..=341......... +.....775.................................744...278.128.......................126...940.839....=.....*............385.499...*............302. +..........*177...574.............+.......+......*................561#...590.*......$.........231...586....................212...........#... +.......418....................954..433.......484...........526...........*..643......-......................&..778...............701........ +.414..............493.....566.....*......=..................*....236...748..........543...593...*745.......57.........&.........*........... +....*................*.....*....46....659..%.&980..........66....................36...........87...................994.......218...443...... +226.241.893%..........257..312............69........792............/...........+...................$257..................790........./...184 +................................................854*.............909.139..*276.680..&.........432............580....248.................*... +....136*755...@.950......................173.............95..........+...............2.877.......*668......+..+.........918*.......62....571 +............333.*....812...$.428.................*496..................903@...258&.............-........650.................281......+...... +......500.......6....*...719.+......285.......955.....712*12..561.497..............667...&.843..777.................427................@.... +.....&............506..................=..359................#....................*.....24.../.........544.436..........492=........272..... +.........377..........=............41-......+...........229........761...540....391..............*565.....*......449..........665.......#... +.887....*.....906..141.....357...$.................%......*.................#.............-..874......811...9.....*....$113......*.967...628 +......406............../.......637.551....223....162.......251...........................702.*......%......*....&.905.........747........... +....*...........321.....801............=.....-.#...............390........845..12............399...126....283.566.....124*102......&........ +..447..+....935...-..............41.68.87.92...105....178=....*..........*.......*..92..............................................21...... +......505...................................*................614....948..237..512......108.58..162...454@...........395.......5............. +...........454..10.../............101........885.......................*..................*...*....................*........................ +..........%....*....534......114.*................../.95......427.210..674.......371.903......81....................922.....231...346....... +...525........887...........#........162....211..166..@......*.....*.......281......*....................835.635............*.....*.....828. +.....*..............571...............+........-.............933.629./25..*...........977........*............*...........178.....749..*.... +..993.........-................516/................394...56................477....545.*.......251.858......499....435.........&.........170. +.......967..73.....&.....35.........656....842.....*......*........................*...749............%..........#...........622............ +......+...........366.86..*...........#.....=.....162...332.............-..........859............102..488.........................717...... +347.........32........#....393.................*.................252...262....951.......823...................784...358.603.......*.....515. +......917..*.....$..........................642.394..195...*..................*....$......*.448.519................*......*....302..870.*... +...-..*...674.....780.547....287....................*....504...................803.688.831....*..*...........617......./..476........*...9.. +.286..738................#.......-511..11.....581..268.....................439.............523..459...............69..373............887.... +......................*...................555*.........45....638...964.......-...$..........................................88*............. +.........802...+805.77.648.....66.676........................&..../....26......708...+.-981...239%........953..................672.......... +......./.....#.............11.+......*....=...........756.............*.....-......298..................=...*..751.......433.........727.... +....553.......659....907...@......@..530.218.............*......259..821...716.980..........89..851...793.614.......943....*.....961*....... +........*339........$..........373...............................*...............$.....667..$......*..........149.....+..613................ +..987..................*...................670...105.....347....383.605..................@....447...124..........*737...........562..15*445. +........-.....595*7..215.839.781.............*..*...........$.............810....*............*...........350....................*.......... +.........929.............*......*...362@...890...975....#..........2....../...252.576.......78...........+........685.240......695.......... +.................475......598.152........................841.&880..#......................&....693....=.............=.....28........&384.... +............472..*.......................$..320.412*...................304...=.-.........395......=.113....601.............................. +..324.738.........968...................755..*......101.......476..........90..342........................*.....638..182/...........704..139 +.........*..610*......601...................356.../.......633*....971..........................806.....#...240...*...................../.... +........683.....326.....*..@........749.........390.........................163@....800..483..*........792.....94........................... +...600................957..741...../....376............817..899.......194........50.....@....96.368..................@.......+600....-...... +..........338%..........................*...............#....#.........*....304..+....*...........*...................236............284.... +..423........................&763.............947.................371.187..*.......356.441......201.......................285............... +............75................................*....................*......696........................#...............................670.... +...*..........*.........426.......635..-....449.758*.......314.......*..............................246.........*................58..*...... +574.322........937.......*........#...116...........40.......*.@752..400........180....@......918.........195.49......983....559*.....82.... +...........*.........527..842.............................817...................../.270...445..*............*............................... +........622.235..869*..........922*...............125*610..............*459...............&....455...........21.......964................... +...................................465..%542.........................47......272............+..........775.............*.....328.....@...... +.................732*........51.&..........................853.222.........................672....148....+.........572..499.+....*....12.... +....125..............581....*...909.787.......720*263......*....$..881%....623*891..515..........=..................*.........726.78........ +.....%..........715......935.........*....650............874.......................*.........127....................923..................... +................$.............330*..444....$....653............%....345..915.....960.395...........823.706..734.341...............295...342. +.............................................99..-...........465...&......*.............*416......*..........@....*...@......630.....*...... +.....@.........356.......................399.+......+.....................349..................542..............853.375.......=.......132... +....77...=719.@.......*...../662...........*...233...781..............................&687................%................................. +.....................791..................933.*..........931.....884*...........-...................../...112..%601..........857............ +583.....*292...................................438...................424......603.416.........484...104.....................*.......706..... +.............................452.......549.............24...997....................*............*.........767...379..........192............ +........413.................&.....#......*....*.......*.........523.........443.412.....546......859..138*........&..66.576................. +..................../...........348....816.106.391......................447.........../...*..895.......................*................595. +...........#......771.675..................................673............*........176...856..=...627*308..696...............658............ +....489..51...174......%..676......$..........*........332.*.............373.350................-..........*.................*.....*........ +181.*........*...............*822.136..888.642.202.......*..65....958........*........358........510.....*..504..747...993....339..764...... +...........540........................................308...........@.895..942.506......*....791.......166......#...../..../...........668.. +...................452............-....631..............................*........&.....253..../............897......*....602................ +..748....249.24............21...847...&.....194...@...............@...865................................=....*.....550..................... +....*.......*.....658...................573*.......679.....760/..431.................481..........907....130.912...............240...998.... +.605...............*.......25.......#..................................726..646....#..........607..*................698..........*...+...... +...........301&.572........#.....101...................148........55...........*.122........./........953..........-.....602.321.929.....998 +511.870...............@....................808.........*........*............257.......206............@........685..........*............... +.............903...398.....588......114.......*...990...677.....182.10$...........%.........%.................%........................2*... +................*...........*...490...........987....=......803.........98......485.493.868..945.805......-........89............=944....296 +......640.......669.........630..*.......................-....&..582.......341.........*.........*.........939......*....................... +.........*34....................557.....130....265.....21........*...625..$...............*796..690................997...489....293......... +....917.......916............@.................*.................948..&...........148...67..................833........./..........-...943.. +....$........*......849...4$..300..217........58..........................643.170........................................................... +.........511..853......*..............*...........355.............35-.....-....@..636.....=...595..131...496..........................=687.. +............%........&..476......452...435.....%...*.....700..........391........*.....418.........*.........39*.&.......................... +.16...=.............500.....................426...469.....*.............&.....#..522.............939..............395.660................... +...*.696.....*869........995.....413...................864.................991.......598......42.........................@..806..386........ +337.......983.....610........104*.......100*......................-............$79....@...461*....*685...270................*...*........240 +......................207...........311.....741..................337.........*.................381.......*........979.....712.374.879....... +.......@.....554.........*.....485.....................853.............*..276.230...........7...........740...755*..................-....... +....927.../.....#...#...46........*466...........=.................=.531...........593......*..%....................961.....@............... +..........65......294..........................30..339..856.....966...........904..........791..841..........438.......#...747.............. +..419...................614................972.......*...............131.......=.......................716..........21...................... +.....=.79..............................&....*......76.....243..............115.......757...364..870....&...890......+...840..........55..... +....................383....*48...571...124...749............*................-..&.....*......*...*........@.....................201./....... +......752.....470.......+..........*........................964.......452........776...413...9..791...257.......687.....84......*........... +.........*502.*......873..850..573..729....@.....197....................*...798.........................@......*........&.....65...200..357. +...............307.............*..........597.....*...473.....=.......332....*..311..861*399...................472..................*.../... +.820.....................65....754.............713......*.....739...........622...............768/..................................967..... +....*.......180..........*...*.........218...............260......................519...933..........271.....36....132.....147.............. +.935..4......@..254...815..58.689.......*..........................159..............$...*..........*....&...$.......*......../.414*164...... +.......-.388.......%....................284...........833...770...*...........705.....697.......466.239.......332....489.................... +....#.....*...........@.......288............972.........-.*......723.....*....*................................*............=..........592. +...535..........*.267..193.......*..367.....*..............132............509..776.790..@....466..........715.758...*115.....608............ +.............979..*..........8.353.....*...329...@544.913..........................*.....759.*......704..%............................712... +...................52..170...*......459................/...#.......161........813.510.........207......@..........581..................*.... +............#...........*..978...........581.9*815..........450...............*.......................................604.......308...725... +............16.........269............../.............195........217*216......890......................534.....84......-......-............. +....339...........................459.......644..........*.........................636.....113...%154...*....................127.....#348... +349...*.............402...735......@................182.121...134........%255.276...%...&.../............460....#......79................... +....503....22.............#.....$............38.....+...........*....-11.......*......326...../....*853.........216......*.../180.....16.... +..........*......92.............456..619......*..-...........=...103..........190..........353..982......25*........465.209................. +...485.350..........949...994.......*....379..3.22........972.........713.734.........262...........$.......846.......*.............333-.... +....................*..../....*121.729..+............325.............*.......*..........*........374..............+..769.....811............ +......-..............788...488....................................851....679......*......487.....................368.........*........*..... +....612..528...255.................364.....................130.................317..251...............................665.206..972.957.184.. +..........*..../.......337..475*......&..391...347...795....*.........................*......722..666...............@....................... +........823.$.....+.../.........716......*........*....*.....247......329...........697......*.....*....%.....168....624.........592........ +...98*.......916..915......245............277..&..353...719..........$.....................846.601.37...47......................*......519.. +......91..............720..*........$985......976......................834...........461.........*...........................266....#...*... +68....................*....45..............&...........79*888.250*461.*.......%................574..........3*....408..380........383.192... +...........836......383...........557.....672..........................764.....944............................827........................... \ No newline at end of file diff --git a/4/4-1.py b/4/4-1.py new file mode 100644 index 0000000..2826fa8 --- /dev/null +++ b/4/4-1.py @@ -0,0 +1,37 @@ +def get_input(): + with open("four.txt", "r") as f: + return [l.strip().split("\n") for l in f.readlines() if l != ""] + + +def get_score_for_card(scratchcard): + winning, actual = scratchcard[0].split("|") + winning = winning.split(":")[1].split(" ") + actual = actual.split(" ") + score = 0 + for w in winning: + if w != "": + if w in actual: + if score == 0: + score = 1 + else: + score = score * 2 + return score + + +def get_total_score(scractchcards): + score = 0 + for card in scractchcards: + points = get_score_for_card(card) + score += points + return score + + +def main(): + scratchcard_dict = get_input() + score = get_total_score(scratchcard_dict) + print(score) + + +main() + +# 26218 diff --git a/4/4-2.py b/4/4-2.py new file mode 100644 index 0000000..66dceb9 --- /dev/null +++ b/4/4-2.py @@ -0,0 +1,55 @@ +def get_input(): + with open("four.txt", "r") as f: + return [l.strip().split("\n") for l in f.readlines() if l != ""] + + +def get_score_for_card(scratchcard): + winning, actual = scratchcard[0].split("|") + winning = winning.split(":")[1].split(" ") + actual = actual.split(" ") + score = 0 + for w in winning: + if w != "": + if w in actual: + score = score + 1 + return score + + +def get_scores(cards): + card_dict = {} + for card in cards: + card_num = str(card[0][5:8]).strip().replace(":", "") + score = get_score_for_card(card) + card_dict[int(card_num)] = {"score": score, "copies": 1} + return card_dict + + +def increment_copies_for_card(card_dict, card_num): + score = card_dict[card_num]["score"] + for i in range(1, score + 1): + if card_num + i > len(card_dict.keys()): + return + card_dict[card_num + i]["copies"] += card_dict[card_num]["copies"] + + +def sum_copies(card_dict): + return sum([card_dict[i]["copies"] for i in card_dict.keys()]) + + +def increment_copies(score_copies_dict): + for card_num in score_copies_dict.keys(): + increment_copies_for_card(score_copies_dict, card_num) + return score_copies_dict + + +def main(): + scratchcards = get_input() + score_copies_dict = get_scores(scratchcards) + score_copies_dict = increment_copies(score_copies_dict) + total_scratchcards = sum_copies(score_copies_dict) + print(total_scratchcards) + + +main() + +# 9997537 diff --git a/4/4-test.txt b/4/4-test.txt new file mode 100644 index 0000000..71f208a --- /dev/null +++ b/4/4-test.txt @@ -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 \ No newline at end of file diff --git a/4/4.txt b/4/4.txt new file mode 100644 index 0000000..6f6e972 --- /dev/null +++ b/4/4.txt @@ -0,0 +1,201 @@ +Card 1: 58 96 35 20 93 34 10 27 37 30 | 99 70 93 11 63 41 37 29 7 28 34 10 40 96 38 35 27 30 20 21 4 51 58 39 56 +Card 2: 64 84 57 46 53 86 90 99 59 70 | 99 59 30 83 84 70 31 57 6 29 18 82 15 88 86 53 51 64 32 47 44 46 80 39 90 +Card 3: 55 87 51 18 86 5 66 83 92 95 | 73 68 49 57 29 14 41 42 65 10 84 34 67 44 6 48 61 13 28 38 52 19 78 64 11 +Card 4: 52 21 59 78 18 42 46 91 31 10 | 48 83 13 68 42 72 4 10 6 36 63 81 21 94 8 3 78 53 2 47 62 77 56 97 7 +Card 5: 8 79 31 1 26 57 90 62 93 10 | 26 70 73 6 16 15 93 57 34 56 87 31 10 45 1 22 79 77 90 47 42 58 41 62 8 +Card 6: 90 75 24 69 81 93 39 38 96 33 | 2 78 68 31 99 35 49 66 36 84 54 27 43 80 50 3 22 74 60 98 57 83 13 82 91 +Card 7: 74 86 51 70 28 54 6 34 48 53 | 51 82 34 74 40 24 42 66 20 61 84 15 89 62 69 48 95 31 93 52 76 12 90 75 99 +Card 8: 54 44 69 6 51 24 84 39 20 99 | 89 93 96 85 18 94 15 87 72 67 5 52 45 43 55 65 14 47 30 61 82 41 76 29 38 +Card 9: 26 44 60 20 11 15 16 95 18 47 | 71 56 10 57 65 90 32 30 13 42 19 55 29 12 89 91 2 67 79 58 99 4 81 41 69 +Card 10: 68 65 79 3 44 55 12 71 47 84 | 47 65 93 4 71 23 17 30 59 85 3 28 95 36 88 12 7 97 68 62 84 21 79 61 44 +Card 11: 96 57 36 49 80 73 3 60 11 53 | 83 78 6 39 42 4 96 84 3 80 95 60 97 57 49 66 27 93 31 45 86 90 50 9 73 +Card 12: 85 69 14 3 54 56 61 43 77 80 | 84 8 53 72 9 24 52 88 40 2 95 31 34 90 61 70 89 97 58 56 14 65 98 38 3 +Card 13: 69 29 79 83 89 94 44 68 15 35 | 37 39 29 55 2 82 96 42 73 32 31 79 8 53 88 40 44 49 69 94 87 62 41 81 89 +Card 14: 27 40 19 34 91 84 98 49 21 68 | 58 94 2 1 55 53 52 44 98 8 75 46 50 79 9 56 43 67 10 3 11 19 69 95 17 +Card 15: 3 47 44 77 95 25 60 65 93 53 | 15 40 3 93 33 44 60 19 62 90 35 50 30 65 10 94 38 47 1 29 56 46 99 91 42 +Card 16: 96 27 10 19 93 22 87 53 97 1 | 52 36 77 72 13 61 48 22 94 5 76 51 62 4 41 81 11 17 79 64 40 24 54 23 33 +Card 17: 58 74 26 97 13 61 88 82 89 22 | 9 90 82 88 61 80 3 95 94 81 75 34 71 98 89 74 97 14 47 22 64 52 73 45 35 +Card 18: 29 90 8 16 69 48 40 21 18 9 | 79 26 84 12 40 36 85 19 69 25 21 9 13 16 83 4 22 90 54 97 17 2 89 73 50 +Card 19: 10 66 52 31 72 16 62 1 58 5 | 59 36 75 11 73 92 91 12 37 9 40 52 85 53 24 69 57 82 99 35 27 34 3 2 77 +Card 20: 96 5 9 50 28 34 80 2 36 43 | 90 77 12 17 75 24 32 67 28 22 73 23 68 84 6 25 96 95 85 9 11 36 49 39 98 +Card 21: 84 16 48 91 50 1 94 45 8 88 | 45 96 15 85 62 81 77 61 92 22 76 52 59 36 73 80 64 72 89 79 93 82 83 60 67 +Card 22: 21 46 26 27 28 3 8 44 32 24 | 76 6 90 80 26 11 83 2 18 81 93 95 53 85 31 78 66 35 5 1 56 65 89 14 94 +Card 23: 58 52 2 38 5 63 8 20 99 73 | 23 29 97 91 43 1 37 95 89 80 94 41 22 72 77 62 85 4 24 16 10 39 88 56 19 +Card 24: 36 94 57 12 16 64 4 62 39 41 | 19 6 72 9 17 46 68 34 28 80 59 74 18 13 76 77 43 82 48 58 5 52 30 25 23 +Card 25: 19 14 23 16 7 35 57 40 83 80 | 80 85 7 68 91 22 40 49 35 87 83 93 19 57 23 84 14 16 18 51 77 69 28 54 56 +Card 26: 25 58 34 14 13 30 56 22 97 6 | 38 13 97 24 94 88 30 77 14 34 73 6 44 17 26 57 47 22 31 85 58 56 25 96 10 +Card 27: 41 64 75 24 62 67 45 99 73 27 | 33 9 14 5 32 50 54 20 46 4 45 71 26 59 58 22 7 30 96 34 48 37 23 15 85 +Card 28: 89 90 33 58 59 69 49 72 2 32 | 79 43 28 97 72 92 58 59 31 33 44 89 71 90 11 80 51 2 30 32 69 82 77 49 95 +Card 29: 15 6 27 80 12 2 36 34 64 58 | 15 38 53 34 32 47 64 16 60 2 3 14 62 80 79 27 12 36 6 85 58 33 69 24 57 +Card 30: 54 63 65 76 87 6 47 89 10 79 | 87 73 12 10 92 86 39 76 79 6 97 67 84 47 65 54 22 51 19 31 9 37 89 82 63 +Card 31: 23 96 48 30 75 9 72 11 78 62 | 75 24 23 1 14 72 54 2 47 95 48 18 50 12 94 78 9 96 34 30 11 98 46 62 66 +Card 32: 41 27 4 60 29 24 82 31 17 26 | 4 40 59 27 70 37 60 77 31 46 99 43 61 67 45 5 73 35 30 33 41 17 24 29 76 +Card 33: 90 49 23 13 57 1 72 5 20 81 | 61 20 51 83 54 85 8 23 17 7 1 49 39 11 92 27 90 76 10 25 57 93 13 81 66 +Card 34: 12 16 36 14 17 73 97 74 83 11 | 76 91 97 26 36 12 10 73 85 7 17 14 25 29 80 16 74 32 60 94 83 11 67 37 35 +Card 35: 92 80 27 26 61 91 28 66 15 76 | 19 64 36 42 70 77 27 91 29 66 61 18 58 15 32 8 68 67 92 80 93 76 28 26 48 +Card 36: 70 49 5 86 84 71 72 40 22 47 | 98 68 10 75 88 16 61 17 21 91 14 48 44 73 81 2 82 83 80 93 87 59 92 41 34 +Card 37: 18 9 71 88 72 74 33 50 4 40 | 96 72 41 21 40 33 18 73 91 53 71 74 46 61 80 12 88 36 70 26 66 69 39 38 9 +Card 38: 52 91 3 1 58 80 78 15 99 25 | 70 55 27 59 62 56 78 97 91 52 18 2 23 80 9 8 89 51 19 46 10 71 25 49 99 +Card 39: 85 9 86 88 36 60 90 56 77 16 | 34 26 85 46 86 2 28 31 16 22 36 83 60 37 74 81 19 27 7 17 91 49 56 3 47 +Card 40: 38 12 23 15 31 48 24 76 82 54 | 44 30 45 97 3 20 38 52 43 53 47 8 71 92 12 41 79 42 28 25 65 59 83 89 24 +Card 41: 78 11 68 8 89 13 26 93 65 54 | 84 22 71 3 53 4 15 9 81 96 26 6 40 56 95 75 30 62 65 13 33 78 41 66 44 +Card 42: 41 90 34 15 47 56 39 59 21 53 | 11 87 9 37 47 78 5 61 93 89 58 81 46 48 4 42 40 33 67 27 97 43 55 22 26 +Card 43: 42 99 37 62 40 79 15 55 76 82 | 91 21 53 1 54 63 4 51 28 59 71 61 18 66 23 10 25 38 6 20 30 87 44 11 14 +Card 44: 59 19 4 75 62 55 38 82 60 22 | 25 89 80 19 87 97 40 53 98 10 73 77 81 76 48 83 44 69 34 36 24 42 27 78 88 +Card 45: 19 76 23 87 25 13 67 52 3 60 | 92 1 96 22 26 42 54 24 57 41 49 33 72 17 77 14 78 62 11 74 73 4 47 99 59 +Card 46: 80 48 27 98 36 29 28 83 82 39 | 2 74 47 43 27 48 82 91 28 99 9 29 36 80 66 4 46 25 83 20 37 72 49 39 98 +Card 47: 39 12 2 66 78 8 58 98 95 15 | 63 78 90 49 83 72 66 56 82 92 20 21 11 89 17 51 5 55 39 48 97 19 33 22 12 +Card 48: 91 29 16 88 11 46 75 55 3 51 | 99 71 4 26 16 2 98 44 32 1 46 28 36 67 14 49 93 72 83 35 65 8 27 96 74 +Card 49: 71 93 41 5 84 26 1 33 2 94 | 2 41 54 74 33 5 13 91 1 19 65 14 34 58 84 94 23 61 85 26 20 11 71 93 22 +Card 50: 9 69 66 54 4 18 56 15 80 63 | 35 59 38 62 54 16 8 69 89 74 71 93 64 15 80 39 13 84 9 28 79 27 18 45 75 +Card 51: 83 65 33 4 48 7 68 77 42 81 | 84 4 65 48 15 77 79 92 42 7 68 96 33 85 17 87 81 58 54 83 36 75 18 94 97 +Card 52: 86 34 54 12 13 67 61 57 41 4 | 91 35 27 3 68 39 12 30 65 9 50 46 66 80 20 77 29 45 72 98 19 10 55 47 73 +Card 53: 54 98 74 15 77 79 13 41 56 33 | 18 87 53 94 98 54 92 17 72 32 10 46 47 69 6 35 63 61 89 52 55 77 49 14 60 +Card 54: 55 76 46 69 22 60 13 90 86 48 | 90 57 63 23 39 47 34 65 97 6 93 95 13 48 60 22 86 96 33 92 94 29 56 72 18 +Card 55: 90 10 36 50 2 87 48 25 56 3 | 36 16 40 26 74 57 56 6 67 3 10 2 87 25 48 69 49 61 65 68 42 91 90 50 72 +Card 56: 79 48 63 72 24 98 64 80 42 87 | 98 63 15 40 28 39 85 81 60 48 64 92 80 82 74 91 72 41 23 99 17 93 42 59 87 +Card 57: 17 95 91 39 51 56 16 14 54 33 | 20 65 34 80 27 13 1 43 59 26 76 54 41 85 14 83 17 39 23 16 12 37 49 44 24 +Card 58: 50 9 39 92 89 62 74 56 73 61 | 78 92 68 31 13 28 83 61 8 14 56 62 6 16 50 39 24 9 58 1 17 89 48 15 12 +Card 59: 6 92 15 50 99 29 3 72 12 95 | 73 72 80 92 88 19 55 12 53 93 91 45 26 15 99 43 84 62 59 49 6 64 77 3 16 +Card 60: 14 93 76 15 7 90 39 30 83 32 | 83 35 69 40 60 77 73 75 36 27 94 80 90 1 56 99 93 13 37 45 22 26 31 20 70 +Card 61: 50 64 24 26 72 8 33 13 22 27 | 45 60 37 19 55 95 76 52 4 9 75 44 78 20 53 41 69 11 47 36 2 48 74 94 21 +Card 62: 55 87 6 12 83 97 11 94 56 19 | 4 71 56 25 88 50 55 42 10 28 81 60 59 22 44 49 86 66 94 31 62 84 57 90 51 +Card 63: 89 13 38 94 61 8 79 1 11 80 | 5 55 56 13 84 39 54 32 79 74 58 96 82 53 21 91 64 42 41 94 44 97 95 28 14 +Card 64: 39 73 72 12 74 58 57 50 25 24 | 1 49 3 46 89 26 78 24 28 21 54 64 86 88 30 91 43 15 98 23 99 12 22 79 33 +Card 65: 58 65 74 21 7 3 95 71 50 41 | 3 53 28 78 18 65 52 89 33 30 87 13 62 72 88 37 71 26 27 19 46 98 84 76 4 +Card 66: 27 73 68 71 55 33 88 30 56 87 | 50 74 97 18 34 5 65 66 93 31 57 32 69 38 28 60 81 43 87 98 53 86 59 49 14 +Card 67: 9 50 66 57 33 76 65 84 44 88 | 34 85 27 32 12 77 63 3 95 93 4 10 70 38 49 19 41 83 14 72 16 5 40 57 24 +Card 68: 71 27 65 58 38 62 73 23 77 57 | 51 56 61 78 41 68 22 2 20 64 6 24 45 5 72 79 13 67 85 7 50 48 93 80 26 +Card 69: 36 60 4 27 41 67 61 88 50 83 | 67 45 29 66 36 59 95 60 41 28 43 37 61 4 84 88 23 49 92 65 89 27 50 83 58 +Card 70: 34 37 95 65 11 29 98 15 55 68 | 13 58 34 52 29 46 72 25 68 5 7 87 42 51 61 98 75 15 65 33 95 11 83 55 60 +Card 71: 13 67 2 41 43 52 47 6 54 51 | 2 81 22 30 13 52 5 10 67 50 86 54 3 51 92 15 37 79 43 11 41 6 69 47 25 +Card 72: 51 72 65 50 55 80 48 87 13 10 | 28 5 41 51 42 45 87 98 35 64 93 72 65 55 50 88 13 74 48 63 80 10 34 86 40 +Card 73: 98 36 68 48 17 75 64 11 70 61 | 17 50 8 89 93 3 65 14 85 33 23 55 42 40 63 84 1 62 20 86 36 51 80 16 77 +Card 74: 75 10 74 42 71 63 14 2 12 96 | 33 7 65 96 38 6 17 34 18 40 71 61 95 14 27 46 2 91 66 58 8 19 31 16 25 +Card 75: 88 90 82 53 34 4 28 57 2 51 | 2 16 46 87 34 51 88 90 3 79 28 57 20 80 44 22 42 12 82 1 53 4 56 83 99 +Card 76: 75 48 5 98 51 7 34 67 66 32 | 93 92 75 43 1 98 71 19 13 40 29 85 67 66 12 25 83 39 48 8 7 5 31 65 33 +Card 77: 87 73 2 20 57 7 99 23 4 81 | 3 10 65 56 26 84 34 78 17 66 44 72 69 76 30 95 5 38 28 8 70 22 99 82 54 +Card 78: 2 48 95 8 80 41 26 96 47 50 | 1 5 21 24 91 29 22 47 98 57 82 42 72 94 62 90 2 95 49 36 6 71 27 70 33 +Card 79: 32 35 6 27 72 8 81 44 28 43 | 59 79 54 18 51 82 25 61 83 37 12 94 41 74 69 16 73 65 1 26 9 33 29 34 66 +Card 80: 46 43 77 74 73 26 84 50 86 24 | 6 29 89 70 16 3 98 92 17 27 79 86 31 93 85 41 96 91 77 48 14 66 18 54 99 +Card 81: 69 60 90 30 65 28 96 97 41 38 | 40 3 44 62 94 97 57 60 9 85 17 88 28 96 22 77 72 36 30 52 83 95 73 48 80 +Card 82: 27 47 86 26 46 44 59 63 31 58 | 51 13 11 50 35 89 8 78 54 82 67 64 15 83 73 74 57 4 76 29 43 90 91 37 22 +Card 83: 84 6 1 64 33 37 68 83 72 90 | 41 69 59 91 46 40 22 5 51 27 76 45 32 43 37 3 10 85 26 81 87 56 25 67 55 +Card 84: 61 83 50 49 91 12 98 38 6 78 | 93 73 96 62 70 39 59 5 48 18 40 63 90 22 61 46 50 66 91 95 88 71 76 87 29 +Card 85: 3 60 82 33 22 43 9 98 50 89 | 48 56 15 77 25 92 6 41 84 2 49 29 61 57 51 64 96 36 7 22 31 32 28 30 59 +Card 86: 48 22 41 64 65 16 25 36 29 76 | 86 5 19 89 36 60 27 1 11 67 98 73 35 75 61 21 92 91 93 66 47 39 87 68 52 +Card 87: 68 42 18 51 79 37 9 34 8 85 | 12 7 19 30 91 84 29 53 73 65 48 94 17 22 4 32 33 15 93 75 38 31 41 86 67 +Card 88: 50 35 98 64 91 37 80 75 39 8 | 37 13 35 24 64 91 75 4 63 45 98 56 85 8 1 29 43 97 65 50 80 74 25 32 39 +Card 89: 55 87 4 74 33 2 61 37 94 57 | 37 25 55 48 2 40 5 38 94 85 87 4 7 51 57 75 43 61 34 67 17 74 24 10 33 +Card 90: 76 98 38 16 60 19 93 26 48 43 | 72 8 26 45 98 61 67 16 42 43 29 76 93 50 79 38 27 15 19 54 99 60 3 88 48 +Card 91: 64 67 7 18 71 96 45 89 39 2 | 71 21 98 87 39 19 57 45 86 7 49 2 67 20 96 74 90 64 18 17 89 99 23 59 16 +Card 92: 68 66 33 78 22 62 39 31 37 5 | 95 40 33 37 5 22 66 78 10 68 63 43 90 31 46 8 62 32 98 73 39 21 45 13 20 +Card 93: 21 25 2 91 58 37 51 60 12 74 | 47 40 51 66 77 63 84 68 2 4 60 75 91 21 22 35 32 80 74 37 58 20 12 14 27 +Card 94: 81 48 43 59 86 85 2 92 27 35 | 34 84 11 6 25 1 96 24 30 8 21 33 74 57 70 91 66 20 7 75 36 73 53 87 62 +Card 95: 15 2 41 54 12 45 3 56 77 9 | 12 60 7 97 49 96 99 32 24 63 16 62 68 88 26 43 54 20 27 33 47 19 58 15 75 +Card 96: 90 47 53 86 39 54 7 82 65 22 | 84 62 70 82 78 65 53 86 30 73 57 47 72 54 39 11 35 83 22 40 28 7 21 90 63 +Card 97: 17 25 87 43 20 84 75 78 6 53 | 75 6 64 90 87 61 11 31 36 60 38 78 46 27 82 72 16 95 57 17 30 53 94 77 3 +Card 98: 45 18 60 22 16 91 39 27 38 88 | 18 88 92 49 79 10 38 98 35 99 89 91 23 32 9 39 1 64 48 11 22 15 66 82 21 +Card 99: 6 42 69 91 94 38 87 11 97 26 | 6 71 11 69 16 97 49 73 45 48 38 87 42 2 67 26 89 95 81 30 1 91 20 10 66 +Card 100: 57 7 39 52 99 68 48 24 2 16 | 1 43 77 38 25 18 41 73 26 12 90 3 95 54 22 72 65 83 11 32 37 85 14 71 29 +Card 101: 48 71 81 27 52 26 75 95 19 54 | 19 59 90 24 17 56 34 39 49 88 80 75 10 58 86 55 26 67 89 85 65 40 30 81 6 +Card 102: 35 62 57 40 79 63 37 33 60 17 | 37 35 33 97 79 75 7 19 59 67 23 63 41 17 85 58 42 38 53 36 83 60 62 76 95 +Card 103: 91 18 51 5 41 61 26 94 47 85 | 26 58 65 41 96 83 30 63 78 87 90 4 53 95 6 8 98 36 82 76 92 34 28 94 56 +Card 104: 45 38 79 42 74 18 16 61 65 89 | 58 5 84 72 51 22 52 56 64 11 23 38 16 93 24 25 29 66 41 35 77 20 95 17 1 +Card 105: 9 97 56 51 55 62 19 75 83 47 | 58 15 96 43 24 9 47 80 95 71 62 29 72 39 40 19 61 52 8 32 88 69 27 70 86 +Card 106: 82 26 96 33 35 50 19 78 64 91 | 9 17 70 96 89 91 4 52 75 56 64 14 63 32 50 73 7 81 46 10 53 42 99 95 26 +Card 107: 66 58 63 7 95 46 42 97 67 59 | 96 23 86 7 58 61 14 17 93 45 39 60 28 32 15 46 55 35 2 44 22 27 78 94 68 +Card 108: 48 3 54 58 30 47 71 74 28 37 | 44 62 60 16 97 71 23 35 49 24 93 7 65 87 19 99 89 28 34 45 90 70 64 20 66 +Card 109: 3 90 39 83 16 47 44 1 28 65 | 38 48 24 37 96 81 60 54 6 58 68 23 21 35 26 45 98 85 40 63 64 80 29 97 34 +Card 110: 3 12 59 28 93 26 92 52 38 64 | 65 36 5 49 72 86 6 33 84 73 98 89 47 61 57 14 32 44 10 97 69 40 99 7 51 +Card 111: 3 2 30 72 16 80 46 52 51 64 | 76 86 57 44 89 26 96 10 1 23 59 32 60 41 77 73 68 29 78 75 62 28 6 99 71 +Card 112: 84 34 17 40 47 44 33 99 65 79 | 65 74 97 55 33 13 52 34 47 40 17 56 6 96 76 8 59 51 99 84 18 48 79 44 24 +Card 113: 13 92 5 86 85 36 74 28 82 18 | 48 36 5 37 46 95 90 82 19 68 10 8 11 18 80 69 63 86 85 28 92 64 71 32 94 +Card 114: 96 50 90 97 11 42 79 78 56 26 | 78 50 27 47 96 97 62 42 26 86 84 72 79 20 11 43 8 64 87 95 56 68 90 67 52 +Card 115: 29 36 84 82 38 61 86 73 25 45 | 37 58 28 45 6 36 29 43 95 92 56 73 44 83 25 97 61 82 84 71 69 38 77 86 42 +Card 116: 97 19 96 10 44 26 81 79 7 89 | 39 55 63 4 94 24 29 12 65 84 68 31 75 23 15 71 54 82 56 42 5 53 96 40 51 +Card 117: 74 94 58 42 30 40 97 33 73 93 | 62 59 9 41 71 98 97 19 32 24 40 1 56 14 74 87 52 92 61 90 37 45 20 80 31 +Card 118: 96 45 27 88 2 82 87 99 39 17 | 53 36 44 55 21 88 33 74 26 22 61 46 18 43 20 68 54 49 87 67 35 73 3 63 1 +Card 119: 80 19 2 6 68 32 23 22 99 28 | 20 40 66 38 87 59 41 55 54 57 21 12 11 45 65 16 24 3 63 68 73 98 99 14 17 +Card 120: 84 92 65 58 80 55 2 72 78 75 | 66 64 44 88 1 41 59 13 29 52 30 71 90 21 76 87 73 70 25 61 26 69 32 81 95 +Card 121: 52 32 92 91 42 8 15 19 1 30 | 89 92 96 46 25 24 48 90 59 83 15 75 28 57 61 39 43 42 84 95 45 73 41 98 67 +Card 122: 70 89 60 43 1 58 49 46 28 45 | 74 62 66 13 67 95 55 10 9 70 54 84 29 31 8 96 59 81 27 3 63 12 1 82 87 +Card 123: 41 51 96 76 48 54 4 71 45 84 | 68 66 2 4 78 15 1 62 75 94 59 7 12 28 60 39 16 42 61 8 84 89 46 95 35 +Card 124: 48 61 35 81 94 73 98 46 53 85 | 55 2 40 3 84 4 11 88 77 62 79 39 85 27 36 82 33 93 29 47 67 50 12 91 19 +Card 125: 63 44 28 58 5 26 85 93 50 76 | 39 10 25 30 2 3 42 60 94 83 57 9 75 13 67 90 36 81 18 72 23 37 48 19 69 +Card 126: 41 28 15 87 88 50 57 27 78 30 | 3 24 89 91 47 40 11 83 76 33 53 74 9 42 43 66 70 17 99 29 75 19 98 90 64 +Card 127: 77 24 27 2 59 54 6 61 65 12 | 34 42 68 15 70 75 2 27 61 40 6 13 24 54 12 59 44 65 22 88 86 77 3 79 64 +Card 128: 3 15 55 7 80 69 64 13 77 33 | 34 50 3 17 88 66 79 59 38 1 41 11 55 8 7 80 68 25 16 46 61 19 13 74 33 +Card 129: 26 19 39 29 4 6 55 49 67 12 | 72 53 12 63 64 49 19 98 3 45 4 35 28 43 51 26 38 23 96 44 22 7 79 80 67 +Card 130: 80 61 1 62 46 5 84 17 14 49 | 75 84 61 85 29 62 46 1 17 63 3 31 57 79 19 58 96 14 76 42 32 49 5 80 56 +Card 131: 63 30 2 29 71 37 12 36 16 47 | 14 82 99 98 52 39 19 60 4 90 74 33 65 27 62 7 32 64 10 37 35 15 11 69 59 +Card 132: 68 81 89 42 36 34 18 53 74 41 | 24 37 14 73 97 54 59 90 9 29 49 10 47 32 85 87 99 98 78 39 27 22 57 81 33 +Card 133: 89 9 10 61 30 81 36 84 70 12 | 69 10 4 90 65 50 93 34 54 13 80 16 98 49 42 35 77 61 85 55 86 6 11 23 39 +Card 134: 27 19 90 30 85 41 58 79 53 11 | 15 58 36 52 11 93 54 24 26 39 51 79 56 35 30 85 53 6 17 32 5 16 87 27 33 +Card 135: 26 44 30 42 99 89 76 27 64 48 | 38 70 95 25 60 2 49 35 71 5 17 63 62 88 20 41 79 19 67 72 40 46 81 10 74 +Card 136: 70 64 49 85 48 16 41 52 91 24 | 48 2 62 28 54 78 50 52 83 7 43 90 96 60 10 26 12 6 95 51 91 25 47 67 87 +Card 137: 10 6 53 80 8 93 62 98 60 82 | 28 19 36 1 14 73 85 16 8 32 21 13 97 90 2 29 34 69 55 80 6 27 62 37 10 +Card 138: 28 25 60 17 99 39 35 48 34 26 | 46 32 33 43 98 10 62 70 41 17 40 27 34 67 4 26 85 63 58 60 16 97 14 57 20 +Card 139: 42 49 16 73 10 23 35 41 93 8 | 76 28 17 32 91 96 92 19 61 97 88 27 83 80 72 57 87 33 14 67 42 10 64 94 65 +Card 140: 81 17 80 94 54 21 57 12 60 48 | 88 27 7 11 6 28 98 33 94 77 14 53 1 92 50 22 93 49 18 86 84 63 42 64 90 +Card 141: 98 31 93 30 72 39 33 35 57 54 | 45 95 69 89 51 55 21 67 50 68 46 5 86 65 17 82 29 48 8 91 71 63 25 52 1 +Card 142: 81 61 78 99 24 42 13 10 3 9 | 8 41 38 63 5 82 54 46 67 83 45 20 44 19 91 92 1 4 77 32 17 59 21 50 94 +Card 143: 78 65 47 51 54 16 23 59 39 34 | 34 53 78 4 29 59 3 87 23 73 16 65 24 38 58 21 89 92 54 39 47 30 66 37 88 +Card 144: 61 73 60 75 2 23 24 44 1 40 | 45 72 5 22 77 88 78 21 76 16 39 85 46 51 97 80 4 27 41 37 9 71 38 28 65 +Card 145: 28 24 22 79 56 23 51 50 54 63 | 22 25 11 44 59 28 50 2 29 85 79 24 54 8 6 23 92 20 71 56 81 95 51 26 63 +Card 146: 28 74 36 10 32 15 72 30 83 73 | 76 7 10 49 11 74 20 62 24 26 21 40 79 41 34 55 98 95 82 43 89 37 9 45 52 +Card 147: 80 20 78 59 53 42 31 95 63 11 | 80 59 61 57 86 42 78 53 21 95 92 75 15 31 97 72 5 11 41 90 63 56 44 25 20 +Card 148: 58 73 92 17 9 24 30 49 5 20 | 95 77 78 72 20 24 1 27 82 92 58 49 74 59 5 65 73 9 84 4 14 76 43 17 30 +Card 149: 87 18 12 98 41 27 13 48 82 37 | 87 78 2 88 61 36 95 25 81 18 41 33 1 69 34 57 27 73 55 12 82 31 59 48 6 +Card 150: 35 47 42 66 43 72 76 68 21 20 | 83 85 8 71 21 6 60 74 96 55 2 19 9 11 98 62 20 39 41 10 30 81 33 51 31 +Card 151: 83 24 73 61 49 67 89 95 60 43 | 59 84 28 21 26 72 37 43 38 3 13 6 9 27 7 42 77 19 65 16 71 52 29 80 33 +Card 152: 99 54 98 50 69 82 51 95 73 62 | 86 38 88 79 9 63 45 34 23 80 47 30 83 14 93 4 96 49 15 52 16 20 33 76 75 +Card 153: 76 36 9 23 70 53 41 74 27 64 | 40 71 39 29 88 19 76 97 46 23 4 68 67 33 52 95 62 91 60 11 75 13 81 99 37 +Card 154: 27 71 72 6 69 76 59 44 51 80 | 5 2 17 82 58 83 7 9 61 70 43 96 87 78 69 42 88 74 85 31 99 13 16 81 15 +Card 155: 82 71 39 56 8 42 1 63 92 11 | 16 52 94 85 67 11 98 65 50 71 2 78 43 1 41 66 86 72 77 36 30 6 46 70 38 +Card 156: 90 44 46 70 71 60 5 68 57 77 | 1 28 62 56 87 32 23 37 40 68 18 94 20 97 72 21 4 33 50 73 16 80 22 14 45 +Card 157: 60 51 2 24 69 85 55 47 62 48 | 6 86 49 55 78 42 61 98 30 77 65 4 21 20 38 93 54 18 72 44 32 8 14 58 37 +Card 158: 50 45 37 6 18 12 2 69 23 76 | 10 70 54 79 95 4 36 87 73 22 94 42 26 21 57 15 7 14 74 90 67 3 33 49 63 +Card 159: 26 12 57 16 96 61 42 99 71 25 | 25 51 26 9 47 57 4 53 61 12 97 36 76 39 99 65 92 16 78 41 71 62 48 96 42 +Card 160: 48 43 26 9 31 62 10 60 38 59 | 59 26 38 4 10 85 55 6 62 18 35 33 29 95 9 60 79 11 24 34 43 22 88 16 12 +Card 161: 15 82 90 63 18 26 57 9 47 35 | 63 23 43 56 82 92 9 42 94 4 90 89 10 26 62 32 20 30 52 85 18 19 47 66 57 +Card 162: 4 37 67 35 71 22 17 14 49 16 | 10 82 7 16 87 99 84 45 20 21 97 79 43 29 86 54 19 9 81 85 62 78 1 61 24 +Card 163: 41 6 57 96 5 21 9 89 65 27 | 26 12 23 9 17 89 33 2 28 65 92 10 97 27 96 56 80 64 90 50 52 46 42 6 5 +Card 164: 53 51 16 32 60 84 55 14 18 25 | 18 52 56 28 6 89 80 19 23 29 57 34 8 70 79 41 91 90 96 88 66 35 97 44 82 +Card 165: 17 66 59 23 35 45 32 49 56 26 | 2 74 97 9 80 76 12 50 31 15 53 41 56 33 30 98 20 44 25 81 91 45 55 99 24 +Card 166: 92 25 70 80 85 88 62 81 61 43 | 40 62 21 83 44 18 87 5 81 43 13 10 85 30 1 53 99 79 68 16 49 20 56 7 15 +Card 167: 36 63 98 92 11 59 6 47 2 83 | 41 90 83 68 54 64 25 80 56 7 99 16 5 30 27 88 63 11 22 67 81 17 9 39 95 +Card 168: 64 20 56 74 5 21 70 52 33 58 | 4 64 28 7 44 80 12 38 8 89 83 57 37 54 87 69 48 63 2 72 78 85 62 60 15 +Card 169: 13 92 14 8 98 84 54 85 97 38 | 51 90 69 98 38 13 4 8 67 5 91 14 54 68 10 18 83 56 41 25 81 73 58 17 62 +Card 170: 54 39 20 12 50 6 83 85 33 45 | 3 97 19 5 61 66 81 46 24 56 29 92 52 85 73 43 71 13 60 12 36 62 64 35 32 +Card 171: 33 36 27 29 93 73 83 62 60 82 | 4 71 14 72 45 58 10 38 12 69 27 3 95 31 84 34 66 83 21 87 22 5 75 53 35 +Card 172: 92 9 73 82 15 6 44 28 88 34 | 99 78 11 46 9 36 89 65 17 8 16 94 68 63 12 54 25 33 69 47 13 38 93 50 59 +Card 173: 41 10 43 83 81 39 66 17 28 63 | 48 79 29 20 64 59 55 46 47 45 70 62 37 16 84 68 82 88 67 2 65 97 18 56 14 +Card 174: 53 73 55 83 9 57 87 35 1 42 | 66 52 56 76 19 92 78 91 82 87 20 39 31 72 43 71 11 33 15 18 75 84 46 47 22 +Card 175: 93 51 74 60 92 84 87 58 81 34 | 67 7 99 68 30 66 27 43 65 71 28 50 2 13 32 26 72 76 17 31 49 3 54 95 82 +Card 176: 3 92 48 97 73 37 84 44 53 91 | 21 35 42 99 87 36 31 43 79 52 89 6 59 14 57 26 76 33 38 19 82 63 74 25 39 +Card 177: 46 93 6 62 56 3 76 64 59 7 | 88 46 7 98 93 76 60 59 6 3 72 64 21 40 77 78 62 47 61 42 45 99 56 28 41 +Card 178: 43 69 96 12 88 93 97 33 80 20 | 58 94 56 93 12 2 20 24 14 40 27 73 97 80 99 43 74 16 91 88 33 96 71 25 69 +Card 179: 59 1 88 53 87 90 39 32 97 89 | 70 57 90 20 73 35 32 88 58 71 36 59 33 1 55 97 87 98 45 39 9 96 53 60 89 +Card 180: 33 19 87 82 90 1 14 78 84 35 | 89 19 20 3 66 23 87 54 78 39 65 84 35 83 33 69 14 90 44 49 72 38 75 82 1 +Card 181: 60 32 78 83 82 29 90 14 46 87 | 63 72 92 39 75 10 43 40 7 89 11 32 86 54 4 90 68 45 95 91 13 1 56 6 29 +Card 182: 11 18 63 73 64 39 9 92 82 62 | 8 27 69 64 3 53 73 11 21 39 10 18 35 44 56 62 75 72 4 51 6 42 82 37 76 +Card 183: 88 56 32 39 23 49 92 50 59 28 | 92 2 48 32 63 49 59 83 56 1 91 41 50 88 28 17 39 57 20 36 34 6 60 23 42 +Card 184: 34 97 99 76 32 75 69 83 60 79 | 44 86 52 99 85 32 34 4 28 79 76 46 22 83 54 56 60 31 75 51 80 89 45 69 97 +Card 185: 74 35 67 1 55 18 60 37 17 50 | 85 50 44 20 87 14 22 32 55 18 17 59 28 93 1 96 68 37 74 60 98 97 67 35 4 +Card 186: 44 36 3 80 6 24 90 81 34 61 | 76 69 14 77 53 21 4 16 18 46 9 59 34 38 98 13 30 11 7 17 88 41 42 99 23 +Card 187: 54 53 39 24 80 78 13 46 17 67 | 62 91 86 52 80 59 26 78 73 46 16 77 18 37 9 55 13 17 72 69 32 68 67 34 81 +Card 188: 50 19 11 73 61 75 67 54 12 84 | 73 84 97 56 74 59 35 75 61 14 15 19 24 12 51 6 58 11 89 67 53 25 21 54 50 +Card 189: 76 48 38 17 97 67 42 23 82 6 | 73 10 17 70 85 95 54 43 93 91 3 82 26 16 23 76 33 38 67 48 5 53 97 6 42 +Card 190: 61 19 93 50 11 56 32 5 84 37 | 32 62 82 84 50 61 91 15 69 19 68 20 74 92 10 55 11 93 39 37 18 5 47 22 46 +Card 191: 2 58 93 26 23 31 60 74 35 47 | 74 64 26 68 8 60 11 73 93 42 87 2 31 97 61 47 65 24 58 66 53 38 94 46 88 +Card 192: 64 37 49 88 95 79 29 59 2 99 | 39 63 31 68 36 24 60 9 94 89 93 13 45 77 38 55 14 23 92 83 29 33 44 34 71 +Card 193: 19 23 99 89 26 80 63 60 59 66 | 78 80 99 60 66 47 84 59 24 61 5 63 67 26 87 42 96 10 54 98 19 81 4 43 8 +Card 194: 6 36 31 40 89 19 63 16 60 68 | 75 84 91 77 40 5 81 10 52 86 19 96 16 58 30 6 78 61 82 74 97 89 90 62 37 +Card 195: 45 54 92 67 47 65 91 98 87 29 | 5 72 15 25 88 36 73 20 91 90 83 46 87 47 10 22 69 2 62 57 28 93 3 59 1 +Card 196: 88 34 96 16 54 9 17 89 20 52 | 20 54 47 61 12 57 38 11 8 85 74 52 90 77 41 46 4 89 19 39 34 83 55 7 97 +Card 197: 38 3 57 72 97 45 66 73 56 8 | 83 68 28 64 58 66 85 15 53 65 23 3 37 87 20 17 47 63 55 69 88 70 62 92 76 +Card 198: 98 66 29 17 83 9 6 84 36 70 | 21 10 31 84 93 14 67 29 24 91 12 41 99 19 5 56 83 74 2 8 79 95 64 49 53 +Card 199: 41 93 33 26 45 65 97 39 20 95 | 82 8 30 6 34 58 49 16 29 91 64 80 50 9 74 59 19 60 69 53 61 3 83 67 35 +Card 200: 86 85 91 2 27 65 45 73 60 69 | 66 26 28 7 98 80 14 52 6 35 57 46 39 4 30 55 94 75 82 83 96 13 74 9 58 +Card 201: 30 53 41 42 10 51 37 63 46 67 | 84 74 33 5 86 32 45 83 52 1 13 43 65 49 98 91 9 11 96 66 15 62 27 44 24 \ No newline at end of file diff --git a/5/5-1.py b/5/5-1.py new file mode 100644 index 0000000..e414467 --- /dev/null +++ b/5/5-1.py @@ -0,0 +1,68 @@ +def get_input(): + with open("five.txt", "r") as f: + return f.readlines() + + +def format_input(input): + return_dict = {} + current_title = "" + current_map = [] + for i, l in enumerate(input): + if i == 0: + parts = l.split(": ") + return_dict[parts[0]] = parts[1].split(" ") + continue + if input[i][0].isalpha(): + parts = l.split(" ") + current_title = parts[0] + if input[i][0].isdigit(): + parts = l.split(" ") + current_map.append([p.replace("\n", "") for p in parts]) + if input[i][0] == "\n": + return_dict[current_title] = current_map + current_map = [] + current_title = "" + return_dict[current_title] = current_map + return return_dict + + +def get_current_map(input, current_map_prefix): + current_map = [key for key in input.keys() if current_map_prefix in key] + assert len(current_map) == 1 + current_map = current_map[0] + return current_map + + +def follow_seed_to_location(val, map, current_map_prefix): + # if we are past the x-to-location map, return the current value + if current_map_prefix == "location-": + return val + current_map = get_current_map(map, current_map_prefix) + next_map_prefix = current_map.split("-")[-1] + "-" + for row in map[current_map]: + dest, source, range_ = [int(i) for i in row] + if source <= val and val <= source + range_: + diff = val - source + destination = dest + diff + return follow_seed_to_location( + destination, map, current_map_prefix=next_map_prefix + ) + return follow_seed_to_location(val, map, current_map_prefix=next_map_prefix) + + +def follow_seeds(input): + locs = [] + for seed in input["seeds"]: + loc = follow_seed_to_location(int(seed), input, current_map_prefix="seed-") + locs.append(loc) + return locs + + +def main(): + input = get_input() + input = format_input(input) + locations = follow_seeds(input) + print(min(locations)) + + +main() diff --git a/5/5-2.py b/5/5-2.py new file mode 100644 index 0000000..ffa7233 --- /dev/null +++ b/5/5-2.py @@ -0,0 +1,119 @@ +import time + + +def get_input(): + with open("fivetest.txt", "r") as f: + return f.readlines() + + +def format_input(input): + return_dict = {} + map_title = "" + current_map = [] + # there is 100% an easier way to do this, + # but this works. + for i, l in enumerate(input): + if i == 0: + parts = l.split(": ") + return_dict[parts[0]] = parts[1].split(" ") + continue + first_letter = input[i][0] + if first_letter.isalpha(): + # this is the start of a new map section + parts = l.split(" ") + map_title = parts[0] + if first_letter.isdigit(): + # this is a row in the current map section + parts = l.split(" ") + current_map.append([p.replace("\n", "") for p in parts]) + if first_letter == "\n": + # this is the end of a map section + return_dict[map_title] = current_map + current_map = [] + map_title = "" + # capture details of last map section, since there is no newline at the end + return_dict[map_title] = current_map + return return_dict + + +def get_seed_ranges(seeds): + # takes a list of numbers and returns a list of pairs of numbers + pairs = [] + pair = [] + for i, s in enumerate(seeds): + pair.append(int(s)) + if i % 2 == 0: + continue + else: + pairs.append(pair) + pair = [] + return pairs + + +def get_current_map(input, current_map_suffix): + # find the current map key from the given suffix + current_map = [key for key in input.keys() if current_map_suffix in key] + assert len(current_map) == 1 + current_map = current_map[0] + return current_map + + +def get_seed_or_none(seed_ranges, val): + for [frm, to] in seed_ranges: + if val >= frm and val <= frm + to: + print(f"found matching seed value: {val}") + return val + return None + + +def find_seed_from_loc(input, val, current_map_suffix): + """ + Recursive function which works backwards from a location value to + find any corresponding seed values. + """ + # if we are at the start of the map chain (i.e. trying to do x-to-seed): + if current_map_suffix == "-seed": + seed_ranges = get_seed_ranges(input["seeds"]) + return get_seed_or_none(seed_ranges, val) + + current_map = get_current_map(input, current_map_suffix) + # next map suffix will always have the prefix of the current map suffix + # e.g. x-to-y will always point to the next map suffix of z-to-x + next_map_suffix = "-" + current_map.split("-")[0] + + for row in input[current_map]: + dest, src, range_ = [int(i) for i in row] + # if the current value is in the range of the current row: + if val >= dest and dest + range_ > val: + new_val = val + src - dest + # continue up the chain using the new value + return find_seed_from_loc(input, new_val, next_map_suffix) + # if the current value is not in any of the ranges of the current map: + # continue up the chain using the same value as previously + return find_seed_from_loc(input, val, next_map_suffix) + + +def find_lowest_location(input): + # brute force babyyyyy + r = 10000000 + for loc in range(r): + # uncomment for progress tracking - will slow down code by around 30% + # if loc % (r/100) == 0: + # print(f"Currently {loc/r*100}% done") + seed = find_seed_from_loc(input, loc, current_map_suffix="-location") + if seed != None: + return loc + + +def main(): + t = time.perf_counter() + input = format_input(get_input()) + lowest_loc = find_lowest_location(input) + print(f"for location value: {lowest_loc}") + t_f = time.perf_counter() + print(f"finished in {t_f - t} seconds") + + +main() + +# 9622622 diff --git a/5/5-test.txt b/5/5-test.txt new file mode 100644 index 0000000..bd902a4 --- /dev/null +++ b/5/5-test.txt @@ -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 \ No newline at end of file diff --git a/5/5.txt b/5/5.txt new file mode 100644 index 0000000..a671fd8 --- /dev/null +++ b/5/5.txt @@ -0,0 +1,197 @@ +seeds: 565778304 341771914 1736484943 907429186 3928647431 87620927 311881326 149873504 1588660730 119852039 1422681143 13548942 1095049712 216743334 3671387621 186617344 3055786218 213191880 2783359478 44001797 + +seed-to-soil map: +1136439539 28187015 34421000 +4130684560 3591141854 62928737 +2493176649 2843539493 216586902 +4035246184 3979580848 40675839 +784987951 2449883248 10512167 +1230114095 458474273 89127842 +3591141854 4278550666 16416630 +795500118 1007741104 49669915 +4075922023 4020256687 54762537 +1170860539 385724159 59253556 +1754134353 1447758461 710855281 +2464989634 0 28187015 +3811089926 3654070591 224156258 +367106182 564462768 34737691 +0 3060126395 64826339 +1438999297 87449756 298274403 +1319241937 901480302 106260802 +1425502739 444977715 13496558 +906091129 2158613742 230348410 +401843873 2460395415 383144078 +1737273700 547602115 16860653 +64826339 599200459 302279843 +2709763551 1057411019 390347442 +845170033 2388962152 60921096 +3607558484 4075019224 203531442 +3100110993 3124952734 265337006 +4193613297 3878226849 101353999 +3365447999 62608015 24841741 + +soil-to-fertilizer map: +2997768542 2385088490 141138894 +2483957796 2361581050 23507440 +98641524 1346083581 385280737 +3138907436 2256873732 8670947 +0 2158232208 98641524 +3147578383 2265544679 96036371 +1035235183 2879344429 108036359 +2567031012 2526227384 63435416 +740156227 2589662800 180702628 +2630466428 1790930094 367302114 +1029837856 0 5397327 +1143271542 5397327 1340686254 +483922261 2987380788 256233966 +2507465236 1731364318 59565776 +920858855 2770365428 108979001 + +fertilizer-to-water map: +1539871014 1431400479 38399903 +4189242304 3947275099 105724992 +2012473116 0 61612686 +3673653298 3769966020 177309079 +25380533 833117788 21807501 +143369400 1411638591 19761888 +2698209531 61612686 40666379 +401367210 2888296065 27849039 +3850962377 4057978463 170640183 +1076364770 854925289 39443942 +0 2048878915 25380533 +2682826842 1483785677 15382689 +4026580932 4228618646 66348650 +790899137 2074259448 70405647 +2738875910 2609016218 230235412 +2090748148 1854132037 12185242 +163131288 1499168366 238235922 +1115808712 3002097202 63461270 +545943998 1215727887 195910704 +4092929582 3673653298 96312722 +1000530579 3065558472 75834191 +2074085802 2916145104 16662346 +429216249 1737404288 116727749 +1578270917 2174814019 434202199 +2969111322 102279065 44844471 +1179269982 669063687 164054101 +2463111278 507301424 161762263 +741854702 2839251630 49044435 +3013955793 894369231 236513741 +861304784 2144665095 30148924 +1525885719 1469800382 13985295 +132032949 2932807450 11336451 +2102933390 147123536 360177888 +47188034 1130882972 84844915 +4021602560 4053000091 4978372 +2624873541 2944143901 57953301 +891453708 3141392663 109076871 +1343324083 1866317279 182561636 + +water-to-light map: +1509583382 1639808290 20361832 +3841220400 2799952377 116887408 +1472887638 3349716751 36695744 +1375316591 4197396249 97571047 +1030032900 38536653 44339012 +3776233310 1557050237 64987090 +1857053855 3386412495 71799907 +2963593546 2694182899 38493443 +3758462347 1622037327 17770963 +1018869652 82875665 11163248 +1308040556 2732676342 67276035 +1928853762 3953749938 243646311 +2488961036 3503789336 239267964 +3562290347 3458212402 6096433 +3568386780 1308040556 190075567 +2728229000 1997029610 235364546 +215668494 0 38536653 +1646361217 3743057300 109790942 +1529945214 3233300748 116416003 +1756152159 3852848242 100901696 +3958107808 1660170122 336859488 +3503356233 1498116123 58934114 +254205147 552157437 522214475 +3002086989 3464308835 39480501 +776419622 94038913 242450030 +2172500073 2916839785 316460963 +0 336488943 215668494 +3041567490 2232394156 461788743 + +light-to-temperature map: +3498288578 2645051323 42074132 +608593503 673232568 65024140 +0 1287033796 108723708 +3979313387 3634135302 315653909 +2652759587 3018896130 103365881 +1093544955 942695289 7961217 +2756125468 3501628238 132507064 +419683046 1625547778 126722533 +683243352 349510049 26140330 +1101506172 511314709 142580382 +1283347805 375650379 135664330 +673617643 24016268 9625709 +709383682 1238532395 48501401 +3763762608 2402322728 184668443 +3948431051 2621479653 23571670 +3660408219 2687125455 102463666 +3561232935 2586991171 34488482 +2459767392 3122262011 192992195 +1244086554 1754618583 31645052 +1073753155 1497748002 19791800 +3972002721 3949789211 7310666 +3540362710 4077337854 20870225 +1419012135 738256708 79984976 +1746461061 1457945428 39802574 +3595721417 4190079809 64686802 +1616767336 653895091 19337477 +1275731606 823578131 7616199 +108723708 818241684 5336447 +546405579 1395757504 62187924 +1498997111 950656506 117770225 +2888632532 3957099877 102103275 +1744112789 1752270311 2348272 +2233819388 2077946837 225948004 +3762871885 2401432005 890723 +2136282224 2303894841 97537164 +3311914546 3315254206 186374032 +2118147522 4059203152 18134702 +308182087 831194330 111500959 +114060155 0 24016268 +2077946837 4254766611 40200685 +971525741 33641977 102227414 +1636104813 1517539802 108007976 +138076423 1068426731 170105664 +3220042816 4098208079 91871730 +2990735807 2789589121 229307009 +757885083 135869391 213640658 + +temperature-to-humidity map: +1130946446 972737563 146373650 +1277320096 1760175559 41760032 +4151385320 4147641404 143581976 +2634337722 0 466605084 +1992884166 956487184 16250379 +4147641404 4291223380 3743916 +641064346 466605084 489882100 +1319080128 1801935591 673804038 +2009134545 2475739629 625203177 +0 1119111213 641064346 + +humidity-to-location map: +3903940466 3635148971 125939893 +1458128760 2186815403 67353660 +3125319983 1458128760 728686643 +2261072201 3994982121 66012689 +3854006626 2992363154 49933840 +1525482420 3780550419 183145699 +2233668127 3967578047 27404074 +2442260515 3138011064 466023456 +740912129 0 327948845 +2422798960 3761088864 19461555 +1708628119 3963696118 3881929 +2327084890 3042296994 95714070 +4029880359 3604034520 31114451 +1712510048 2471205075 521158079 +367508399 695457244 373403730 +2908283971 2254169063 217036012 +0 327948845 367508399 \ No newline at end of file diff --git a/6/6-1.py b/6/6-1.py new file mode 100644 index 0000000..6514039 --- /dev/null +++ b/6/6-1.py @@ -0,0 +1,29 @@ + +TIME_DIST_DICT = { + 35: 212, + 93: 2060, + 73: 1201, + 66: 1044 +} + +def get_distance_travelled(time_holding, race_time): + return time_holding * (race_time - time_holding) + +def get_winning_times(record_time, distance): + winning_times = [] + for t in range(1, record_time): + if get_distance_travelled(t, record_time) >= distance: + winning_times.append(t) + return winning_times + +def main(): + distances = {} + for t, d in TIME_DIST_DICT.items(): + distances[t] = get_winning_times(t, d) + prod = 1 + for t, d in distances.items(): + prod *= len(d) + print(prod) + + +main() \ No newline at end of file diff --git a/6/6-2.py b/6/6-2.py new file mode 100644 index 0000000..63a567c --- /dev/null +++ b/6/6-2.py @@ -0,0 +1,24 @@ +import time + +time_ = 35937366 +dist = 212206012011044 + +def get_distance_travelled(time_holding, race_time): + return time_holding * (race_time - time_holding) + + +def get_winning_times(record_time, distance): + winning_times = [] + for t in range(1, record_time): + if get_distance_travelled(t, record_time) >= distance: + winning_times.append(t) + return winning_times + + +def main(): + start = time.perf_counter() + print(len(get_winning_times(time_, dist))) + end = time.perf_counter() + print(f"ran in {end - start} seconds") + +main() \ No newline at end of file diff --git a/6/6.txt b/6/6.txt new file mode 100644 index 0000000..cfc0d59 --- /dev/null +++ b/6/6.txt @@ -0,0 +1,2 @@ +Time: 35 93 73 66 +Distance: 212 2060 1201 1044 \ No newline at end of file diff --git a/7/7-1.py b/7/7-1.py new file mode 100644 index 0000000..5df477d --- /dev/null +++ b/7/7-1.py @@ -0,0 +1,99 @@ +import functools + +CARD_STRENGTHS = ["2", "3", "4", "5", "6", "7", "8", "9", "T", "J", "Q", "K", "A"] + +HAND_STRENGTHS = [1, 2, [2, 2], 3, [2, 3], 4, 5] + + +def get_input(): + with open("seven.txt", "r") as f: + return [ + {f.strip().split(" ")[0]: f.strip().split(" ")[1]} for f in f.readlines() + ] + + +def get_multiples(hand): + multiples = {} + for card in hand: + count_ = hand.count(card) + if count_ >= 1: + if multiples.get(count_) is None: + multiples[count_] = {card} + else: + multiples[count_].add(card) + return multiples + + +def compare_card_strengths(hand_1, hand_2): + hand_1 = list(list(hand_1.keys())[0]) + hand_2 = list(list(hand_2.keys())[0]) + while True: + if CARD_STRENGTHS.index(hand_1[0]) > CARD_STRENGTHS.index(hand_2[0]): + return 1 + elif CARD_STRENGTHS.index(hand_1[0]) < CARD_STRENGTHS.index(hand_2[0]): + return -1 + else: + hand_1.pop(0) + hand_2.pop(0) + + +def get_hand_strength(hand): + cards = list(hand.keys())[0] + multiples = get_multiples(cards) + if multiples.get(5) is not None: + # five of a kind - 7 + return 7 + if multiples.get(4) is not None: + # four of a kind - 6 + return 6 + if multiples.get(3) is not None: + if multiples.get(2) is not None: + # full house - 5 + return 5 + else: + # three of a kind - 4 + return 4 + if multiples.get(2) is not None: + if len(multiples.get(2)) == 2: + # two pair - 3 + return 3 + else: + # pair - 2 + return 2 + if multiples.get(1) is not None: + # high card - 1 + return 1 + + +def order(hand_1, hand_2): + hand_str_1 = get_hand_strength(hand_1) + hand_str_2 = get_hand_strength(hand_2) + if hand_str_1 > hand_str_2: + return 1 + elif hand_str_1 < hand_str_2: + return -1 + else: + return compare_card_strengths(hand_1, hand_2) + + +def order_hands(hands): + return sorted(hands, key=functools.cmp_to_key(order)) + + +def get_winnings(ordered): + sum = 0 + for i, hand in enumerate(ordered): + rank = i + 1 + bet = list(hand.values())[0] + sum += rank * int(bet) + return sum + + +def main(): + hands = get_input() + ordered = order_hands(hands) + winnings = get_winnings(ordered) + print(winnings) + + +main() diff --git a/7/7-2.py b/7/7-2.py new file mode 100644 index 0000000..29305d8 --- /dev/null +++ b/7/7-2.py @@ -0,0 +1,144 @@ +import functools + +CARD_STRENGTHS = ["J", "2", "3", "4", "5", "6", "7", "8", "9", "T", "Q", "K", "A"] + + +def get_input(): + with open("seven.txt", "r") as f: + return [ + {f.strip().split(" ")[0]: f.strip().split(" ")[1]} for f in f.readlines() + ] + + +def get_multiples(hand): + """ + Returns a dict of the form: + { + 1: {card1, card2, ...}, + 2: {card1, card2, ...}, + 3: {card1, card2, ...}, + 4: {card1, card2, ...}, + 5: {card1, card2, ...}, + "J": jokers + } + where the key is the number of cards in the hand and the value is a set of the cards + Jokers are represented by the key "J", with the value being the total number of jokers. + (it just makes it easier to process) + """ + multiples = {} + jokers = hand.count("J") + for card in hand: + if card == "J": + continue + count_ = hand.count(card) + if count_ >= 1: + if multiples.get(count_) is None: + multiples[count_] = {card} + else: + multiples[count_].add(card) + multiples["J"] = jokers + return multiples + + +def get_hand_strength(hand): + # this is a disgusting function + cards = list(hand.keys())[0] + multiples = get_multiples(cards) + jokers = multiples.get("J", 0) + if jokers == 5: # five of a kind - 7 + return 7 + if multiples.get(5) is not None: # five of a kind - 7 + return 7 + if multiples.get(4) is not None: + if jokers == 1: # five of a kind - 7 + return 7 + return 6 # four of a kind - 6 + if multiples.get(3) is not None: + if jokers == 2: # five of a kind - 7 + return 7 + if jokers == 1: # four of a kind - 6 + return 6 + if multiples.get(2) is not None: # full house - 5 + return 5 + return 4 # three of a kind - 4 + if multiples.get(2) is not None: + if jokers == 3: # five of a kind - 7 + return 7 + if jokers == 2: # four of a kind - 6 + return 6 + if len(multiples.get(2)) == 2: + if jokers == 1: # full house - 5 + return 5 + return 3 # two pair - 3 + if jokers == 1: # three of a kind - 4 + return 4 + return 2 # pair - 2 + if jokers == 4: # five of a kind - 7 + return 7 + if jokers == 3: # four of a kind - 6 + return 6 + if jokers == 2: # three of a kind - 4 + return 4 + if jokers == 1: # pair - 2 + return 2 + return 1 # high card - 1 + + +def compare_card_strength(hand_1, hand_2): + hand_1 = list(list(hand_1.keys())[0]) + hand_2 = list(list(hand_2.keys())[0]) + while True: + if CARD_STRENGTHS.index(hand_1[0]) > CARD_STRENGTHS.index(hand_2[0]): + return 1 + elif CARD_STRENGTHS.index(hand_1[0]) < CARD_STRENGTHS.index(hand_2[0]): + return -1 + else: + hand_1.pop(0) + hand_2.pop(0) + if len(hand_1) == 0: + return 0 + + +def order(hand_1, hand_2): + hand_str_1 = get_hand_strength(hand_1) + hand_str_2 = get_hand_strength(hand_2) + if hand_str_1 > hand_str_2: + return 1 + elif hand_str_1 < hand_str_2: + return -1 + else: + return compare_card_strength(hand_1, hand_2) + + +def order_hands(hands): + ordered = sorted(hands, key=functools.cmp_to_key(order)) + return ordered + + +def get_winnings(ordered): + sum = 0 + for i, hand in enumerate(ordered): + rank = i + 1 + bet = list(hand.values())[0] + sum += rank * int(bet) + return sum + + +def main(): + input = get_input() + ordered = order_hands(input) + winnings = get_winnings(ordered) + print(winnings) + + +main() + + +# 255730474 too high +# 255725809 too high +# 254414073 too low +# 253496970 too low +# 253733312 too low +# 254326370 wrong +# 254329870 wrong +# 254837398 correct diff --git a/7/7-test.txt b/7/7-test.txt new file mode 100644 index 0000000..bf2815e --- /dev/null +++ b/7/7-test.txt @@ -0,0 +1,5 @@ +32T3K 765 +T55J5 684 +KK677 28 +KTJJT 220 +QQQJA 483 \ No newline at end of file diff --git a/7/7.txt b/7/7.txt new file mode 100644 index 0000000..70c15a0 --- /dev/null +++ b/7/7.txt @@ -0,0 +1,1000 @@ +J3T3T 868 +6Q499 630 +8J3AA 335 +A73AA 593 +28445 591 +A9QAA 563 +47353 830 +AQ7A9 230 +QT6JJ 588 +J6K38 769 +5JA65 531 +737QJ 827 +QQ56J 962 +5T666 481 +4486Q 282 +J6566 843 +3TT88 331 +KKK8K 129 +8Q884 145 +T5T74 118 +32J22 115 +9Q843 220 +99J9J 590 +3528K 291 +95789 959 +2986K 26 +9T66T 989 +632A7 447 +74285 217 +5275J 629 +78337 767 +56555 894 +5Q555 262 +AA4AA 320 +4K499 701 +JAT22 759 +Q852J 423 +JJ7JT 22 +TJ223 698 +T555J 795 +5K9K5 549 +Q2822 515 +5KQ9Q 754 +T8T79 979 +6JJ72 866 +77989 707 +8AAAJ 224 +KKA2K 869 +26J95 572 +K93K9 149 +44Q5Q 867 +69999 778 +Q33JQ 506 +5KAA6 765 +333J3 540 +K8JKK 134 +9QAQA 169 +JQ629 233 +64667 735 +5A6Q2 43 +9KJTJ 994 +KQAT7 124 +9TTAA 8 +55755 193 +6J627 742 +T59A9 139 +78AT9 864 +28A82 718 +33JJ3 57 +58776 385 +22AA2 904 +7TT77 21 +A8AA8 490 +T9784 706 +K3J3K 76 +99444 451 +8K497 680 +5Q45Q 344 +T5843 670 +QK647 161 +6KQ46 634 +2JQQ2 471 +KJJ77 123 +KQ3Q7 412 +522QT 632 +52625 642 +38A25 508 +54A7K 892 +44439 958 +2JKAA 682 +K75K7 677 +28A24 743 +AA5Q8 722 +92892 783 +K8828 173 +K9A89 425 +K6KQ8 657 +7K747 833 +QJ996 625 +35QK4 67 +66677 268 +QJ89A 610 +75A6J 49 +J8872 967 +4K658 210 +29449 832 +A3694 566 +99J5A 313 +J5AA9 1000 +57A7A 917 +287J4 681 +667T7 789 +3J322 375 +55525 522 +K55AJ 565 +J9T7T 740 +J4353 363 +88244 941 +JAA5A 977 +Q5Q55 922 +9TK8T 491 +J8533 378 +24388 61 +8848T 947 +KTJ2K 264 +76786 744 +K6666 739 +5K5K5 631 +56284 183 +T23T2 48 +79727 158 +AA6KA 92 +5A688 140 +T7TK7 143 +699J6 377 +7JJ38 809 +759T3 181 +8KK9K 732 +999KK 901 +222J8 329 +A3J43 835 +AQQ66 266 +96Q4J 368 +JA5K6 838 +69J88 263 +AK3KA 108 +TAJAT 554 +7QAQA 420 +3KQ62 819 +QJ465 79 +JJJJJ 504 +TT4TT 663 +224J2 801 +6AAAA 299 +J77T7 902 +48444 619 +A2785 607 +74J8T 875 +8J683 250 +K2QTK 824 +26AAA 215 +47Q8A 553 +A6TT9 639 +266T6 17 +QT9JA 24 +J8J99 405 +Q6666 544 +Q44J4 327 +66694 684 +5TJQA 511 +2J25A 757 +9666J 103 +99995 346 +365KA 734 +K388T 11 +57T5T 828 +29992 273 +4A36Q 34 +39888 204 +22A33 306 +9Q993 302 +72677 435 +KKQ8J 94 +447J4 289 +Q4K22 107 +333K9 406 +TT5T7 270 +KK2J4 101 +4K5KK 903 +TTT7T 473 +6KAKK 141 +8Q868 943 +T4T45 660 +4T968 840 +6AA5A 163 +TQJTT 812 +J8A88 345 +88QQJ 276 +7JT93 290 +58QQ5 534 +T7457 849 +4444K 479 +AQQAT 851 +J45JJ 750 +J8T98 255 +87758 839 +QQ8QQ 55 +725A2 693 +K4TT3 431 +88588 482 +2K4QJ 502 +89955 381 +T7869 987 +JA74J 408 +27438 211 +2658A 221 +7A7AA 836 +77QJT 873 +666KK 633 +8AAAA 756 +QJQQQ 281 +937QQ 184 +3Q777 308 +KK7JQ 208 +44355 478 +A5JK4 571 +TTJ35 726 +97KTJ 357 +444A4 294 +84438 83 +66KQ2 517 +7866J 575 +224T7 434 +TT633 42 +66972 671 +867Q4 106 +95J55 775 +8J444 168 +TT328 213 +86A88 198 +Q3578 986 +QQQ2Q 831 +QQ8Q8 898 +K69A4 749 +AAKAA 475 +T3487 275 +59K6Q 850 +76J4T 248 +69Q7Q 97 +AK3QJ 182 +Q2598 44 +54444 486 +TJJTT 708 +J2JJK 179 +KKK88 287 +66QQ6 694 +2537A 551 +2KQTA 501 +J9877 171 +2456T 355 +44Q99 929 +999TK 637 +6QTQ7 442 +7J877 755 +22292 574 +3QK79 157 +JK9K9 300 +585K4 85 +QK22A 41 +A8934 580 +T5TK9 920 +K4Q5J 122 +33257 470 +J5JTK 203 +9KKKQ 712 +677Q3 776 +36A36 792 +7AAJ8 219 +52T55 690 +6695J 334 +66T68 484 +976Q4 667 +Q44TQ 105 +98J67 753 +QJT87 58 +86Q92 802 +4A4AA 185 +63399 390 +K6K22 954 +QQQ77 815 +77797 546 +4JK48 997 +33A96 53 +7A4A4 601 +568T4 992 +886J8 784 +5T575 418 +45TQK 367 +76A9K 370 +56226 449 +6KK3K 458 +69955 636 +K9Q93 249 +TAT53 746 +KJJ3K 137 +84477 332 +J5AQ6 325 +387AA 382 +8833J 142 +56Q6A 909 +33393 459 +K3KK9 398 +996AJ 160 +37778 499 +TTT44 933 +AQTQQ 737 +3T3T4 596 +Q8JQ3 552 +55JJ5 897 +95995 518 +JQQQ4 500 +4QQQT 773 +A2522 336 +AK972 785 +7KK3J 587 +73K77 448 +7Q755 309 +9966K 397 +TKQJA 228 +46666 609 +44JJ4 853 +TA5AT 19 +354Q6 131 +99K97 258 +J3355 664 +K29T6 720 +T8635 132 +75474 521 +6J943 119 +77K77 238 +84Q47 15 +A556T 347 +TT7J7 582 +2455T 661 +JT43T 351 +22A22 243 +38335 655 +9A47Q 133 +92T29 887 +Q98JJ 394 +KKKKQ 781 +KK5JK 231 +4TJJ4 285 +TTJKK 863 +3K5TQ 165 +J7T32 882 +5535T 557 +7537A 952 +692T6 88 +52J55 547 +5TTKT 659 +68K59 648 +77J47 799 +TJ348 116 +Q838A 304 +T255T 46 +37682 600 +764T6 700 +JK939 301 +37J77 536 +T69T8 35 +77Q76 387 +378T5 279 +7K4K3 259 +T8993 568 +88J88 328 +88988 665 +7J8Q5 50 +QJ95Q 365 +86K6K 207 +9K536 485 +7Q749 417 +8983T 150 +QQ2Q6 319 +AA2K2 796 +J35T5 714 +KK99K 925 +TK244 199 +3QAJ3 823 +9T979 315 +962KJ 33 +Q45QQ 842 +Q663Q 350 +42334 28 +97779 603 +78T68 890 +6J3A3 855 +5555T 908 +95J8K 489 +A87TT 537 +22K23 626 +4J848 641 +22A26 758 +934QT 614 +47474 679 +7227J 467 +5AAAA 606 +99J79 341 +AKA33 821 +6826J 583 +55J55 415 +K7AT6 724 +3TTT8 433 +3Q343 807 +J8552 439 +777KK 232 +44678 135 +33J3T 969 +A2545 516 +J596T 686 +7KTQQ 703 +TKTKK 426 +22J44 559 +83K33 73 +29999 343 +K739J 996 +55A5A 687 +43334 885 +T6T6T 396 +QQ33Q 923 +6A66A 798 +2AAAA 844 +Q4223 374 +8QK45 419 +244Q2 683 +55545 624 +J9999 770 +TT242 298 +AK9KA 581 +22A97 668 +5TK87 861 +KK4AQ 229 +4A66Q 803 +KJKJK 794 +QQ34Q 272 +J4494 545 +55K6K 295 +33733 594 +Q5QQ5 620 +96269 78 +94773 710 +4939Q 246 +29959 303 +86888 364 +T482K 474 +94844 407 +3QQQQ 685 +2AT92 709 +8Q888 921 +JA53J 63 +AK857 893 +88TJK 2 +JQ555 359 +77377 966 +TKKKK 859 +8T487 982 +KA4K4 284 +9433J 62 +52A4K 5 +K6KAJ 197 +K4TAJ 252 +QTQ8T 530 +736Q2 968 +TTQQQ 3 +65888 762 +82828 975 +KAK6T 512 +TTTJT 487 +QQ9QQ 60 +34J46 533 +AAJA2 871 +76K5A 468 +952A9 400 +8J887 623 +J4K45 427 +666J6 312 +2JK2K 791 +J3336 597 +37377 56 +KKAAK 562 +66QQT 95 +TA66Q 914 +52225 187 +76KJJ 189 +AQT69 156 +A99A9 509 +JQAAA 316 +33T33 212 +22J2J 983 +46466 881 +QQQQT 314 +4949J 373 +KAJ2K 87 +55252 352 +67777 645 +Q5T35 376 +42444 891 +Q29Q9 226 +T43KQ 305 +9999A 441 +AAT5A 453 +97K6Q 110 +74979 422 +777AK 293 +TJTJK 476 +Q7JTT 870 +23222 436 +AK5Q9 321 +4QQKQ 90 +AQ9A9 942 +K2QT6 429 +Q9Q62 788 +74499 186 +A52T3 205 +652AA 702 +J488A 900 +64624 584 +8QK3K 223 +4JQ25 804 +TTQKT 810 +62946 760 +42422 322 +A3533 895 +77J97 790 +55K55 154 +5AT22 519 +26772 592 +76866 813 +56AJA 573 +KQKQQ 880 +7TAQ8 649 +Q2229 166 +6ATJ6 837 +44784 644 +6664J 120 +T9K6T 274 +JKJJK 342 +2TK35 577 +76666 403 +5J8Q3 239 +777J7 52 +9QQQJ 995 +56286 457 +6J777 999 +26662 349 +22QAJ 452 +838Q8 808 +34339 886 +79TQ4 366 +27782 148 +63868 764 +55574 622 +K2T9J 939 +34225 652 +9TTTT 971 +4464T 13 +J259T 260 +979AA 981 +75KKT 727 +22K49 692 +9TTJ9 940 +AT75T 498 +KK3QK 883 +Q8Q4A 970 +896K8 155 +J9595 704 +25J52 817 +Q347A 288 +K9999 51 +6K9K9 98 +K49J7 697 +A32AJ 410 +QQ2QJ 466 +363QQ 23 +53J3A 725 +32343 829 +777Q2 69 +3K3J3 605 +AAAJA 699 +7757T 117 +Q44K4 280 +7577K 147 +46649 526 +KK66K 541 +88Q7K 409 +66626 472 +54QK4 527 +A25TT 12 +T6QTT 404 +TT7KK 550 +22282 391 +J5455 37 +3T3T3 816 +775A5 111 +36T98 241 +88J58 430 +5QTQ7 353 +99899 386 +JAA88 227 +87887 713 +J25J7 848 +55588 38 +6KK8A 389 +5AA54 555 +KKKQ4 911 +699T7 766 +5JQTJ 330 +QTK98 780 +55JJA 752 +6279T 857 +957T4 621 +55AAA 379 +J59Q6 29 +878J7 818 +47AQT 348 +KQ48T 955 +9T49T 494 +A7A42 535 +QQQQ4 180 +66963 777 +6J366 730 +37J59 520 +8TT88 945 +QA4TT 561 +473J7 542 +4354K 825 +46QJ6 437 +T8885 669 +83K76 751 +Q5853 948 +64844 36 +QJ4J4 77 +A7777 372 +323J3 946 +45387 944 +66769 202 +93339 497 +85Q79 14 +J3AJ2 413 +98JA8 311 +QQQJ3 326 +J3QAQ 463 +44Q4Q 151 +8AA98 96 +TATTA 965 +7J37A 421 +K38Q9 635 +J72TK 59 +8A85A 164 +39999 854 +59572 109 +57TJ5 74 +83888 862 +77A2J 763 +JJ455 771 +TKJA2 834 +5QJ85 495 +J4444 932 +2TT3Q 856 +98KT3 438 +9TKK7 627 +566JA 638 +559Q9 628 +J6565 245 +8JKTA 711 +99QQ9 247 +34QT4 162 +684KK 731 +5A57A 254 +T9755 297 +9A96K 658 +34484 240 +QJ66J 450 +666K4 570 +A5AQK 878 +JQ662 905 +A6622 822 +J3Q39 177 +85555 858 +7T53Q 178 +8KA6T 931 +29K99 104 +TTTQ4 960 +AJ555 514 +TJT3T 214 +KA88J 912 +JJJJ8 102 +3633A 748 +7J447 705 +74444 45 +2QAQ2 125 +TJA7T 721 +T6QJK 324 +7AAAA 617 +4AQAJ 585 +7JJ77 576 +A32TQ 747 +76677 618 +AJ5Q9 70 +89627 360 +QJ5T7 602 +A8T36 896 +5AA36 411 +6255J 841 +44644 612 +3TJTK 66 +4JT4T 640 +JT4T8 146 +8733J 973 +K6944 256 +5K5KK 936 +KTT6K 388 +3JQ35 793 +94994 296 +55553 930 +777Q7 646 +A2AAQ 399 +555A6 32 +22323 75 +62262 957 +8745T 54 +828J8 974 +KKKTQ 383 +6J6Q9 261 +22522 27 +QK666 716 +78KK5 242 +T2Q22 728 +J9KKQ 424 +389A6 738 +98989 292 +8883K 68 +4344J 578 +2Q665 899 +58895 938 +63363 1 +44584 172 +JJT83 206 +88884 695 +J9K8J 579 +72532 414 +Q9T8A 877 +433K3 318 +K37Q4 253 +9999Q 675 +J3QQ5 884 +TTT54 4 +3K3TT 209 +4KJ44 401 +5J279 225 +222J2 333 +67J88 543 +662TQ 175 +Q696Q 745 +T46T6 113 +75557 361 +A48A4 130 +22Q2Q 10 +42292 558 +QKQQQ 523 +66JQA 188 +T676T 65 +7A5T6 510 +426Q9 72 +2Q222 934 +757TQ 888 +899TT 673 +59KQ4 723 +J666A 927 +QT7Q7 286 +J886Q 774 +JA2QQ 599 +K448K 93 +QKKQK 689 +66556 480 +QQ5AA 951 +T7T87 462 +4784J 216 +JT4T6 988 +553QK 654 +77277 337 +A9Q66 317 +82J82 64 +J7595 935 +8A2Q6 81 +J2427 152 +J22KQ 589 +77222 787 +7868K 826 +75A3J 916 +9A292 950 +6JT44 237 +T7TJ6 846 +2JKJA 564 +KT844 676 +Q4384 538 +Q6A68 114 +Q5868 505 +665TK 820 +55544 874 +AJKAK 30 +82A34 915 +Q583Q 251 +97TJA 496 +45744 608 +QQ6QQ 234 +QQQ9K 271 +3A99A 465 +37734 444 +5566T 507 +KKJKK 20 +2J673 492 +5J744 416 +93K64 369 +KKKK7 998 +33232 719 +A3A33 91 +Q53J7 267 +J5556 972 +44Q8Q 616 +T444J 548 +TJ3TJ 586 +92856 963 +K98T5 432 +J6J6J 772 +4J39Q 643 +34535 39 +7K7Q7 953 +T42J4 805 +2442A 47 +954A8 395 +K4466 991 +AQAAA 174 +J39KA 532 +7K2Q3 672 +25577 428 +QT659 715 +J6698 910 +35355 84 +8J895 218 +J5674 6 +K7537 567 +8Q634 380 +6828J 811 +7TJ8A 82 +477Q7 674 +7748A 244 +88288 257 +K9933 889 +T626T 269 +5T42Q 443 +2KA9Q 167 +K4KKK 16 +J2757 159 +Q5TQ6 845 +44888 560 +K65AT 191 +6K68Q 176 +66JJ8 978 +6K53J 615 +AAJ22 525 +J3J3J 99 +98898 906 +48JA2 454 +86J36 879 +66866 524 +3AA3A 872 +68Q46 733 +38JQ3 338 +65J75 128 +57J77 455 +AKA8K 138 +22J72 200 +9T7A6 310 +47777 25 +A3685 503 +T5A68 100 +979J8 528 +9JA22 782 +KJKKQ 913 +64942 907 +QQ954 598 +5KKKK 876 +5T5TT 779 +3992T 678 +5QQQ9 265 +3592K 924 +5554A 493 +T5698 170 +7496J 488 +TT474 192 +JK95A 80 +AAJJJ 40 +43644 307 +J57K5 650 +J8K82 961 +8J998 688 +T9984 9 +33J35 89 +J2AT9 985 +6239J 662 +88JJ8 595 +JK852 604 +66347 741 +Q6T69 278 +55665 696 +7942J 736 +35AK4 358 +7755J 384 +58A84 613 +5TTTT 919 +7A9T7 7 +K33QK 354 +AQQAA 235 +39TJT 196 +26229 976 +6664Q 865 +99QQQ 236 +374A6 956 +8QTT8 964 +A76AQ 112 +T8668 611 +66JJ6 729 +886Q6 814 +KK44J 993 +62AJ8 127 +ATJ64 402 +7K594 483 +96496 990 +7424J 761 +878K3 653 +486K3 980 +JQA44 852 +2TJ6J 339 +44T44 446 +73KTK 121 +T7787 513 +K67QT 717 +77287 136 +7QQJ8 18 +4342T 768 +5KK5J 847 +Q2Q7T 666 +6QJT2 529 +7T7A7 392 +J6676 445 +7733K 647 +Q676A 926 +QJQJQ 806 +QQQJ8 928 +48692 691 +JAA55 984 +J2423 800 +32JQ8 362 +T2744 937 +7J9TQ 277 +7K326 86 +3K9TJ 860 +77JKT 71 +46644 31 +23J2Q 323 +J3K96 393 +87QKK 456 +TQ5K2 569 +AAK9T 949 +56932 539 +Q5QQQ 356 +3Q4A2 126 +T53J2 283 +8732Q 461 +KTTKT 556 +Q8J3K 918 +JAAA7 340 +255KQ 469 +8A9AJ 201 +Q8965 144 +777J2 477 +A8AJQ 797 +3QQQ9 786 +6Q7T4 460 +QQQ82 656 +4K329 222 +A9979 190 +6T664 440 +4A434 153 +Q7JQ2 194 +7993J 651 +8822K 195 +7QQ77 464 +52295 371 \ No newline at end of file diff --git a/8/8-1.py b/8/8-1.py new file mode 100644 index 0000000..23b084e --- /dev/null +++ b/8/8-1.py @@ -0,0 +1,41 @@ +ENUM = {"L": 0, "R": 1} + + +def get_input(): + with open("eight.txt", "r") as f: + return [f.strip() for f in f.readlines()] + + +def create_dict(input): + d = {} + for i in input: + print("i", i) + if "LRR" in i: + d["ins"] = i + continue + if not i: + continue + print(i.split("=")) + k, vs = i.split("=") + k = k.replace(" ", "") + v1, v2 = vs.replace("(", "").replace(")", "").replace(" ", "").split(",") + d[k] = [v1, v2] + return d + + +def follow(d, start, depth=0): + next_ = start + for i, letter in enumerate(d["ins"]): + next_ = d[next_][ENUM[letter]] + if next_ == "ZZZ": + return depth * len(d["ins"]) + i + 1 + return follow(d, next_, depth + 1) + + +def main(): + input = get_input() + d = create_dict(input) + print(follow(d, "AAA")) + + +main() diff --git a/8/8-2.py b/8/8-2.py new file mode 100644 index 0000000..f1bf24e --- /dev/null +++ b/8/8-2.py @@ -0,0 +1,64 @@ +import math + +ENUM = {"L": 0, "R": 1} + + +def get_input(): + with open("eight.txt", "r") as f: + return [f.strip() for f in f.readlines()] + + +def create_dict(input): + d = {} + for i in input: + if "LRR" in i: + d["ins"] = i + continue + if not i: + continue + k, vs = i.split("=") + k = k.replace(" ", "") + v1, v2 = vs.replace("(", "").replace(")", "").replace(" ", "").split(",") + d[k] = [v1, v2] + return d + + +def get_starting_group(input): + group = [] + for i in input: + if i.endswith("A"): + group.append(i) + return group + + +def follow(d, start, depth=0): + next_ = start + for i, letter in enumerate(d["ins"]): + next_ = d[next_][ENUM[letter]] + if next_.endswith("Z"): + return depth * len(d["ins"]) + i + 1 + return next_ + + +def main(): + input = get_input() + d = create_dict(input) + nexts = get_starting_group(d) + depth = 0 + lengths = [] + for n in nexts: + depth = 0 + next_ = n + while True: + next_ = follow(d, next_, depth) + if type(next_) == int: + lengths.append(next_) + break + depth += 1 + print(math.lcm(*lengths)) + + +main() + +# 8429602563785865 too high +# 9064949303801 diff --git a/8/8-test.txt b/8/8-test.txt new file mode 100644 index 0000000..59e2d47 --- /dev/null +++ b/8/8-test.txt @@ -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) \ No newline at end of file diff --git a/8/8.txt b/8/8.txt new file mode 100644 index 0000000..e3792c5 --- /dev/null +++ b/8/8.txt @@ -0,0 +1,704 @@ +LRRRLRRRLRRLRLRRLRLRRLRRLRLLRRRLRLRLRRRLRRRLRLRLRLLRRLLRRLRRRLLRLRRRLRLRLRRRLLRLRRLRRRLRLRRRLLRLRRLRRRLRRLRRLRLRRLRRRLRLRRRLRRLLRRLRRLRLRRRLRRLRRRLRRRLRLRRLRLRRRLRLRRLRRLRRRLRRRLRRRLLRRLRRRLRLRLRLRRRLRLRLRRLRRRLRRRLRRLRRLLRLRRLLRLRRLRRLLRLLRRRLLRRLLRRLRRLRLRLRRRLLRRLRRRR + +DBQ = (RTP, NBX) +NFX = (PXX, PLG) +VBK = (BRV, DKG) +BRS = (HLR, VBX) +DDK = (SPR, TCR) +FTS = (LJB, MDJ) +BLH = (DFM, GGG) +PCC = (GQR, RHD) +QKN = (VVR, GBL) +KHN = (FNB, LLT) +HTD = (NPJ, BTL) +FPL = (BRX, XQD) +RCJ = (QKN, XPD) +XRN = (RMQ, LQB) +HGM = (VPV, SVR) +RFG = (TLM, KPH) +SSG = (QGC, KJV) +LPA = (QQN, GNF) +SVN = (VLM, BDX) +VPF = (TTR, RNQ) +VNK = (DSX, MCZ) +KMS = (XNN, MTB) +RLS = (NHX, CRT) +VRS = (VBX, HLR) +TVK = (MKG, NKB) +CKH = (DFF, XPV) +KBS = (LJC, PRS) +JMT = (FPT, DLX) +LRV = (QCD, RLF) +TMM = (VPF, GKD) +HKH = (PRS, LJC) +GSM = (SVH, KRP) +SLG = (PTL, SNJ) +GVS = (DSN, CKH) +QGC = (HKS, DFP) +RFT = (VVQ, GMF) +FDF = (JKV, JKV) +MRL = (PKS, TKS) +HBN = (BDX, VLM) +CFB = (PPV, QVS) +TFJ = (KGN, JND) +HLB = (PFV, JXR) +RFJ = (SKL, QCN) +PQH = (KGN, JND) +HGR = (FKL, XHR) +CTB = (HNQ, HNQ) +XMN = (CJV, LKQ) +JVX = (FSS, CRC) +SFH = (MXD, RHN) +BRK = (QPL, DJB) +HBX = (DSN, CKH) +RFL = (VXB, FNF) +GXP = (LHR, SMV) +CHK = (NLQ, VCR) +QPG = (HHL, KHB) +VBC = (NFV, FST) +QJF = (JXL, JJC) +XKQ = (PCS, BSH) +SKS = (SNN, QSN) +GJJ = (VVG, XPR) +DJP = (SJM, DNR) +DQF = (MHG, BKZ) +MSB = (BRX, XQD) +PQR = (TLL, RVS) +XGB = (RMT, HGF) +HBD = (PFD, FDN) +NSN = (RFJ, NJT) +SNJ = (MVG, DBQ) +NMV = (SKG, TDJ) +PTN = (TNR, SSG) +SBG = (CVH, LMJ) +RDT = (SVQ, JTT) +MRC = (BKF, QMJ) +JKV = (CTB, CTB) +CTX = (QHL, BDV) +SQM = (DNR, SJM) +MVG = (RTP, NBX) +KKJ = (TQP, PST) +QKX = (BRD, SFT) +VFV = (NTL, VMQ) +LXK = (SSL, MFR) +HDH = (VPS, MJH) +RTP = (CGJ, XJC) +BXQ = (FLN, FLN) +GKD = (TTR, RNQ) +GPP = (SNN, QSN) +GDQ = (JLS, TND) +LTF = (GXP, TVB) +GVB = (LSV, FRL) +JCF = (HGR, GMX) +VCR = (JTR, MCM) +XJC = (DGP, XML) +XKA = (SFC, CHQ) +LJL = (VPX, PMS) +CPH = (PCQ, QKX) +VPV = (TFP, NJN) +TDJ = (PRV, DBK) +JGQ = (TPX, NMV) +LJS = (GDQ, QPV) +VHN = (CBJ, PFQ) +JHT = (XHM, NRK) +ZZZ = (HJS, LRV) +KJV = (HKS, DFP) +HNT = (XXT, KJT) +RHD = (KQH, TMD) +JKG = (HXJ, MGF) +SPL = (TTB, STB) +MBD = (CQK, NHH) +TPX = (TDJ, SKG) +HRC = (LBB, JLR) +QHN = (JHT, THC) +SPM = (DDG, MBK) +MFG = (JBD, GSM) +MHR = (PTN, HVB) +RLF = (GMG, TDQ) +XBQ = (KKN, QTN) +GLB = (DHS, SXC) +PRV = (PGC, NSK) +SJD = (BXQ, GHF) +THC = (XHM, NRK) +GBL = (GGR, HTK) +MDK = (JXX, DBD) +NJT = (QCN, SKL) +LLG = (KBL, LXK) +RVS = (DDB, QRV) +LHR = (LPL, TGJ) +TBD = (NNB, CQH) +DSN = (DFF, XPV) +QQN = (HRV, PTT) +XPP = (GSJ, RDT) +CBJ = (JQL, RBX) +RBX = (CNV, NKQ) +DDG = (NBS, KTV) +XNN = (TMC, GCG) +DSX = (CGR, SGM) +DFB = (RCJ, KJK) +XTG = (RFG, XSD) +PKQ = (DBD, JXX) +XPD = (GBL, VVR) +FFC = (JLR, LBB) +GMG = (KFH, PTP) +QHJ = (SHM, FKM) +MXD = (XGB, LTX) +SGM = (FTS, GXX) +LTX = (RMT, HGF) +RNQ = (SPL, DKH) +NHF = (VXC, HRS) +KFR = (JXR, PFV) +NRP = (XNN, MTB) +VDR = (LDL, JCP) +FSS = (KXJ, GKL) +QVS = (MKN, BLH) +SNN = (SBM, PNH) +VXB = (LLG, BHP) +BPK = (QVS, PPV) +SMV = (TGJ, LPL) +CXF = (XKV, PVR) +PGC = (NBJ, KCK) +VLG = (DDG, MBK) +FKL = (HFC, XPP) +KFC = (XNM, CNR) +FCC = (BRK, GLT) +HQC = (JKV, JHQ) +QQV = (CPG, HQD) +VVG = (XGJ, XGJ) +SVK = (HVH, HNJ) +XQT = (LQX, HNT) +JDB = (PXM, THR) +JHR = (XRF, DHN) +HRS = (TFJ, PQH) +SVQ = (XHX, QNG) +KGN = (FCV, SBH) +GJX = (MFG, LMS) +NBJ = (GVB, RMS) +VQJ = (JPB, PDF) +TKX = (JMT, LGM) +FLL = (GTX, HKP) +MFT = (FKM, SHM) +JCP = (SSP, VMD) +LPC = (KCD, JDB) +XHR = (XPP, HFC) +FKM = (DLL, XBQ) +MGF = (NFX, MQS) +JXJ = (MMP, CBT) +DFP = (TGM, RHV) +SSM = (NTC, TMT) +DLX = (PXF, SBG) +NNB = (TNT, MMF) +QNG = (RHP, QBT) +FLR = (CJK, QRL) +RCP = (KKG, NTD) +GJV = (SLG, DGN) +FDN = (TBR, QDT) +JTG = (RFT, PRC) +LGM = (DLX, FPT) +QDT = (CXV, SGD) +HKP = (BLB, PCL) +GXB = (MNH, GXT) +QDS = (LTF, FDX) +LMJ = (GJV, HVV) +TDQ = (PTP, KFH) +SGD = (HTT, PNR) +XPV = (BPM, CPH) +PTP = (MKL, KSP) +DKG = (DKK, KNQ) +QCN = (XTD, GQM) +LSV = (GDK, VVD) +MLG = (RLS, RKG) +GMX = (FKL, XHR) +QSN = (PNH, SBM) +CHQ = (KSB, CXF) +RHN = (LTX, XGB) +LVX = (JSF, MLT) +XHM = (FLR, QVK) +NCJ = (CPG, HQD) +MQV = (HBD, LDK) +VVD = (QBV, FKF) +QCD = (GMG, TDQ) +GTH = (DLJ, DQF) +KFH = (KSP, MKL) +NFC = (PKQ, MDK) +NCD = (FNB, LLT) +MKG = (HNS, DDK) +BTV = (KBS, HKH) +QGL = (QTF, CVS) +DDB = (DVF, HXV) +PXF = (CVH, LMJ) +NFV = (XMN, BQR) +DGN = (SNJ, PTL) +HHL = (PHC, QQJ) +XPR = (XGJ, LVQ) +PCQ = (BRD, SFT) +MMT = (RDS, SRS) +DMR = (GJM, BQS) +QPL = (XNQ, CMN) +PDF = (JBH, CTX) +CVR = (STX, MBQ) +LPL = (SFL, PHQ) +FXX = (PNX, PQL) +KLS = (NHG, CHF) +NHX = (TMN, JLJ) +NND = (QHN, XBR) +JTT = (QNG, XHX) +LML = (FDX, LTF) +PCS = (LKV, LXX) +SRV = (KCD, JDB) +NSK = (NBJ, KCK) +MRF = (NKP, JKG) +VPX = (NSN, SMB) +GFT = (FPL, MSB) +DFM = (XKQ, PPQ) +PPQ = (PCS, BSH) +JJC = (JHR, RQG) +JBH = (BDV, QHL) +KNQ = (KNP, MRL) +TBS = (NTD, KKG) +JXL = (RQG, JHR) +GKL = (MJC, QBM) +BQR = (LKQ, CJV) +DGP = (VNT, JRB) +DKR = (VBJ, GVF) +JXN = (BXD, XLT) +TVG = (HGR, GMX) +XSD = (TLM, KPH) +RMT = (GXB, DPT) +FRL = (VVD, GDK) +PNX = (NCD, KHN) +VGK = (CNR, XNM) +MQB = (KSF, LJS) +KDC = (MSB, FPL) +GCD = (CXS, PCC) +XML = (VNT, JRB) +TBL = (GCV, HDH) +BRV = (DKK, KNQ) +JKS = (XXB, ZZZ) +TMC = (MDQ, QJF) +TNT = (NQJ, SSM) +FLF = (XSD, RFG) +JRB = (FDF, HQC) +PTL = (DBQ, MVG) +BGQ = (KFR, HLB) +XTD = (VRS, BRS) +QXX = (SJD, CSH) +FRX = (BQS, GJM) +PQL = (NCD, KHN) +LKV = (PNK, DKR) +HQS = (VVG, XPR) +VPQ = (NTL, VMQ) +THR = (CBV, CVR) +FST = (BQR, XMN) +DMD = (CVS, QTF) +HXV = (RCP, TBS) +STM = (RFX, BFR) +JTR = (JTL, JXN) +FLG = (PFQ, CBJ) +CKM = (KFB, HTP) +NCT = (KJK, RCJ) +DKH = (STB, TTB) +QGA = (CGR, SGM) +XNQ = (HJM, MLG) +RGF = (LFN, FGC) +QBV = (VPJ, RMN) +QKJ = (KFC, VGK) +CSB = (FDL, FDL) +HFK = (DHS, SXC) +SVP = (NPJ, BTL) +GGR = (XTG, FLF) +XKV = (NDH, JXJ) +BMR = (FRX, DMR) +VVQ = (BFN, TVK) +HJM = (RKG, RLS) +RLK = (PDF, JPB) +DCX = (HNQ, BRZ) +TBG = (RTL, SML) +RMS = (FRL, LSV) +FCV = (STM, HTC) +SPR = (TBL, JGG) +BHP = (LXK, KBL) +NPJ = (XLV, PQR) +NKF = (TBD, DKP) +PDK = (JTK, JTK) +PFQ = (RBX, JQL) +LBB = (SVP, HTD) +GTX = (BLB, PCL) +SBH = (HTC, STM) +BFR = (RJN, BTN) +TCR = (TBL, JGG) +MQS = (PXX, PLG) +FRG = (XXB, XXB) +STX = (XQL, HGM) +HNJ = (HBN, SVN) +SSL = (RDL, NST) +HJS = (QCD, RLF) +KBL = (SSL, MFR) +CXS = (RHD, GQR) +DFD = (NFP, FCC) +VBJ = (HFK, GLB) +DKP = (NNB, CQH) +QSK = (TKX, CQT) +BNV = (JTK, GTH) +NBH = (LVX, GQB) +QBM = (VNC, VPK) +DBD = (HHR, RVQ) +DFF = (BPM, CPH) +LQX = (KJT, XXT) +FGC = (QKQ, QSK) +PXM = (CBV, CVR) +JHQ = (CTB, DCX) +NJN = (BGQ, FBP) +TLL = (DDB, QRV) +XSN = (THS, KJQ) +KXJ = (QBM, MJC) +GSC = (TQG, QXX) +QJP = (PQL, PNX) +PHH = (MXD, RHN) +SSC = (NQX, FCH) +XDF = (NLQ, VCR) +BRD = (MQV, FRQ) +AAA = (LRV, HJS) +PTT = (FFC, HRC) +VKF = (BFG, TGQ) +HHA = (FLG, VHN) +CNR = (TQX, VDV) +TGM = (FLL, TNV) +GLT = (DJB, QPL) +MBK = (NBS, KTV) +JPB = (JBH, CTX) +RHP = (SQM, DJP) +CHF = (CLQ, JGQ) +FTL = (PRC, RFT) +SKL = (XTD, GQM) +RBN = (SPM, VLG) +HGF = (GXB, DPT) +BQS = (NSP, BTV) +XHX = (RHP, QBT) +CGR = (GXX, FTS) +BLB = (QJP, FXX) +CRT = (JLJ, TMN) +PLG = (SLC, PDD) +HRV = (FFC, HRC) +MCM = (JXN, JTL) +JGH = (MFG, LMS) +NSP = (KBS, HKH) +MFR = (NST, RDL) +GMF = (TVK, BFN) +SML = (LJL, XFP) +MPL = (RDS, SRS) +QHP = (SPM, VLG) +FCH = (GDC, XRN) +NRQ = (FTL, JTG) +HMB = (CRC, FSS) +KPH = (BNH, SLK) +SRS = (MQB, GCN) +RQM = (TGQ, BFG) +FLN = (CSB, CSB) +BSH = (LKV, LXX) +CRC = (KXJ, GKL) +CJV = (XDF, CHK) +CGJ = (DGP, XML) +SFL = (GJJ, HQS) +PMR = (VPF, GKD) +QTN = (MMT, MPL) +KJQ = (RLK, VQJ) +PBJ = (LFN, FGC) +BTL = (PQR, XLV) +SBX = (KFC, VGK) +QQJ = (PDK, BNV) +BRZ = (GNF, QQN) +JTL = (XLT, BXD) +SKG = (PRV, DBK) +RQG = (DHN, XRF) +DRC = (SFC, CHQ) +TJQ = (NQX, FCH) +PKS = (TMM, PMR) +TRP = (GVD, FBL) +LKQ = (XDF, CHK) +RTL = (XFP, LJL) +PPV = (MKN, BLH) +MTB = (GCG, TMC) +FPT = (PXF, SBG) +LDK = (FDN, PFD) +TND = (PPX, SVK) +VPK = (NHF, JDX) +HTP = (NKF, RPV) +PMS = (SMB, NSN) +GGG = (XKQ, PPQ) +DLL = (KKN, QTN) +JXX = (HHR, RVQ) +KSF = (QPV, GDQ) +XQD = (FGK, BNJ) +RJF = (CSB, KTM) +GCN = (KSF, LJS) +JKP = (LML, QDS) +XFP = (VPX, PMS) +DPT = (GXT, MNH) +DKK = (KNP, MRL) +NKB = (DDK, HNS) +CJK = (GSC, GBQ) +NLM = (LDL, JCP) +VMD = (DFD, XFM) +NBX = (XJC, CGJ) +PRS = (NLM, VDR) +RMQ = (FRG, FRG) +XNM = (TQX, VDV) +LJC = (VDR, NLM) +PHQ = (GJJ, HQS) +KXN = (KHB, HHL) +BXD = (CKM, XVL) +KFB = (NKF, RPV) +NFS = (PRL, RFL) +RJN = (SFV, RRG) +GQM = (VRS, BRS) +KQH = (VBC, BSJ) +DNR = (BMR, LJQ) +HHR = (LPC, SRV) +DLJ = (MHG, MHG) +SMB = (RFJ, NJT) +RHV = (FLL, TNV) +NTD = (HBX, GVS) +VNT = (FDF, HQC) +PRC = (GMF, VVQ) +FBP = (HLB, KFR) +KTM = (FDL, LRZ) +TQP = (QGL, DMD) +SBM = (QPG, KXN) +QVK = (CJK, QRL) +XRF = (RGF, PBJ) +NDH = (CBT, MMP) +GVL = (RTL, SML) +LRZ = (VHN, FLG) +CQH = (MMF, TNT) +SLK = (TJQ, SSC) +QBT = (SQM, DJP) +FNF = (LLG, BHP) +STB = (KMS, NRP) +HVV = (SLG, DGN) +RFX = (BTN, RJN) +MKL = (GVM, LVP) +VDV = (BPK, CFB) +CBT = (GJX, JGH) +PPX = (HVH, HNJ) +NQJ = (TMT, NTC) +MJH = (MHP, XQT) +LTA = (KLS, BFV) +CSH = (BXQ, GHF) +HTK = (XTG, FLF) +VNC = (JDX, NHF) +BFG = (MRC, NKK) +KKG = (GVS, HBX) +PNK = (GVF, VBJ) +XXB = (LRV, HJS) +DVF = (TBS, RCP) +PNR = (NCJ, QQV) +QKQ = (CQT, TKX) +TTR = (SPL, DKH) +BTN = (RRG, SFV) +VLM = (PHH, SFH) +TQG = (SJD, CSH) +MHP = (LQX, HNT) +NQX = (GDC, XRN) +TQX = (BPK, CFB) +TVB = (LHR, SMV) +MBQ = (XQL, HGM) +HXJ = (MQS, NFX) +DHN = (PBJ, RGF) +BFN = (MKG, NKB) +PVR = (JXJ, NDH) +QRL = (GBQ, GSC) +GJM = (NSP, BTV) +KQV = (NHH, CQK) +KNP = (TKS, PKS) +PDD = (FND, JKP) +GXT = (VKF, RQM) +XDC = (FTL, JTG) +MMF = (SSM, NQJ) +BFV = (CHF, NHG) +DHS = (PHX, PHX) +VXC = (PQH, TFJ) +XLV = (TLL, RVS) +PXX = (SLC, PDD) +GVD = (DRC, DRC) +THS = (VQJ, RLK) +DBK = (PGC, NSK) +KHB = (PHC, QQJ) +TKS = (PMR, TMM) +SVR = (NJN, TFP) +HNQ = (QQN, GNF) +MKN = (GGG, DFM) +KRP = (NFM, NFC) +SHM = (XBQ, DLL) +NTL = (NCT, DFB) +NRK = (QVK, FLR) +HXL = (DSX, DSX) +KSB = (XKV, PVR) +NKK = (BKF, QMJ) +MHG = (KLS, BFV) +PNP = (XBR, QHN) +CLQ = (TPX, NMV) +RSG = (XDC, NRQ) +BPM = (PCQ, QKX) +PHC = (PDK, BNV) +TNR = (KJV, QGC) +XQL = (VPV, SVR) +MHV = (QTS, RSG) +XBR = (THC, JHT) +BDX = (PHH, SFH) +TBR = (CXV, SGD) +RVQ = (SRV, LPC) +NFM = (PKQ, MDK) +FBL = (DRC, QSZ) +TLM = (BNH, SLK) +NHH = (SKS, GPP) +FKF = (RMN, VPJ) +XVL = (HTP, KFB) +NHG = (CLQ, JGQ) +FGK = (NBH, KBX) +VMQ = (DFB, NCT) +LXX = (DKR, PNK) +SMJ = (QGB, NFS) +LVP = (KDC, GFT) +QGB = (PRL, RFL) +BRX = (BNJ, FGK) +BDV = (MRF, RXX) +SJM = (BMR, LJQ) +GBQ = (TQG, QXX) +JXR = (XJT, CVX) +TMN = (XSN, PQM) +CQT = (LGM, JMT) +CPG = (QHP, RBN) +BKZ = (BFV, KLS) +VVR = (HTK, GGR) +XFM = (NFP, FCC) +CVH = (GJV, HVV) +VPS = (XQT, MHP) +MDJ = (QHJ, MFT) +SNF = (QTS, RSG) +NKQ = (HMB, JVX) +PRL = (FNF, VXB) +CMN = (MLG, HJM) +JQL = (NKQ, CNV) +QSZ = (CHQ, SFC) +HLR = (MHV, SNF) +RDL = (TBG, GVL) +GVM = (KDC, GFT) +KTV = (CKK, VBK) +SLC = (JKP, FND) +QHL = (MRF, RXX) +KKN = (MPL, MMT) +TNV = (HKP, GTX) +QMJ = (TVG, JCF) +BSJ = (NFV, FST) +BNJ = (NBH, KBX) +XXQ = (GCD, CMQ) +TGQ = (NKK, MRC) +SVH = (NFC, NFM) +LQB = (FRG, JKS) +GNF = (HRV, PTT) +PFV = (CVX, XJT) +JTK = (DLJ, DLJ) +KSP = (LVP, GVM) +PFD = (TBR, QDT) +MLT = (KSQ, KKJ) +GVF = (HFK, GLB) +JLS = (PPX, SVK) +TBK = (CMQ, GCD) +LJB = (QHJ, MFT) +KSQ = (PST, TQP) +SXC = (PHX, TRP) +TTB = (NRP, KMS) +VBX = (MHV, SNF) +CXV = (PNR, HTT) +XCT = (NFS, QGB) +JBD = (KRP, SVH) +JDX = (HRS, VXC) +BNH = (TJQ, SSC) +HQD = (RBN, QHP) +RXX = (NKP, JKG) +NTC = (NND, PNP) +QTF = (TVQ, MHR) +JND = (FCV, SBH) +RDS = (MQB, GCN) +FDL = (FLG, VHN) +TGJ = (SFL, PHQ) +KBX = (GQB, LVX) +GQR = (TMD, KQH) +LMS = (JBD, GSM) +VPJ = (SMJ, XCT) +LVQ = (HXL, VNK) +GDK = (QBV, FKF) +KCD = (PXM, THR) +JGG = (GCV, HDH) +NFP = (BRK, GLT) +SFV = (TBK, XXQ) +KJK = (QKN, XPD) +CVX = (SBX, QKJ) +GCG = (QJF, MDQ) +FNB = (VFV, VPQ) +CBV = (STX, MBQ) +PNH = (QPG, KXN) +HFC = (GSJ, RDT) +GHF = (FLN, RJF) +CKK = (BRV, DKG) +LFN = (QKQ, QSK) +MNH = (VKF, RQM) +MMP = (GJX, JGH) +HVB = (SSG, TNR) +TMD = (BSJ, VBC) +QTS = (NRQ, XDC) +TVQ = (PTN, HVB) +HTT = (QQV, NCJ) +PQM = (KJQ, THS) +XJT = (QKJ, SBX) +PST = (QGL, DMD) +XXT = (MBD, KQV) +PCL = (QJP, FXX) +MJC = (VPK, VNC) +QPV = (JLS, TND) +JLJ = (PQM, XSN) +BKF = (TVG, JCF) +SFT = (FRQ, MQV) +XGJ = (HXL, HXL) +JSF = (KKJ, KSQ) +RMN = (XCT, SMJ) +RPV = (TBD, DKP) +XLT = (CKM, XVL) +DJB = (CMN, XNQ) +KCK = (GVB, RMS) +LLT = (VFV, VPQ) +CVS = (MHR, TVQ) +NBS = (VBK, CKK) +LJQ = (DMR, FRX) +HKS = (TGM, RHV) +HTC = (BFR, RFX) +LDL = (VMD, SSP) +QRV = (HXV, DVF) +NST = (TBG, GVL) +GQB = (JSF, MLT) +KJT = (MBD, KQV) +GSJ = (SVQ, JTT) +FDX = (TVB, GXP) +SSP = (XFM, DFD) +FRQ = (LDK, HBD) +JLR = (HTD, SVP) +HNS = (SPR, TCR) +MCZ = (SGM, CGR) +GCV = (VPS, MJH) +MDQ = (JJC, JXL) +RKG = (NHX, CRT) +TMT = (NND, PNP) +SFC = (KSB, CXF) +CQK = (SKS, GPP) +FND = (LML, QDS) +HVH = (HBN, SVN) +CNV = (HMB, JVX) +CMQ = (CXS, PCC) +NLQ = (JTR, MCM) +GDC = (RMQ, RMQ) +PHX = (GVD, GVD) +NKP = (HXJ, MGF) +RRG = (XXQ, TBK) +TFP = (BGQ, FBP) +GXX = (LJB, MDJ) \ No newline at end of file diff --git a/9/9-1.py b/9/9-1.py new file mode 100644 index 0000000..fd41bd0 --- /dev/null +++ b/9/9-1.py @@ -0,0 +1,58 @@ +def get_input(): + with open("nine.txt", "r") as f: + return f.read().splitlines() + + +def get_next_line(line): + next_ = [] + for i, n in enumerate(line): + if i == len(line) - 1: + return next_ + next_.append(int(line[i + 1]) - int(n)) + + +def extrapolate(line): + """ + "1 3 6 10 15" + => + [ + [1, 3, 6, 10, 15], + [2, 3, 4, 5], + [1, 1, 1], + [0, 0] + ] + """ + l = line.split(" ") + lines = [[int(i) for i in l]] + while not all([n == 0 for n in l]): + l = get_next_line(l) + lines.append(l) + return lines + + +def expand_line(line): + prev = 0 + for l in reversed(line): + l.append(prev + l[-1]) + prev = l[-1] + return line + + +def sum_expanded(expanded): + sum = 0 + for e in expanded: + sum += e[0][-1] + return sum + + +def main(): + input = get_input() + extrapolated = [extrapolate(l) for l in input] + expanded = [expand_line(l) for l in extrapolated] + total = sum_expanded(expanded) + print(total) + + +main() + +# 1782868781 diff --git a/9/9-2.py b/9/9-2.py new file mode 100644 index 0000000..54d35bf --- /dev/null +++ b/9/9-2.py @@ -0,0 +1,58 @@ +def get_input(): + with open("nine.txt", "r") as f: + return f.read().splitlines() + + +def get_next_line(line): + next_ = [] + for i, n in enumerate(line): + if i == len(line) - 1: + return next_ + next_.append(int(line[i + 1]) - int(n)) + + +def extrapolate(line): + """ + "1 3 6 10 15" + => + [ + [1, 3, 6, 10, 15], + [2, 3, 4, 5], + [1, 1, 1], + [0, 0] + ] + """ + l = line.split(" ") + lines = [[int(i) for i in l]] + while not all([n == 0 for n in l]): + l = get_next_line(l) + lines.append(l) + return lines + + +def expand_line(line): + prev = 0 + for l in reversed(line): + l.insert(0, l[0] - prev) + prev = l[0] + return line + + +def sum_expanded(expanded): + sum = 0 + for e in expanded: + sum += e[0][0] + return sum + + +def main(): + input = get_input() + extrapolated = [extrapolate(l) for l in input] + expanded = [expand_line(l) for l in extrapolated] + total = sum_expanded(expanded) + print(total) + + +main() + +# 1057 \ No newline at end of file diff --git a/9/9-test.txt b/9/9-test.txt new file mode 100644 index 0000000..70c5595 --- /dev/null +++ b/9/9-test.txt @@ -0,0 +1,3 @@ +0 3 6 9 12 15 +1 3 6 10 15 21 +10 13 16 21 30 45 \ No newline at end of file diff --git a/9/9.txt b/9/9.txt new file mode 100644 index 0000000..0da59e2 --- /dev/null +++ b/9/9.txt @@ -0,0 +1,200 @@ +13 31 64 123 233 435 798 1465 2767 5449 11062 22585 45351 88361 166080 300819 525817 889147 1458580 2327551 3622381 +5 11 27 54 98 187 407 965 2292 5227 11396 24048 49871 102731 210910 430327 867479 1717515 3325041 6278042 11548800 +-8 -14 -13 -2 19 63 186 531 1386 3256 6949 13676 25165 43789 72708 116025 178956 268014 391207 558250 780791 +27 38 47 54 59 62 63 62 59 54 47 38 27 14 -1 -18 -37 -58 -81 -106 -133 +13 32 54 87 148 275 551 1133 2277 4349 7823 13309 21761 35269 59447 109865 228203 520599 1243968 2990366 7060964 +10 23 42 62 78 85 78 52 2 -77 -190 -342 -538 -783 -1082 -1440 -1862 -2353 -2918 -3562 -4290 +17 40 73 131 249 502 1055 2267 4883 10365 21449 43091 84109 160077 298453 547712 993875 1791324 3222271 5814549 10577055 +20 39 67 115 212 409 788 1479 2686 4732 8174 14147 25321 48259 98614 211560 461156 993993 2084409 4220623 8233062 +21 29 42 79 171 361 704 1267 2129 3381 5126 7479 10567 14529 19516 25691 33229 42317 53154 65951 80931 +14 39 84 169 328 609 1074 1799 2874 4403 6504 9309 12964 17629 23478 30699 39494 50079 62684 77553 94944 +21 41 85 174 344 655 1202 2137 3731 6547 11879 22762 46105 96902 206177 435649 904757 1840988 3674747 7219223 14010166 +11 25 59 117 198 293 377 388 181 -559 -2465 -6721 -15408 -31995 -62011 -113938 -200369 -339479 -556861 -887783 -1379926 +3 5 9 25 77 203 455 899 1615 2697 4253 6405 9289 13055 17867 23903 31355 40429 51345 64337 79653 +12 14 7 -9 -24 -6 113 452 1203 2672 5354 10053 18037 31160 51754 81842 120774 159642 169657 79907 -262642 +1 6 27 76 171 336 601 1002 1581 2386 3471 4896 6727 9036 11901 15406 19641 24702 30691 37716 45891 +5 4 -1 -11 -17 17 185 693 1955 4778 10746 23032 48077 98947 201864 408735 821203 1637394 3244403 6404069 12628677 +9 21 44 90 186 382 768 1515 2965 5812 11443 22544 44129 85262 162023 302942 559599 1028105 1893128 3517688 6624314 +6 8 22 56 113 200 349 665 1443 3442 8489 20744 49236 112742 248802 529733 1090028 2171620 4196288 7878128 14393667 +10 6 0 -9 -17 -3 94 430 1384 3829 9653 22684 50245 105711 212793 413161 781189 1454703 2702133 5071680 9721774 +21 27 31 33 46 112 323 847 1959 4077 7803 13969 23688 38410 59983 90719 133465 191679 269511 371889 504610 +10 12 15 29 68 158 352 751 1540 3064 5987 11593 22298 42442 79416 145147 257910 444356 741535 1198549 1877288 +20 25 38 83 198 431 833 1453 2360 3757 6317 11966 25468 57337 128816 279928 581924 1155833 2199264 4024125 7108514 +-2 4 20 46 82 128 184 250 326 412 508 614 730 856 992 1138 1294 1460 1636 1822 2018 +13 29 58 100 155 223 304 398 505 625 758 904 1063 1235 1420 1618 1829 2053 2290 2540 2803 +4 -4 -4 19 92 270 656 1423 2844 5365 9824 18043 34218 67832 139272 290046 600652 1221046 2421748 4678583 8811816 +11 24 44 80 146 261 449 739 1165 1766 2586 3674 5084 6875 9111 11861 15199 19204 23960 29556 36086 +8 1 -5 -2 17 55 108 162 190 149 -23 -410 -1121 -2293 -4094 -6726 -10428 -15479 -22201 -30962 -42179 +4 5 20 59 136 290 623 1360 2936 6115 12146 22961 41420 71608 119189 191822 299644 455825 677200 984983 1405568 +21 42 67 106 187 365 737 1466 2817 5208 9279 15982 26695 43363 68669 106238 160877 238854 348219 499170 704467 +-6 4 23 41 40 4 -57 -68 173 1110 3672 9795 23489 52878 113858 236298 474060 920544 1731981 3161309 5606182 +16 20 23 22 18 22 63 202 571 1496 3836 9790 24619 60050 140654 315338 677426 1398844 2786949 5376902 10078608 +29 55 91 133 184 267 451 906 2018 4615 10372 22465 46510 91717 171969 306214 517375 829799 1269309 1882093 2818648 +-1 -2 11 56 167 416 945 2016 4092 7959 14896 26915 47162 80779 137081 235250 418803 790622 1593665 3388706 7430499 +15 22 32 44 71 155 399 1042 2630 6389 15008 34221 75869 163555 342598 696754 1375093 2633468 4896124 8844078 15537823 +11 15 33 72 139 241 385 578 827 1139 1521 1980 2523 3157 3889 4726 5675 6743 7937 9264 10731 +1 9 31 84 194 405 808 1597 3163 6250 12219 23497 44328 81992 148716 264568 461701 790399 1327471 2187642 3538702 +19 41 73 115 167 229 301 383 475 577 689 811 943 1085 1237 1399 1571 1753 1945 2147 2359 +-2 0 12 43 102 198 340 537 798 1132 1548 2055 2662 3378 4212 5173 6270 7512 8908 10467 12198 +28 38 47 62 103 227 574 1446 3430 7577 15669 30679 57709 106064 193835 357711 673333 1296669 2547420 5076961 10206420 +-3 -7 -11 -15 -19 -23 -27 -31 -35 -39 -43 -47 -51 -55 -59 -63 -67 -71 -75 -79 -83 +2 23 58 113 198 321 487 709 1037 1619 2833 5592 12074 27460 63934 149458 346048 785963 1740092 3741843 7803266 +7 22 51 101 190 364 734 1548 3336 7210 15474 32821 68603 141013 284587 563297 1092733 2076506 3864037 7039241 12552068 +16 38 77 137 227 372 643 1221 2512 5345 11327 23512 47679 94721 184937 355406 672120 1249176 2278089 4071203 7124259 +12 19 22 29 67 207 605 1566 3647 7827 15787 30361 56240 101035 176832 302402 506262 830819 1337868 2115757 3288577 +24 34 51 82 137 233 396 663 1084 1722 2652 3973 5875 8851 14217 25206 49040 100562 208233 423572 835445 +19 18 10 -4 -22 -28 45 398 1542 4660 12328 29900 68071 147453 306481 614677 1194333 2255154 4148494 7450736 13089384 +-2 4 22 54 103 174 279 459 851 1852 4474 11056 26621 61379 135267 286152 584701 1161421 2255683 4303555 8091952 +2 -1 -3 -8 -20 -36 -24 131 746 2599 7493 19466 47313 109657 244763 528824 1108814 2259523 4479465 8647472 16271542 +14 18 31 76 186 401 774 1396 2447 4277 7518 13225 23041 39378 65603 106215 166996 255116 379169 549114 776092 +6 27 62 110 179 303 571 1178 2512 5294 10792 21139 39805 72312 127349 218553 367386 607773 993490 1609724 2590791 +3 15 42 87 169 343 730 1569 3319 6864 13921 27849 55267 109332 216426 429732 856347 1710101 3411456 6770615 13312821 +5 12 29 65 134 257 466 810 1363 2234 3579 5615 8636 13031 19304 28096 40209 56632 78569 107469 145058 +19 37 74 139 235 350 442 412 64 -932 -3016 -6507 -10855 -12783 -2261 45486 184885 526543 1282738 2843103 5897371 +6 25 60 113 183 266 368 541 960 2075 4894 11492 25939 56093 117296 240267 487950 990613 2016412 4107787 8334907 +-2 6 28 68 128 204 291 407 646 1270 2850 6466 13976 28364 54177 98061 169406 281110 450472 700224 1059712 +15 34 78 166 327 613 1138 2168 4312 8904 18721 39252 80818 161943 314491 591214 1076501 1901278 3263184 5453338 8891217 +8 0 -12 -28 -48 -72 -100 -132 -168 -208 -252 -300 -352 -408 -468 -532 -600 -672 -748 -828 -912 +23 41 67 114 210 417 878 1907 4137 8741 17741 34420 63852 113565 194352 321245 514667 801777 1218023 1808918 2632054 +17 21 40 100 253 592 1269 2525 4756 8667 15617 28346 52418 98934 189392 364027 695587 1311329 2427094 4398688 7797507 +17 30 43 66 120 237 460 843 1451 2360 3657 5440 7818 10911 14850 19777 25845 33218 42071 52590 64972 +8 15 26 45 75 111 130 78 -146 -709 -1866 -3985 -7575 -13317 -22098 -35048 -53580 -79433 -114718 -161967 -224185 +13 25 55 114 228 445 849 1604 3062 5989 12014 24518 50388 103416 210732 424770 845406 1661100 3225928 6204273 11841243 +10 33 70 119 174 225 258 255 194 49 -210 -617 -1210 -2031 -3126 -4545 -6342 -8575 -11306 -14601 -18530 +16 26 33 47 89 189 392 794 1638 3505 7651 16606 35333 73659 151540 310382 636788 1310920 2702125 5552709 11321537 +4 10 20 42 99 242 580 1354 3092 6903 15021 31830 65854 133706 267978 532892 1054816 2080396 4084430 7964690 15384481 +14 15 17 36 99 245 537 1091 2128 4072 7773 15059 30053 62076 131549 281168 595826 1236373 2494425 4878150 9242375 +12 18 38 85 180 373 785 1681 3588 7483 15099 29446 55759 103361 189566 348147 647858 1232614 2407286 4817481 9818724 +5 12 42 119 287 634 1332 2695 5251 9821 17605 30298 50303 81177 128543 201828 317345 503426 808532 1313513 2149463 +5 13 42 118 292 658 1375 2690 4956 8634 14271 22490 34195 51668 82402 150146 323229 781601 1966390 4898528 11832700 +22 32 50 91 193 428 913 1835 3529 6697 12944 25951 53828 113534 238812 494090 998742 1970027 3801022 7206038 13498221 +15 23 31 39 47 55 63 71 79 87 95 103 111 119 127 135 143 151 159 167 175 +1 0 2 7 15 26 40 57 77 100 126 155 187 222 260 301 345 392 442 495 551 +10 28 62 120 210 344 550 902 1595 3120 6641 14761 33021 72763 156515 328051 671216 1345424 2653184 5169150 9986124 +8 4 -7 -21 -11 90 417 1218 2930 6315 12706 24454 45770 84404 155133 287046 538400 1025754 1978651 3837913 7425375 +0 -8 -11 6 79 285 770 1789 3763 7367 13693 24600 43490 76960 138104 252709 470242 882402 1653157 3065650 5593193 +13 23 48 96 175 293 458 678 961 1315 1748 2268 2883 3601 4430 5378 6453 7663 9016 10520 12183 +25 45 81 140 229 355 525 746 1025 1369 1785 2280 2861 3535 4309 5190 6185 7301 8545 9924 11445 +25 37 51 79 137 247 441 764 1285 2146 3707 6874 13710 28398 58524 116494 220869 398141 688819 1172211 2052227 +3 -1 2 18 45 73 100 187 588 2014 6142 16606 40997 95009 211040 455635 963597 2001957 4084946 8172378 15999177 +12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 +21 42 78 136 228 387 700 1373 2850 6014 12507 25224 49071 92139 167547 296361 512219 868602 1450108 2389632 3894054 +-5 -13 -24 -38 -55 -75 -98 -124 -153 -185 -220 -258 -299 -343 -390 -440 -493 -549 -608 -670 -735 +7 8 23 68 167 352 663 1148 1863 2872 4247 6068 8423 11408 15127 19692 25223 31848 39703 48932 59687 +8 16 31 68 152 326 666 1303 2452 4448 7789 13186 21620 34406 53264 80397 118576 171232 242555 337600 462400 +5 12 30 78 199 465 977 1863 3279 5417 8523 12938 19228 28655 44778 78314 160365 375110 934196 2334402 5671873 +9 37 76 129 207 328 522 859 1526 2998 6387 14122 31226 67639 142339 290526 576007 1112387 2099078 3881975 7054585 +21 40 74 130 219 356 560 854 1265 1824 2566 3530 4759 6300 8204 10526 13325 16664 20610 25234 30611 +15 37 68 111 178 294 501 862 1465 2427 3898 6065 9156 13444 19251 26952 36979 49825 66048 86275 111206 +-7 -14 -16 -6 32 133 368 871 1887 3872 7716 15247 30361 61493 126818 264741 554266 1153511 2371673 4803725 9585087 +-2 -6 -16 -18 16 139 466 1249 3005 6729 14268 29019 57272 110818 212054 404113 771236 1479916 2861264 5572584 10905652 +8 4 -10 -28 -37 -23 18 74 135 258 700 2131 5922 14477 31542 62377 113618 192584 305698 455590 636333 +7 7 15 42 102 222 473 1045 2404 5584 12682 27639 57405 113601 214806 389612 680605 1149445 1883233 3002368 4670112 +-3 1 11 29 59 105 168 242 309 333 253 -25 -637 -1771 -3678 -6684 -11203 -17751 -26961 -39599 -56581 +6 12 30 71 144 256 412 615 866 1164 1506 1887 2300 2736 3184 3631 4062 4460 4806 5079 5256 +7 5 1 0 18 97 334 932 2291 5186 11139 23208 47636 97218 198026 402609 815600 1643121 3288203 6536349 12920233 +10 19 43 94 192 367 653 1081 1694 2628 4330 8026 16638 36546 81028 177109 379258 796409 1643885 3339982 6679564 +14 25 47 80 124 179 245 322 410 509 619 740 872 1015 1169 1334 1510 1697 1895 2104 2324 +1 1 12 45 109 205 331 510 863 1764 4140 10039 23727 53853 117702 249264 513693 1031391 2014688 3817481 6990785 +6 17 32 46 45 8 -90 -279 -604 -1149 -2080 -3712 -6605 -11694 -20458 -35133 -58974 -96571 -154224 -240382 -366151 +9 13 28 76 202 488 1081 2245 4444 8455 15498 27359 46481 76020 119925 183224 272907 400121 584864 865022 1312476 +-5 1 21 69 169 355 671 1171 1919 2989 4465 6441 9021 12319 16459 21575 27811 35321 44269 54829 67185 +-1 17 64 165 370 771 1533 2960 5627 10630 20057 37888 71715 135951 257571 485872 908187 1673819 3028482 5360963 9262156 +0 14 38 86 199 453 965 1908 3568 6522 12094 23361 47130 97484 201724 409947 810472 1555670 2907966 5326308 9632881 +11 34 78 150 257 406 604 858 1175 1562 2026 2574 3213 3950 4792 5746 6819 8018 9350 10822 12441 +5 8 11 14 17 20 23 26 29 32 35 38 41 44 47 50 53 56 59 62 65 +5 14 49 120 243 457 847 1573 2905 5264 9269 15790 26007 41475 64195 96691 142093 204226 287705 398036 541723 +11 10 7 1 -16 -53 -91 -19 477 2084 6103 14773 31690 62333 114709 200129 334127 537534 837719 1270009 1879300 +17 41 82 146 243 398 674 1215 2321 4577 9080 17850 34579 65958 123886 228820 414241 731561 1253774 2075102 3303875 +14 12 15 35 91 227 545 1257 2760 5747 11394 21714 40250 73418 133114 241955 444374 830974 1592249 3134577 6321825 +0 11 26 35 20 -34 -114 -144 65 913 3257 9044 22824 55056 128767 292078 640490 1354815 2763548 5442797 10373384 +22 42 78 144 272 520 991 1887 3630 7086 13928 27170 51896 96196 172305 297921 497654 804530 1261442 1922404 2853424 +-1 2 1 -6 -19 -23 33 264 895 2366 5595 12594 27777 60501 129651 271428 551935 1086690 2069837 3816586 6823301 +11 30 67 133 259 517 1044 2071 3968 7334 13206 23568 42574 79383 154485 313338 654858 1389185 2951407 6219053 12916648 +-7 2 26 62 110 185 339 707 1600 3677 8237 17681 36203 70778 132524 238524 414203 696364 1136996 1807976 2806796 +21 41 74 128 225 419 822 1652 3347 6834 14111 29421 61540 128212 264807 541289 1095253 2195231 4359504 8574398 16687855 +2 15 40 86 171 337 694 1505 3325 7215 15067 30103 57669 106576 191518 337637 589272 1026547 1796014 3165440 5618467 +-1 7 32 91 212 434 807 1392 2261 3497 5194 7457 10402 14156 18857 24654 31707 40187 50276 62167 76064 +-7 -9 -11 -13 -15 -17 -19 -21 -23 -25 -27 -29 -31 -33 -35 -37 -39 -41 -43 -45 -47 +-7 -2 21 77 187 385 730 1319 2310 3996 7028 12971 25491 52618 110756 231573 473991 946026 1846759 3550029 6773251 +7 22 52 122 277 593 1205 2363 4527 8512 15694 28288 49709 85027 141527 229385 362471 559290 844072 1248022 1810741 +28 48 73 113 195 366 693 1263 2186 3615 5835 9570 16874 33412 73758 172765 408404 945126 2112281 4540059 9386561 +14 26 56 111 198 318 456 567 558 266 -568 -2329 -5562 -11010 -19656 -32769 -51954 -79206 -116968 -168193 -236410 +19 24 41 90 207 455 935 1797 3261 5675 9672 16557 29179 53751 103409 204775 409375 812262 1580055 2988624 5464519 +18 39 73 138 262 494 926 1721 3138 5541 9375 15088 22974 32908 43940 53711 57650 47907 11973 -69066 -222698 +11 31 75 168 349 687 1309 2441 4478 8124 14683 26648 48844 90556 169343 317639 593813 1100149 2011267 3617896 6392695 +16 33 60 114 218 398 680 1087 1636 2335 3180 4152 5214 6308 7352 8237 8824 8941 8380 6894 4194 +15 37 66 103 152 229 379 703 1403 2859 5752 11247 21280 39117 70677 127789 235791 449937 888270 1793311 3641520 +8 21 50 97 165 269 451 808 1551 3125 6442 13318 27280 55081 109691 216589 427639 852218 1726439 3563420 7469472 +8 7 6 5 4 3 2 1 0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 +-3 13 50 127 271 509 857 1307 1813 2277 2536 2351 1399 -731 -4537 -10597 -19555 -32099 -48930 -70721 -98065 +11 18 35 78 186 436 974 2079 4280 8555 16678 31893 60367 114441 219768 430327 858545 1733144 3506081 7043900 13960648 +16 34 72 138 240 386 584 842 1168 1570 2056 2634 3312 4098 5000 6026 7184 8482 9928 11530 13296 +15 32 71 148 287 520 887 1436 2223 3312 4775 6692 9151 12248 16087 20780 26447 33216 41223 50612 61535 +12 23 44 82 143 230 342 490 758 1463 3528 9310 24375 61164 146260 334196 732632 1546519 3152860 6223234 11918799 +13 30 56 85 105 109 125 270 828 2354 5825 12905 26474 51701 98128 183486 340295 626718 1143654 2060677 3654167 +3 4 22 71 168 333 586 950 1476 2307 3785 6573 11718 20543 34272 53439 77525 106066 143892 215463 396800 +10 26 41 60 91 142 235 466 1149 3094 8103 19851 45487 98607 204872 412860 815663 1595212 3115198 6117022 12129550 +-2 -7 -12 -17 -22 -27 -32 -37 -42 -47 -52 -57 -62 -67 -72 -77 -82 -87 -92 -97 -102 +16 38 88 194 395 751 1366 2424 4238 7312 12416 20674 33665 53537 83134 126136 187212 272186 388216 543986 749911 +8 14 29 53 86 128 179 239 308 386 473 569 674 788 911 1043 1184 1334 1493 1661 1838 +16 24 23 7 -29 -78 -90 96 882 3147 8667 20857 46084 96003 191717 371116 701560 1301162 2373275 4260291 7524309 +26 36 47 67 119 248 525 1063 2080 4086 8356 18009 40298 91233 204603 449170 960818 2001572 4065841 8067635 15663085 +17 38 71 125 211 350 588 1012 1758 2999 4898 7508 10598 13381 14117 9561 -5777 -40596 -108031 -227185 -425011 +15 21 22 20 37 144 504 1438 3544 7937 16735 33997 67437 131420 252039 475549 882205 1608793 2885176 5093630 8865877 +-6 -13 -21 -23 2 107 402 1084 2473 5064 9632 17492 31153 55882 103253 198879 398732 822641 1721169 3605339 7490908 +14 19 30 56 119 271 624 1411 3104 6622 13686 27458 53810 104029 200655 389700 764942 1513473 2996082 5880704 11350429 +25 52 99 174 285 440 647 914 1249 1660 2155 2742 3429 4224 5135 6170 7337 8644 10099 11710 13485 +21 41 85 164 289 471 721 1050 1469 1989 2621 3376 4265 5299 6489 7846 9381 11105 13029 15164 17521 +3 12 32 64 109 168 242 332 439 564 708 872 1057 1264 1494 1748 2027 2332 2664 3024 3413 +12 33 76 155 294 525 885 1413 2152 3171 4636 6977 11227 19670 37078 73162 147713 302041 625619 1319581 2847905 +5 15 42 90 165 281 483 898 1823 3857 8082 16296 31299 57231 99959 167508 270529 422795 641714 948846 1370409 +-1 3 27 90 216 427 736 1158 1770 2864 5250 10779 23169 49230 100597 196093 364857 650385 1115645 1849440 2974206 +18 33 60 114 219 416 778 1444 2710 5262 10713 22720 49121 105780 223239 458023 911907 1765468 3338595 6203955 11406740 +-1 2 8 26 75 184 392 748 1311 2150 3344 4982 7163 9996 13600 18104 23647 30378 38456 48050 59339 +4 19 42 83 170 352 708 1368 2552 4633 8230 14337 24494 41006 67216 107838 169356 260495 392770 581119 844626 +2 19 45 71 78 36 -98 -389 -938 -1882 -3323 -5034 -5570 42 25723 106151 321224 845338 2045861 4681108 10302864 +5 11 30 86 226 530 1119 2163 3891 6605 10700 16692 25256 37276 53909 76665 107505 148959 204266 277538 373950 +0 -3 -13 -34 -70 -125 -203 -308 -444 -615 -825 -1078 -1378 -1729 -2135 -2600 -3128 -3723 -4389 -5130 -5950 +20 24 33 54 94 160 259 398 584 824 1125 1494 1938 2464 3079 3790 4604 5528 6569 7734 9030 +16 26 43 75 144 288 559 1031 1845 3341 6368 12935 27509 59587 128903 276226 585934 1232652 2575101 5338655 10957782 +22 30 42 75 165 388 896 1973 4116 8146 15354 27687 47979 80232 129952 204545 313778 470310 690298 994083 1406961 +10 34 67 109 160 220 289 367 454 550 655 769 892 1024 1165 1315 1474 1642 1819 2005 2200 +15 24 33 42 51 60 69 78 87 96 105 114 123 132 141 150 159 168 177 186 195 +19 28 43 83 189 439 972 2028 4011 7582 13789 24241 41333 68529 110710 174594 269235 406608 602287 876223 1253629 +12 23 48 83 114 122 112 191 731 2664 7967 20406 46619 97629 190889 352972 623030 1057157 1733802 2760389 4281312 +13 23 40 73 131 223 358 545 793 1111 1508 1993 2575 3263 4066 4993 6053 7255 8608 10121 11803 +6 2 -7 -10 18 130 430 1105 2473 5079 9937 19155 37433 75341 155924 327112 683712 1404512 2812329 5467788 10311340 +6 10 18 32 65 157 402 991 2286 4970 10371 21137 42561 85074 168873 332636 650494 1266441 2466526 4833359 9578005 +5 16 46 102 195 360 705 1507 3378 7531 16185 33159 64718 120749 216362 374030 626403 1019954 1619640 2514788 3826445 +9 16 36 85 202 477 1090 2363 4826 9302 17030 29867 50632 83678 135854 218335 350819 572280 968608 1740105 3355834 +14 26 66 151 310 609 1193 2356 4671 9252 18289 36105 71153 139662 272207 525665 1005548 1908978 3609160 6822591 12937848 +9 25 41 67 139 325 725 1464 2677 4485 6961 10085 13687 17377 20461 21842 19905 12385 -3783 -32633 -79357 +16 32 60 101 156 225 304 392 547 1075 3016 9242 26776 71523 177757 416952 934774 2022710 4254112 8736615 17568496 +8 26 60 114 201 353 639 1195 2274 4341 8269 15747 30137 58344 115073 232671 483499 1028910 2221710 4811093 10336634 +6 2 9 35 95 230 548 1302 3020 6709 14184 28649 55822 106221 199830 375428 708670 1345964 2565863 4886863 9251197 +19 35 68 141 295 596 1148 2127 3861 7007 12930 24483 47533 93788 185766 365121 706015 1335811 2466072 4437697 7785019 +4 13 32 78 186 413 842 1586 2792 4645 7372 11246 16590 23781 33254 45506 61100 80669 104920 134638 170690 +3 14 33 69 149 341 798 1832 4021 8351 16406 30658 55020 96113 166396 291921 531080 1018544 2065126 4378097 9533264 +-6 -4 -1 10 42 112 239 440 722 1068 1415 1622 1426 384 -2201 -7372 -16630 -32068 -56529 -93790 -148774 +13 31 77 178 378 756 1465 2798 5287 9841 17929 31814 54844 91806 149349 236482 365153 550915 813685 1178602 1676990 +17 33 49 68 113 239 545 1186 2385 4445 7761 12832 20273 30827 45377 64958 90769 124185 166769 220284 286705 +17 38 75 139 257 493 996 2097 4481 9473 19520 39065 76269 146567 280032 536239 1033166 2001257 3881138 7495460 14345266 +17 44 96 193 364 644 1067 1669 2534 3944 6730 12973 27302 59241 127463 267547 546112 1086457 2115139 4047872 7652617 +21 40 68 106 163 276 552 1241 2849 6300 13156 25904 48319 85912 146472 240711 383021 592352 893220 1316854 1902491 +17 42 74 114 168 256 444 910 2049 4626 10012 20610 40761 78859 152377 299507 605009 1255198 2650713 5631655 11919768 +-1 17 61 137 256 453 815 1518 2873 5381 9797 17203 29090 47449 74871 114656 170931 248777 354365 495101 679780 +24 48 88 156 278 513 989 1971 3989 8075 16192 31993 62150 118720 223562 417112 776709 1455719 2766715 5354699 10547689 +3 16 47 106 197 320 488 781 1482 3372 8302 20210 46810 102248 211097 414149 776557 1398984 2432529 4098322 6712811 +18 23 43 89 180 358 710 1412 2818 5624 11149 21795 41770 78157 142327 251401 428738 700877 1085371 1558569 1983224 +9 7 16 59 172 406 829 1528 2611 4209 6478 9601 13790 19288 26371 35350 46573 60427 77340 97783 122272 +14 22 25 18 -4 -46 -113 -210 -342 -514 -731 -998 -1320 -1702 -2149 -2666 -3258 -3930 -4687 -5534 -6476 +4 24 68 164 365 759 1479 2713 4714 7810 12414 19034 28283 40889 57705 79719 108064 144028 189064 244800 313049 +7 24 56 126 268 525 949 1603 2565 3934 5838 8444 11970 16699 22995 31321 42259 56532 75028 98826 129224 +0 10 33 83 184 370 692 1257 2337 4592 9448 19660 40080 78666 147871 266890 466170 797878 1361251 2362897 4254452 +22 33 60 114 218 422 825 1610 3099 5837 10717 19162 33385 56754 94296 153382 244644 383185 590154 894770 1336892 +14 37 67 105 166 286 541 1094 2304 4972 10883 23971 52757 115298 248896 528465 1100022 2239611 4453527 8643513 16371292 +11 25 39 53 67 81 95 109 123 137 151 165 179 193 207 221 235 249 263 277 291 +7 30 72 154 311 602 1128 2058 3665 6382 10923 18617 32352 59066 115819 243629 537400 1208231 2709643 5988237 12973534 +17 21 25 29 33 37 41 45 49 53 57 61 65 69 73 77 81 85 89 93 97 +11 32 64 122 248 527 1110 2247 4333 7970 14048 23848 39170 62489 97142 147549 219471 320308 459440 648614 902380 \ No newline at end of file