Compare commits

..
30 Commits
Author SHA1 Message Date
Maya Herrscher ef764ef2be Day 25 2024-12-25 06:28:06 +01:00
Maya Herrscher 2b2261905f Day 21 part 2 and challenge texts 2024-12-24 23:19:12 +01:00
Maya Herrscher 0b6a222015 Solution for day 24, trial and error 2024-12-24 17:09:01 +01:00
Maya Herrscher 5757e5fb19 Inefficient but correct solution for day 22/2 2024-12-23 19:22:56 +01:00
Maya Herrscher 9a0e5314e3 Day 23 2024-12-23 09:57:03 +01:00
Maya Herrscher fcf7546442 Day 22 Part 1 2024-12-23 09:23:59 +01:00
Maya Herrscher e478cf9030 Day 21 Part 1 2024-12-22 09:30:07 +01:00
Maya Herrscher 4bd6014a6e Day 20, not the prettiest or fastest, but works 2024-12-20 13:57:19 +01:00
Maya Herrscher 3aa0c74003 Day 19 and gitignore 2024-12-19 06:30:40 +01:00
Maya Herrscher 3298e5cc8a Day 16 Part 2 works now! 2024-12-18 09:50:26 +01:00
Maya Herrscher e88cfd643a Solution for day 18 2024-12-18 08:54:18 +01:00
Maya Herrscher 638d856417 Solution for Day 17, part 2 input specific 2024-12-17 12:57:54 +01:00
Maya Herrscher 6069495db4 Part 1 for day 16 2024-12-17 08:38:18 +01:00
Maya Herrscher 9d6ae2527b Day 15 (Part 2 with lots of help) 2024-12-16 10:11:24 +01:00
Maya Herrscher b64d593a51 Day 14. Part 2 was unsatisfying 2024-12-14 08:47:41 +01:00
Maya Herrscher 73c816e5a7 Day 13 2024-12-13 08:22:16 +01:00
Maya Herrscher 201077b551 Kind of ugly solution for Day 12 2024-12-12 15:41:59 +01:00
Maya Herrscher 4ae9fde7e9 Surprisingly efficient solution for Day 11 2024-12-11 09:45:57 +01:00
Maya Herrscher dc4447ccfb Day 10 2024-12-10 08:23:37 +01:00
Maya Herrscher 369e4c1e63 Kind of inefficient solution for day 9 (pt 2) 2024-12-09 09:13:32 +01:00
Maya Herrscher 90756ec10c Day 8 2024-12-09 07:12:16 +01:00
Maya Herrscher cac6ced738 Day 7 2024-12-07 10:51:01 +01:00
Maya Herrscher 6d87bf0038 Day 6 2024-12-06 09:25:19 +01:00
Maya Herrscher 731ce4b177 Day 5 2024-12-06 07:40:19 +01:00
Maya Herrscher e48758bd3a Day 4 2024-12-04 08:46:39 +01:00
Maya Herrscher b3306371b3 Solution for day 3 2024-12-03 06:41:48 +01:00
Maya Herrscher 4790d7bc53 Add 2024 AoC, solution for day 1 and 2 2024-12-02 09:31:20 +01:00
Maya Herrscher 4a5a3ba757 Day 16 (not super efficient) 2023-12-16 10:50:00 +01:00
Maya Herrscher 312113ce81 Bene do stuff 2023-12-15 23:06:55 +01:00
Maya Herrscher 5f260fcfe2 Day 15 2023-12-15 09:10:47 +01:00
150 changed files with 2087134 additions and 35 deletions

No files matched your search

+1
View File
@@ -1 +1,2 @@
AoC2021/Bene/ AoC2021/Bene/
__pycache__
+20 -35
View File
@@ -1,17 +1,14 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import sys import sys
import regex as re
from itertools import combinations
from more_itertools import locate
def memo(f): def memo(f):
memo = {} memo = {}
def f2(x,y): def f2(x,y):
if (x,y) not in memo: memo[(x,y)] = f(x,y) if (x,tuple(y)) not in memo: memo[(x,tuple(y))] = f(x,tuple(y))
return memo[(x,y)] return memo[(x,tuple(y))]
return f2 return f2
@@ -19,37 +16,26 @@ def fulfills(spring, cond):
return [len(b) for b in spring.split('.') if len(b) > 0] == cond return [len(b) for b in spring.split('.') if len(b) > 0] == cond
def solve_row1(spring, cond): def dot(spring, cond):
if len(spring) == (sum(cond) + len(cond) - 1): return 1 if len(spring) == 0 or spring[0] != '#': return solve_r(spring[1:], cond)
if fulfills(spring, cond): return 1 else: return 0
sols = 0
not_dam = spring.count('?') + spring.count('#') - sum(cond)
if not_dam < 1: return 0 def hashtag(spring, cond):
inds = list(locate(spring, lambda x: x == '?')) c = cond[0]
for c in combinations(inds, not_dam): if len(spring) < c: return 0
rs = list(spring) for x in range(c):
for i in c: if spring[x] == '.': return 0
rs[i] = '.' return dot(spring[c:], cond[1:])
if fulfills(''.join(rs),cond): sols += 1
return sols
@memo @memo
def solve_r(spring, cond): def solve_r(spring, cond):
if cond == '': return 1 cond = [int(c) for c in cond]
cond = [int(c) for c in cond.split(',')] if cond == []: return 1 if spring.count('#') == 0 else 0
spring = spring.strip('.') if not '?' in spring: return 1 if fulfills(spring, cond) else 0
inds = list(locate(spring, lambda x: x == '.')) if spring == '': return 0
if inds == []: return dot(spring, cond) + hashtag(spring, cond)
if len(spring) > 10: print(spring, cond)
return solve_row1(spring, cond)
i = inds[0]
sols = 0
for j in range(0, len(cond)):
if sum(cond[:j]) <= len(list(locate(spring[:i], lambda x: x != '.'))) and sum(cond[j:]) <= len(list(locate(spring[i:], lambda x: x != '.'))):
cond1, cond2 = ','.join([str(c) for c in cond[:j]]), ','.join([str(c) for c in cond[j:]])
sols += solve_r(spring[:i], cond1) * solve_r(spring[i+1:], cond2)
return sols
if __name__ == '__main__': if __name__ == '__main__':
@@ -57,9 +43,8 @@ if __name__ == '__main__':
res1 = 0 res1 = 0
res2 = 0 res2 = 0
for s in springs: for s in springs:
res1 += solve_r(*s) res1 += solve_r(s[0], [int(c) for c in s[1].split(',')])
res2 += solve_r('?'.join([s[0]]*5),','.join((s[1].split(','))*5)) res2 += solve_r('?'.join([s[0]]*5),[int(c) for c in s[1].split(',')*5])
print(solve_r('?'.join([s[0]]*5),','.join((s[1].split(','))*5)))
# challenge 1 # challenge 1
res1 = str(res1) res1 = str(res1)
+165
View File
@@ -0,0 +1,165 @@
--- Day 15: Lens Library ---
The newly-focused parabolic reflector dish is sending all of the collected light to a point on the side of yet another mountain - the largest mountain on Lava Island. As you approach the mountain, you find that the light is being collected by the wall of a large facility embedded in the mountainside.
You find a door under a large sign that says "Lava Production Facility" and next to a smaller sign that says "Danger - Personal Protective Equipment required beyond this point".
As you step inside, you are immediately greeted by a somewhat panicked reindeer wearing goggles and a loose-fitting hard hat. The reindeer leads you to a shelf of goggles and hard hats (you quickly find some that fit) and then further into the facility. At one point, you pass a button with a faint snout mark and the label "PUSH FOR HELP". No wonder you were loaded into that trebuchet so quickly!
You pass through a final set of doors surrounded with even more warning signs and into what must be the room that collects all of the light from outside. As you admire the large assortment of lenses available to further focus the light, the reindeer brings you a book titled "Initialization Manual".
"Hello!", the book cheerfully begins, apparently unaware of the concerned reindeer reading over your shoulder. "This procedure will let you bring the Lava Production Facility online - all without burning or melting anything unintended!"
"Before you begin, please be prepared to use the Holiday ASCII String Helper algorithm (appendix 1A)." You turn to appendix 1A. The reindeer leans closer with interest.
The HASH algorithm is a way to turn any string of characters into a single number in the range 0 to 255. To run the HASH algorithm on a string, start with a current value of 0. Then, for each character in the string starting from the beginning:
Determine the ASCII code for the current character of the string.
Increase the current value by the ASCII code you just determined.
Set the current value to itself multiplied by 17.
Set the current value to the remainder of dividing itself by 256.
After following these steps for each character in the string in order, the current value is the output of the HASH algorithm.
So, to find the result of running the HASH algorithm on the string HASH:
The current value starts at 0.
The first character is H; its ASCII code is 72.
The current value increases to 72.
The current value is multiplied by 17 to become 1224.
The current value becomes 200 (the remainder of 1224 divided by 256).
The next character is A; its ASCII code is 65.
The current value increases to 265.
The current value is multiplied by 17 to become 4505.
The current value becomes 153 (the remainder of 4505 divided by 256).
The next character is S; its ASCII code is 83.
The current value increases to 236.
The current value is multiplied by 17 to become 4012.
The current value becomes 172 (the remainder of 4012 divided by 256).
The next character is H; its ASCII code is 72.
The current value increases to 244.
The current value is multiplied by 17 to become 4148.
The current value becomes 52 (the remainder of 4148 divided by 256).
So, the result of running the HASH algorithm on the string HASH is 52.
The initialization sequence (your puzzle input) is a comma-separated list of steps to start the Lava Production Facility. Ignore newline characters when parsing the initialization sequence. To verify that your HASH algorithm is working, the book offers the sum of the result of running the HASH algorithm on each step in the initialization sequence.
For example:
rn=1,cm-,qp=3,cm=2,qp-,pc=4,ot=9,ab=5,pc-,pc=6,ot=7
This initialization sequence specifies 11 individual steps; the result of running the HASH algorithm on each of the steps is as follows:
rn=1 becomes 30.
cm- becomes 253.
qp=3 becomes 97.
cm=2 becomes 47.
qp- becomes 14.
pc=4 becomes 180.
ot=9 becomes 9.
ab=5 becomes 197.
pc- becomes 48.
pc=6 becomes 214.
ot=7 becomes 231.
In this example, the sum of these results is 1320. Unfortunately, the reindeer has stolen the page containing the expected verification number and is currently running around the facility with it excitedly.
Run the HASH algorithm on each step in the initialization sequence. What is the sum of the results? (The initialization sequence is one long line; be careful when copy-pasting it.)
Your puzzle answer was 511257.
--- Part Two ---
You convince the reindeer to bring you the page; the page confirms that your HASH algorithm is working.
The book goes on to describe a series of 256 boxes numbered 0 through 255. The boxes are arranged in a line starting from the point where light enters the facility. The boxes have holes that allow light to pass from one box to the next all the way down the line.
+-----+ +-----+ +-----+
Light | Box | | Box | ... | Box |
----------------------------------------->
| 0 | | 1 | ... | 255 |
+-----+ +-----+ +-----+
Inside each box, there are several lens slots that will keep a lens correctly positioned to focus light passing through the box. The side of each box has a panel that opens to allow you to insert or remove lenses as necessary.
Along the wall running parallel to the boxes is a large library containing lenses organized by focal length ranging from 1 through 9. The reindeer also brings you a small handheld label printer.
The book goes on to explain how to perform each step in the initialization sequence, a process it calls the Holiday ASCII String Helper Manual Arrangement Procedure, or HASHMAP for short.
Each step begins with a sequence of letters that indicate the label of the lens on which the step operates. The result of running the HASH algorithm on the label indicates the correct box for that step.
The label will be immediately followed by a character that indicates the operation to perform: either an equals sign (=) or a dash (-).
If the operation character is a dash (-), go to the relevant box and remove the lens with the given label if it is present in the box. Then, move any remaining lenses as far forward in the box as they can go without changing their order, filling any space made by removing the indicated lens. (If no lens in that box has the given label, nothing happens.)
If the operation character is an equals sign (=), it will be followed by a number indicating the focal length of the lens that needs to go into the relevant box; be sure to use the label maker to mark the lens with the label given in the beginning of the step so you can find it later. There are two possible situations:
If there is already a lens in the box with the same label, replace the old lens with the new lens: remove the old lens and put the new lens in its place, not moving any other lenses in the box.
If there is not already a lens in the box with the same label, add the lens to the box immediately behind any lenses already in the box. Don't move any of the other lenses when you do this. If there aren't any lenses in the box, the new lens goes all the way to the front of the box.
Here is the contents of every box after each step in the example initialization sequence above:
After "rn=1":
Box 0: [rn 1]
After "cm-":
Box 0: [rn 1]
After "qp=3":
Box 0: [rn 1]
Box 1: [qp 3]
After "cm=2":
Box 0: [rn 1] [cm 2]
Box 1: [qp 3]
After "qp-":
Box 0: [rn 1] [cm 2]
After "pc=4":
Box 0: [rn 1] [cm 2]
Box 3: [pc 4]
After "ot=9":
Box 0: [rn 1] [cm 2]
Box 3: [pc 4] [ot 9]
After "ab=5":
Box 0: [rn 1] [cm 2]
Box 3: [pc 4] [ot 9] [ab 5]
After "pc-":
Box 0: [rn 1] [cm 2]
Box 3: [ot 9] [ab 5]
After "pc=6":
Box 0: [rn 1] [cm 2]
Box 3: [ot 9] [ab 5] [pc 6]
After "ot=7":
Box 0: [rn 1] [cm 2]
Box 3: [ot 7] [ab 5] [pc 6]
All 256 boxes are always present; only the boxes that contain any lenses are shown here. Within each box, lenses are listed from front to back; each lens is shown as its label and focal length in square brackets.
To confirm that all of the lenses are installed correctly, add up the focusing power of all of the lenses. The focusing power of a single lens is the result of multiplying together:
One plus the box number of the lens in question.
The slot number of the lens within the box: 1 for the first lens, 2 for the second lens, and so on.
The focal length of the lens.
At the end of the above example, the focusing power of each lens is as follows:
rn: 1 (box 0) * 1 (first slot) * 1 (focal length) = 1
cm: 1 (box 0) * 2 (second slot) * 2 (focal length) = 4
ot: 4 (box 3) * 1 (first slot) * 7 (focal length) = 28
ab: 4 (box 3) * 2 (second slot) * 5 (focal length) = 40
pc: 4 (box 3) * 3 (third slot) * 6 (focal length) = 72
So, the above example ends up with a total focusing power of 145.
With the help of an over-enthusiastic reindeer in a hard hat, follow the initialization sequence. What is the focusing power of the resulting lens configuration?
Your puzzle answer was 239484.
Both parts of this puzzle are complete! They provide two gold stars: **
+47
View File
@@ -0,0 +1,47 @@
#!/usr/bin/env python3
import sys, re
def HASH(string):
res = 0
for a in string:
res += ord(a)
res = res * 17 % 256
return res
if __name__ == '__main__':
instr = open(sys.argv[1]).read().strip('\n').split(',')
# challenge 1
res1 = sum([HASH(a) for a in instr])
boxes = {}
for i in instr:
label, op, focus = re.findall(r'(\w+)(\-|\=)(\d*)', i)[0]
box = HASH(label)
if not box in boxes.keys(): boxes[box] = []
present = boxes[box]
if op == '=':
for i, lens in enumerate(present):
if lens[0] == label: present[i] = (label, int(focus))
if not (label, int(focus)) in present: present.append((label, int(focus)))
elif op == '-':
for i, lens in enumerate(present):
if lens[0] == label:
present.remove(lens)
break
res2 = 0
for b, lenses in boxes.items():
for i,l in enumerate(lenses):
res2 += (b+1) * (i+1) * l[1]
res1 = str(res1)
print(f"challenge 1:\n{res1}\n")
# challenge 2
res2 = str(res2)
print(f"challenge 2:\n{res2}\n")
+1
View File
@@ -0,0 +1 @@
rn=1,cm-,qp=3,cm=2,qp-,pc=4,ot=9,ab=5,pc-,pc=6,ot=7
+1
View File
@@ -0,0 +1 @@
fzl-,tcjp=8,vkjr=9,xs-,jktcpk=3,gzp-,kfsxsd-,zxkv=7,fxz-,pj=7,mhbdch=7,xlss-,smk-,ppz-,kqggd-,dqh=7,gmv=6,tjjfm=2,gbv=5,gn-,ld=7,jdr-,phq=3,rd-,qz=3,sh-,gzsb=2,glrt=7,vjkrjg-,gjqmpc=7,qnx=7,mf=1,tnrm-,lppg-,gnvx=1,rv-,vnt-,bst-,gkb-,tl=1,bggff-,lm=8,mqq=7,hr-,gkb-,fspkn=2,tjjfm-,shshb=3,qfczq-,zk-,zcsc-,lnrjh=2,fz-,bkb-,rg-,bcfzn=6,xsbb=5,sm=3,rqs-,rvlv=9,pvh=9,rl-,zrb=9,lftk=1,cdn-,zp=8,hc-,mf-,hp-,zk-,dbj=5,tm=9,zx-,gmp=4,gcq-,mxq-,lvh-,lkhb-,vn=9,gzsb=6,xlss=9,drkhc=8,rgqg=1,hkr-,fxz=7,xsm-,fvmf=4,hsm=7,dlrss=9,rv-,kj-,ndtc-,zjf-,zj=9,kv=5,sxvv-,hj-,mltm-,qggz-,mntr-,td=5,lppg=1,xqb-,brt-,nm-,vlp=7,zcjnv=6,chh-,dd=2,fh-,hxfkx=6,hj=6,rzk=7,skpq-,rxb=1,fn=1,nc=1,vqq-,ndq-,xtgd=6,qlgv-,dl-,xln-,rqs=5,vpmmf=1,llvv-,hzp=6,dnbql=3,rqz=5,nfhb=7,vdb-,gmp-,hskv-,xs-,vk-,xll-,ng=2,xb-,mjjph-,tss-,lsd-,qsj-,tbdb-,tdnm=6,bv-,qz=5,zp=8,jn-,fh-,dqh=1,rgrd=5,kqggd-,ddccc-,gdx=3,br-,cnb=4,tfx-,scp=5,rgch-,xltvn=4,xdblmh-,jdr-,fz-,crd-,hfr-,xlss=2,fxz=5,rzl-,vdb-,tss=6,kc=2,bdmrg=6,mkv-,hdr=9,pv-,qcr=4,ntxqq-,mhbdch=8,npghs-,jb-,lzcp=1,zbl-,vsjs-,dmv=1,zhc-,tfx-,jc=8,vlhhb-,zcbg=2,fcbzpl=8,gkb-,zppn-,jj=6,xlc=6,xltvn-,cnb-,lftk-,ptmc-,fxz=6,ncn-,gzp-,lgtd=4,znp-,ncn=8,fg-,lnrjh=6,lkhb-,tnrm=4,hkr-,ltc-,lv-,ck-,dn=5,srt-,hk-,fspkn=9,drnvhj=5,gvf-,gzp-,pq-,lbq=8,lm-,lsx-,jf-,vkjr-,lcvzfp-,vqqp-,glrt=7,zx=4,hskv=9,bqm=6,jm=6,tshhq=7,sg-,pq-,rgqg=4,bcpb-,df=4,qpqx=6,fn=7,drnvhj=5,vf=8,zsx-,jbd-,kczn=9,fspkn=1,cjd=5,hzp=1,zpkc-,kczn=7,mrd=9,ndq-,hp=4,nfmf-,npghs-,zvd=9,dt=2,jdf=2,xzq-,xb=7,cpbb-,nd-,sgq=2,fc=1,tdnm-,fvmf-,ncn=4,zrdk=1,bvb-,gmp=2,pvh=2,klzj=7,lqlh-,tgm-,vf-,xll=3,lcvzfp=4,jrp=1,jq-,cjd-,nxqhqd=9,lx=4,ltc-,kc=9,gddghs=4,lj=9,bggff=8,pxk-,glgpxh-,mrd=6,mhkbd=1,lbq-,rgch-,vf-,ks=8,dt=5,tb=2,cdn=3,vlxv=6,rgrd-,mcfh=9,bkg-,fd-,bdz=4,vk=7,phd=4,bkg-,krz=6,flk=1,jf=8,zxkv=2,hdhk-,nxqhqd-,dvgz=7,dbj-,rvc-,fshfd=7,tb=4,mjx-,vnsgg=1,zppn=6,zx-,kk=2,xs-,xprp=7,hh=9,xnp=8,vndj=9,qnzlf=3,bdmrg-,dxl=5,ss=4,clv-,hk=3,kgx-,qqvmc=9,xzq-,kfsxsd-,bdt-,vqq-,lqlh-,jvp=7,tshhq=5,pvh=4,cp=4,bpd-,bqql-,dvx=8,qtql=7,zxkv=3,qfv-,xlss-,lzs-,kt=3,ltsb-,pfs=2,dmv-,qcr-,sl-,qsjch-,hmd-,bcpb-,drnvhj=4,bf=3,qx=1,gddghs-,zcjnv-,bdmrg-,rd-,ddccc=2,hvk=6,kk=1,chh=5,mxq=9,kcq-,vkjr-,ntxqq-,glgpxh=6,dvzlc-,lnt=2,rkk-,mzpgh=7,pl-,vndj-,nc-,xx=5,klzj=2,xhs-,cx-,jz=7,rmh=7,gjqmpc-,zdr=4,csqh-,zppn-,zc-,bvb=4,tjjfm-,rdzzjm=8,dbj-,sr=4,npghs=1,pxs-,blxq-,rqz=1,grxx-,sg-,fqmdgn-,jf-,pqjf-,xzljl=9,zdr-,hh-,cnb=5,jrq=1,dvx=2,pzbsd-,xpm=5,znp-,gqsr=2,qtql-,kssg=4,qm=3,scd=1,lzcp=4,gdx=9,shshb=2,sxmq=2,mtqb-,xn-,xln=4,vv-,nj-,tjjfm=7,rp=5,kcq=3,bcfzn-,dbj=9,zcbg-,bfx-,gvf=2,ptmc=7,jb=7,kv-,znl=5,gsk-,zjf=8,kmx-,rbft=1,csqh-,zp-,rq=1,rrx=9,mh=2,gnvx=9,mqq=9,bqql=6,gj=2,mhv=3,dcc-,kgx-,vhrd=6,ztj=2,ng-,rl-,bqm=1,rgqg=6,blmgvg=5,jx-,vqqp=8,jb-,lnk=2,rvlv=9,tz-,hj-,ltc=7,gcjgs=7,tm=2,mn=4,ss=7,vlhhb=4,hkd-,xf-,ltsb-,rzl=7,zx=5,phq=8,srt-,jvp=5,sgq-,qnzlf=9,lsd-,fbrz-,dsnd=3,hj-,tcjp-,vnsgg=9,xn-,mzpgh-,sxvv-,gjqmpc-,ncn-,mqq=2,tmpd-,rkk=6,qrlrxg-,csnq-,ltsb=6,pq-,mjx=6,bkc-,bvb-,kgpnf=2,xv=7,cjd=6,hp=3,vf-,pg-,jnq=2,tnng=7,qq-,dxl=5,nfpqv-,rg=9,dmv-,gd-,rgch-,nfpqv=9,gjqmpc=6,sgq-,cjd-,qnn-,ztj-,gn-,jqhg-,pzbsd-,qjn-,gggk=6,mntr=8,sxvv=3,jtx-,krz-,lzs-,pvh-,rrx=1,kgpnf-,bkg-,krz=4,vpmmf=8,rm=5,jr-,lx-,hbsv=1,pq=4,txs=9,mltm=3,sr=1,hr=8,dqh-,rm-,vdb=8,hdhk-,fzx-,xpm=1,hkr=1,qx=3,xn=1,zjf-,bpd=7,vxb=4,mcfh-,dcc=7,sgq-,vpmmf-,zcsc-,gggk=2,hr-,sgq-,tmpd-,rbft-,xm-,pqjf=6,vnt-,hmd-,vg-,sv-,bqm-,dsnd=2,hbq-,zc-,fxjc-,vsjs-,xv-,jqhg=2,bqm=6,qtz-,rxb-,mjx=3,br=8,hp-,bf=8,hbq-,lnrjh=3,xb=9,cdf=4,pm-,xlc-,tm=8,jrq=1,hq-,kqggd-,dhh-,tf-,nxqhqd-,qpqx=9,vpmmf=8,kgx-,glgpxh=2,rzl=1,qtz-,rl=5,sb=5,lfz-,bcpb-,xsdlmd=8,fshfd-,vlkx-,ss=3,xs=2,mn=5,dl-,lzcp=8,bqql=3,nd=4,lsx-,znl-,ltc=1,qggz-,zrb-,tbdb=4,drkhc=7,dkvqm-,tz-,hvk-,ld=5,mjx-,bl=5,qx=2,zppn=7,rgrd=1,bpd=7,bdmrg-,rl-,rqz=7,kc=1,gzp-,kcx=6,kmx-,rxptm=4,rrn=4,mhv=4,zjf-,blmgvg-,csnq-,ttgzdn-,ptmc=6,jq-,rxptm=8,mtqb=5,bpt=7,pxs-,cx=7,cz-,mn-,qfv=5,kgv=2,xv-,blmgvg-,cp=4,hq-,vlp-,xnp-,hh-,lbrn-,crd=3,jc=2,sr=9,vkxm-,mtqb-,sf=3,sv-,hfdzfc-,gbv=3,xsdlmd=9,nst=2,kf-,vn=4,nfhb=8,gkb-,rvlv-,drqq=5,kx=9,hp=8,dh=3,hbq-,pfxqhx=9,zx=9,jc-,zjttq-,vc-,lnk=6,tnrm=8,nxz=1,lcvzfp-,dnbql=6,xs-,tshhq-,kgv-,dvgz-,zhg=8,ksm-,kt=4,jqhg=8,xpllk-,fspkn=6,fc=3,rbft-,scp=5,hk-,hbsv-,drqq=8,kv=6,zlt=6,sxmq=8,qz=9,brt-,smr-,zsx=2,jvp-,vxcfp-,sf-,zhg=1,rmh=8,ztj=9,tb-,jdf-,xb=6,fvmf=5,vqq-,lm-,rlx-,zjttq-,lzcp-,fd-,vkjr=7,hj-,qnn=1,rv-,tb=9,sfrd=7,dhh-,smk=3,xb-,glms=3,jgmsl-,xzq-,mmx=8,zcbg-,pxs=8,cz-,ksm-,skpq-,rrn-,td-,hfr=4,pq-,vt-,krz-,crd-,dnbql=2,mmx=3,rq-,tgm-,fbrz=7,xm-,rv=1,sv-,nfmf-,pptj=7,kgpnf-,cnd=1,vdb-,sb-,pzbsd-,pqc=3,mf=3,rm=7,cjd-,tnng-,mcfh-,fvmf=5,qsjch=5,dt-,hmd=2,hkd-,hvhd=7,nm=3,mpd-,gsk=1,cbnq=2,sl=8,zhc=8,xnp=7,jrq=8,xzljl=1,ht-,tcjp=4,jgmsl=6,vn-,fqmdgn-,xln=4,tfx-,kfjgqb-,pv=3,dz=5,dj-,bpd=9,rqz=1,cc-,nxqhqd-,kkz=4,drqq=8,rzk=9,skk-,tz=4,nfpqv=4,kfsxsd-,pxk-,hk-,nxqhqd=7,rdzzjm=3,dz-,xx=5,sb=6,phd-,cnk-,zqvb-,rzl-,hxfkx=9,llb=3,sr-,gsk=7,bfx-,dmv-,qm-,lf-,jrq=3,hp=2,scp=7,mcfh=7,lnrjh=8,fvmf=2,hvk-,sv-,drnvhj-,jbd=2,hdLine truncated
View File
Whitespace-only changes.
+62
View File
@@ -0,0 +1,62 @@
#!/usr/bin/env python3
import sys
ENERGY = []
# direction given as tuple, e.g., (1,0) for right
def move_beam(x,y,d,grid):
while True:
if (x > len(grid[0])-1) or (x < 0) or (y > len(grid)-1) or (y < 0): break
if d in ENERGY[x+y*len(grid[0])]: break
ENERGY[x+y*len(grid[0])].append(d)
tile = grid[y][x]
if tile == '.':
x, y = x+d[0], y+d[1]
elif (tile == '-' and d[1] == 0) or (tile == '|' and d[0] == 0):
x,y = x+d[0], y+d[1]
elif tile == '\\':
d = (d[1],d[0])
x,y = x+d[0], y+d[1]
elif tile == '/':
d = (-d[1],-d[0])
x,y = x+d[0], y+d[1]
elif tile == '-':
move_beam(x-1, y, (-1,0), grid)
move_beam(x+1, y, (1,0), grid)
elif tile == '|':
move_beam(x, y-1, (0,-1), grid)
move_beam(x, y+1, (0,1), grid)
def energize(x,y,d,grid):
global ENERGY
ENERGY = []
for i in range(len(grid) * len(grid[0])):
ENERGY.append([])
move_beam(x,y,d,grid)
return len(ENERGY) - ENERGY.count([])
if __name__ == '__main__':
grid = [list(line.strip('\n')) for line in open(sys.argv[1])]
res2 = 0
for i in range(len(grid)):
res2 = max(energize(0,i,(1,0),grid),res2)
for i in range(len(grid[0])):
res2 = max(energize(i,0,(0,1),grid),res2)
for i in range(len(grid)):
res2 = max(energize(len(grid)-1,i,(-1,0),grid),res2)
for i in range(len(grid[0])):
res2 = max(energize(i,len(grid[0])-1,(0,-1),grid),res2)
# challenge 1
res1 = str(energize(0,0,(1,0),grid))
print(f"challenge 1:\n{res1}\n")
# challenge 2
res2 = str(res2)
print(f"challenge 2:\n{res2}\n")
+10
View File
@@ -0,0 +1,10 @@
.|...\....
|.-.\.....
.....|-...
........|.
..........
.........\
..../.\\..
.-.-/..|..
.|....-|.\
..//.|....
+110
View File
@@ -0,0 +1,110 @@
\.................-....-.-.|....................|......./.|.\................|...........|....--..............
............-...................|.............|..-.......-/..............-....\...............................
|.......//...........................................|...............-......../.....\....................\....
....|......-.-.............-......\.....\......../..................../.......................................
..\..\../................../.............-............|....-.........................|......|...............|.
-..|........................./.................\.........\./.............\..|..-...-.............\............
.\......||-..................../................-................./....|........................|.............
..............\./...........-.........../-................-.........\...\........../-.......|.................
....-..........-.-.....\......................../.......-..........-/.....................||................|.
./..........|/............................\./............................./....../........\...-|............\-
........\.............................-...../............---...........|...............|......\\..............
........//....|.\......./...\.............|..............\............./...........-.|..-.............|.......
...................\...........-/..-......\...|........-.|................\-.......|........\.................
|.|....../|............\./..-........\..............................-.....................|....../............
............-....................-..............-..-................|.//.............-.............-..........
..........-.......-......|-................./........../...\........-.......................-..\.......\......
................../....|............-....../................./.....................|.................-........
...\..............--..|.....||.....\.............\../................................................-.-...../
.........-......|....-.................-.......\-................./..|...................|\.....\.....|.|-....
......................-......................-............/....................\...../...\..../...............
...../......-...............\...-....|......../.........\................................|.........../........
........../.......\..............-...............\........-|....-......-.............|...........|........./..
./...............\....../....../..../...................................................|.....|.|../......./..
....|\........\-...../...................-.............\.\..................................././..........\...
....................................-..../......................-..///......-...|.|..........................|
.........-\.....-...........|........./..........-..\.....\./...................-........................-....
....../.......././......--.....|.\..-...-....\..........................-....-...-..|.|.....|.......\-./......
...-....................-................|.............-../........|../........-.............|\...............
...../...........-......../................|................|.....\.....-.............../...|....../\.........
./...\.....\..-./.........................|................................-....................-.............
.............\|.../....\\.....\..|...........\.....................|......|.|.....|.....-............\.\......
........................|......-..........-.../......-........|...../.\|...-................................|.
.......\...-...\..........|.....\...................\.........|..........-/.........\...................../...
.-|.......|............./..|./....-.../...\............-......../..............-.......//...-...........||.\..
..|..\./..-........\..|....-..\.........../..............................|..\..................../..|...../-..
.|.........-.\...........................\..../......./....||............\..........|............-.\|.........
....................\..../|............................\.../..|........./...../............||........\....../.
....................../.....|...................|......|.................|..|.......|................|........
.....................\.........-..../.........../../..-......\.................|.../....................../...
........\.-................/........\...../....../.|.\...|/../..........................................-.....
....................................|......./...../............-................-/..|.-....................\..
..|.........................-....................../...|.....|.............../.........../.....|\.............
.......................................|.\.|.......................-.......|..............\............-./....
..........//................\..|./................-.................-..../../|................................
.|......................................./............/..-.......-.|.........................\|..|............
............................/.-..................-./..../..............|-.........-|..........................
.................-...|................\.........|\...............................\...........\...//...........
........\..|.|--.............|.......\.................|......|\./.........................\.|................
.-|.............|\|.....\|././...|..\.............\..\...................\...........\...../..................
..../..............-..|...|.........-.........\.....-...........-.....|...\.-....-../.................\.......
........\.|........\\.........-...............-.......-..................................../..........|.......
...............-...................\/...............\..-\...........|.-........-.\-.....\....\..../......-....
.../-......./..............|.......|..//......-....................../.|....\......|..\.........../-\.........
.-....|./....-.../....../.....-..............\..-..\..-............\................|...|..........-.......|..
|......../...................\..../....\......./..|.................\...............\.........\../.|......../.
../............/........|..|.......................................\../\...............\............/.......\.
........-.-...\........../.......-....-............./.............-......./................\..........-.......
.../-................/......|/........-......|..........|..-..............|/..........................-.......
......./............../...................|../...../................./../..........\../.....\....\............
..............-..|../-........................|...\.../...-/..........\.......\......\.................-....-.
......................................-/.\........................../......-..\..\........\...............|..\
.............-.........../-|........-........\....-.....\....../..\........................\......|.......\...
.././....................|\.../\.........\.|.............../..../...|......./.\...|.......\.........|.........
......................./........./-./...........................|/...\........-.../.................||........
..............|./........\..............\.............................|/................../............|.-..|.
.........................-......../........./.....|....-..-.-..............-.-......../.......\...\./.........
.-............../../....\//......../...|......|......\..................-......\.....-....\|.........|........
..............-.....................\.................\.|...-............................|......\.............
\\.....|...........\............|............................../............................................\.
.-........../|...\..............-...............................\...........\.....|......\..........\.........
.\............\.|....-........./....../../.....-..\........|...............-..................|............-.|
.....\......-.........-.........|....../..-....|.....\..../....|........-.....................................
..........\-..-..../\.....................\.........-...........|..../-.......................\....-..........
...../............./..|..................../............../../.........|...............-../...................
.....|...../.....|......-.............................|...........-......................./............/......
.....................||./.-.................-.........\.\..................-..............\...--.........\....
.|......-......-.\.......-......\....\..\..|.........../......./.....................-..........|.............
.....\.....\............................--..................|..-........\....\...\.|.\.-...........\...\......
./...........\.......\/......|........./..|................\-................/....\...................\.\.....
..|...............................-.........-.|/......|.....|........\........................................
.......|............-............../............-......../..-...\|-...-..../...........-..........-..-/.......
............................-..\.......................................-.........................\..........-.
........................\.........|................||...-....\......\.....\.................\...\\....../.....
....\../.....-.......-.................-|...................-../.|-............|........-|......./../...\.....
..................................................\.......|......./..\./......../....|....-|.-................
....../.........|.......|...|.......\.../|...............-.......-\..\......././..................|..\.|...../
............|.....\...........-.............................../.....-.................-.../............/.../..
...../.......\............................|.....\....\................/..................\......../...........
..................-....\.........\|................/|......../.-................|...\......................--.
......-..-.....................................-\.........|.../.....................|..|.-.....\...|....\....-
......-......-.................-......|..................................................|....................
..\...............|......../........-......./.............../...........-..........|/.....///\.....-..........
.........../..|.............../..........\|.........................\...|.....\||....\...|.|/.....-....../....
...../...../.....-............................................|........|............|.........................
......-../\................../..............\............\.................../|...........|.............\.....
...........-..........................-....\..\..|.-..............................................\........|..
/.--..//....\...............................-............|..././..............................................
/...............|.........../..../......................\.....|............|...........|...................-..
..-................\../|......../...................../...........\..|.|\../..................................
....|...../.....-......\.........................-.....//...............|.........-.......|...-....--.........
....|..\.-..../....................|..........\............./...........\.../.................................
............................\...................................../.......................|...........\.......
.........../.....-.....................\..\.-..|............-...............\.........................-.......
......-.......-\.\......\..-.-........./...........\..........|........................\.....-.....\..........
..............-....../.-............./........../..............\-....-.../...../.-............\......./.-.....
......|...................................................||..../...|\.....................-.../...\........|.
......|.//........................-...../...........-..\...|......|..................../........../...........
.....................................................|.........//...........|\.....\....................|.../.
............-..||...........|....../....................\...\................................../.......|......
..\....\......./-\.\...........-\................|.........../................||.../.....-...........\........
+78
View File
@@ -0,0 +1,78 @@
--- Day 1: Historian Hysteria ---
The Chief Historian is always present for the big Christmas sleigh launch, but nobody has seen him in months! Last anyone heard, he was visiting locations that are historically significant to the North Pole; a group of Senior Historians has asked you to accompany them as they check the places they think he was most likely to visit.
As each location is checked, they will mark it on their list with a star. They figure the Chief Historian must be in one of the first fifty places they'll look, so in order to save Christmas, you need to help them get fifty stars on their list before Santa takes off on December 25th.
Collect stars by solving puzzles. Two puzzles will be made available on each day in the Advent calendar; the second puzzle is unlocked when you complete the first. Each puzzle grants one star. Good luck!
You haven't even left yet and the group of Elvish Senior Historians has already hit a problem: their list of locations to check is currently empty. Eventually, someone decides that the best place to check first would be the Chief Historian's office.
Upon pouring into the office, everyone confirms that the Chief Historian is indeed nowhere to be found. Instead, the Elves discover an assortment of notes and lists of historically significant locations! This seems to be the planning the Chief Historian was doing before he left. Perhaps these notes can be used to determine which locations to search?
Throughout the Chief's office, the historically significant locations are listed not by name but by a unique number called the location ID. To make sure they don't miss anything, The Historians split into two groups, each searching the office and trying to create their own complete list of location IDs.
There's just one problem: by holding the two lists up side by side (your puzzle input), it quickly becomes clear that the lists aren't very similar. Maybe you can help The Historians reconcile their lists?
For example:
3 4
4 3
2 5
1 3
3 9
3 3
Maybe the lists are only off by a small amount! To find out, pair up the numbers and measure how far apart they are. Pair up the smallest number in the left list with the smallest number in the right list, then the second-smallest left number with the second-smallest right number, and so on.
Within each pair, figure out how far apart the two numbers are; you'll need to add up all of those distances. For example, if you pair up a 3 from the left list with a 7 from the right list, the distance apart is 4; if you pair up a 9 with a 3, the distance apart is 6.
In the example list above, the pairs and distances would be as follows:
The smallest number in the left list is 1, and the smallest number in the right list is 3. The distance between them is 2.
The second-smallest number in the left list is 2, and the second-smallest number in the right list is another 3. The distance between them is 1.
The third-smallest number in both lists is 3, so the distance between them is 0.
The next numbers to pair up are 3 and 4, a distance of 1.
The fifth-smallest numbers in each list are 3 and 5, a distance of 2.
Finally, the largest number in the left list is 4, while the largest number in the right list is 9; these are a distance 5 apart.
To find the total distance between the left list and the right list, add up the distances between all of the pairs you found. In the example above, this is 2 + 1 + 0 + 1 + 2 + 5, a total distance of 11!
Your actual left and right lists contain many location IDs. What is the total distance between your lists?
Your puzzle answer was 1660292.
--- Part Two ---
Your analysis only confirmed what everyone feared: the two lists of location IDs are indeed very different.
Or are they?
The Historians can't agree on which group made the mistakes or how to read most of the Chief's handwriting, but in the commotion you notice an interesting detail: a lot of location IDs appear in both lists! Maybe the other numbers aren't location IDs at all but rather misinterpreted handwriting.
This time, you'll need to figure out exactly how often each number from the left list appears in the right list. Calculate a total similarity score by adding up each number in the left list after multiplying it by the number of times that number appears in the right list.
Here are the same example lists again:
3 4
4 3
2 5
1 3
3 9
3 3
For these example lists, here is the process of finding the similarity score:
The first number in the left list is 3. It appears in the right list three times, so the similarity score increases by 3 * 3 = 9.
The second number in the left list is 4. It appears in the right list once, so the similarity score increases by 4 * 1 = 4.
The third number in the left list is 2. It does not appear in the right list, so the similarity score does not increase (2 * 0 = 0).
The fourth number, 1, also does not appear in the right list.
The fifth number, 3, appears in the right list three times; the similarity score increases by 9.
The last number, 3, appears in the right list three times; the similarity score again increases by 9.
So, for these example lists, the similarity score at the end of this process is 31 (9 + 4 + 0 + 0 + 9 + 9).
Once again consider your left and right lists. What is their similarity score?
Your puzzle answer was 22776016.
Both parts of this puzzle are complete! They provide two gold stars: **
+24
View File
@@ -0,0 +1,24 @@
#!/usr/bin/env python3
import sys
if __name__ == '__main__':
tuples = [[int(l) for l in line.strip('\n').split(' ')] for line in open(sys.argv[1])]
first, second = [sorted(a) for a in zip(*tuples)]
# first = []
# second = []
# for line in lines:
# f, s = line.split(' ')
# first.append(int(f))
# second.append(int(s))
# first.sort()
# second.sort()
# challenge 1
res1 = sum([abs(x-y) for (x,y) in zip(first, second)])
print(f"challenge 1:\n{res1}\n")
# challenge 2
res2 = sum([x * second.count(x) for x in first])
print(f"challenge 2:\n{res2}")
+1000
View File
@@ -0,0 +1,1000 @@
15244 50562
81245 49036
92897 21393
63271 60643
49672 33212
92232 76048
53492 58600
92941 61161
58509 86979
28174 73806
70084 21118
24410 68037
84499 63407
66548 35177
65580 63759
87805 49036
83099 19486
18390 12243
26848 76511
18807 86451
72147 24247
79927 19614
11257 32484
58028 46123
75951 64756
50715 78058
95795 74458
32111 39063
46546 38789
72734 39167
98182 93444
62716 53597
89475 25175
39176 55091
40923 88724
62512 51774
86618 93444
52758 47249
13428 93526
21791 94210
93809 21118
17938 14392
60129 64756
70192 49036
12155 79882
40333 53270
23806 88706
46661 85277
88336 57672
87513 36284
41580 97455
39488 79018
53900 78058
63780 98092
18471 20090
77849 73059
93111 78100
52950 22317
81379 35177
91351 19771
14227 53597
51335 39645
98624 98092
21994 54585
60107 60337
63161 47739
42618 96226
94665 84252
79153 34048
78730 80552
75722 70308
68857 47918
88672 98092
59881 27613
85772 32111
30276 98092
14586 84246
67593 49036
72269 13771
25858 56490
33541 15922
16446 54557
47844 62540
78173 49722
50682 88706
75282 74146
62042 83481
18797 76066
24212 35217
55048 57348
91631 84573
93807 97649
88119 98092
19366 77445
76255 50452
98264 93444
64583 34766
96480 54682
67367 64709
12629 53597
55622 98092
48715 75722
38717 98460
88940 42098
57583 21667
13512 32111
89814 60737
64756 93444
16224 53597
10346 46433
73809 55198
80544 20677
11856 76359
59087 21118
72673 20090
49449 45231
20810 98650
28257 76359
72761 88706
87721 84970
33910 17682
71512 76359
51593 34928
52645 73953
65785 21745
29202 39203
84191 30175
90538 28190
36816 33095
74544 38282
97584 54184
58739 93390
75540 64756
68067 64756
52407 25292
15044 66413
20591 93444
25885 37703
26653 32104
42596 88313
23950 64756
52254 88313
70806 44075
42195 20677
36372 36394
47944 93575
38297 21118
19998 76359
88241 78058
73698 44859
92258 29814
98092 78058
28030 88927
53514 59214
77999 30893
66582 71673
79423 10257
46938 86494
42971 21118
11339 13583
71889 43763
25429 62716
81687 15843
35428 14294
21885 88053
98374 37224
81362 34784
41486 20677
20831 98092
26838 45057
89226 64709
11351 66528
20955 49036
34764 42441
43198 21118
54892 21799
64587 51818
62645 88706
39255 32111
65266 40330
20283 30516
56574 21118
12809 35177
23338 15079
58721 76273
68541 33747
46673 34048
59073 25694
80216 62716
81975 28478
44297 45993
34344 98092
63009 28253
43350 24492
95286 35177
33964 82330
87854 76359
23407 81183
95569 74797
45440 77445
80991 19568
30893 61274
26305 69824
60205 68773
12663 76359
43419 89650
39569 77945
73240 17501
84277 39378
94177 89662
95690 94786
92242 91731
73905 51412
35977 13583
27680 20677
79830 79733
84278 52001
85984 62716
39122 37115
78800 35929
33253 76179
83659 33516
91248 15310
89362 39762
15884 24386
98545 18731
15249 34048
47287 77445
68392 27779
62854 73116
43214 39063
65154 73341
71451 89287
85490 10108
10175 60337
79597 54843
15040 15044
96993 21393
36177 66813
44659 38606
10713 49127
95267 84970
38841 75464
33233 71632
73302 93444
40471 21118
26947 80385
39627 51365
47637 30893
53778 29214
79782 45138
10038 45411
86184 64709
69322 93444
70602 88706
85109 49036
58501 31677
97931 25694
24913 88313
19478 93437
51774 23744
45194 46530
78436 13583
75773 53334
24862 77445
98325 49788
68242 44288
21878 78058
22527 15044
53407 98092
33702 78511
76946 86061
34943 94066
66974 23236
87132 37827
28641 88706
78825 49515
14741 98092
56627 38087
47539 85498
40528 88706
71885 11213
83869 60337
13761 97944
75267 94765
76391 40872
84919 45561
82510 26839
42950 66528
53597 88930
51068 43621
41152 77639
82758 52077
38873 70358
88084 36028
96405 64127
24799 34048
77846 98859
20374 69465
63292 73846
11172 84410
23525 74835
94244 21118
32196 95922
28936 38955
27350 25044
20053 63490
62187 53533
15008 20677
44778 75218
34221 98092
39018 98053
23017 49363
87337 21579
72930 17695
93295 39063
66854 16885
34104 34048
60507 13583
10728 15374
24778 14446
71424 89693
40413 18036
78058 75722
37560 88706
13236 77445
87173 93444
73989 37520
14985 45194
24184 81289
28240 76359
12680 21118
97498 36199
93727 75722
17373 64709
15927 39063
30358 20677
65650 35177
46846 81415
53260 86686
32998 80757
61488 21055
95554 23175
19043 88313
99442 65217
35322 56161
58264 30893
48887 76048
96519 97502
88445 49036
22815 21393
26997 56009
45084 25370
82066 63417
88706 13583
37524 92452
67340 90779
37641 60337
84745 45323
11631 83982
19247 76359
92635 34048
36981 35177
31598 74065
54121 28812
76881 60337
99584 27133
55312 55677
83419 35177
13942 23226
89059 79979
45943 14892
49359 83296
68331 84970
36265 20090
46411 98346
25016 74405
61228 86987
47787 64766
61125 43591
23793 91663
20371 49202
40797 98092
45793 88706
68119 25069
93194 73910
29041 68173
40414 90131
35827 54613
95241 34755
34804 49863
19037 54929
15853 56399
28746 57681
33009 13250
37386 50787
89907 88313
65824 37078
29642 18922
25336 60337
77952 46523
44241 87880
25674 39063
21393 48408
58355 99461
69496 39332
27282 98092
69938 71743
83723 88313
88439 45323
46485 88255
39718 23226
23065 93444
27197 78058
72503 76359
20982 64709
60535 63346
38653 13583
77768 52721
11298 49544
42013 66528
18141 45194
81075 96111
39115 37630
18584 71632
73719 94863
85615 69932
16171 24776
78057 89054
97570 12724
51603 32111
62411 76116
72300 95646
34238 21393
38052 45323
29020 84647
41893 45194
39513 48753
11610 14667
95685 21393
95779 20677
15324 63196
76334 94163
68091 45194
38482 70862
15369 88313
89175 64021
60543 34048
56673 50331
49457 34048
71887 13583
88321 21118
71071 23226
67178 49036
91821 21118
20076 10076
87303 84970
57511 12268
43501 30007
91975 66528
15448 72284
69907 43654
25571 11414
52353 15044
69803 78058
40474 52042
26253 70310
39802 97896
83210 97215
37474 88313
31093 97572
42301 23226
19726 13583
94312 49036
58482 25755
98687 38510
19047 98092
26950 78058
71158 28096
96412 84970
35920 30893
44526 99812
42755 51182
24379 30893
70947 60543
54882 71632
51233 33596
20462 79975
53935 84134
74070 62410
54102 22085
13298 20677
26602 92907
42648 49332
22183 93444
30822 98092
86804 77932
10838 88167
24523 65219
41568 62650
80060 79089
21439 70889
66602 41342
19704 34111
67226 95394
65479 92893
37260 49036
31997 30937
97707 31068
13170 78674
26045 35177
24059 35177
32491 33653
75897 71632
10612 84970
11001 88313
35498 68825
96341 10573
23226 39063
69398 67618
17730 60337
86503 45099
72504 98743
82150 90026
68294 54832
80912 34048
96999 49036
97530 20090
35480 49036
20998 30893
70873 60337
91802 62572
54034 15709
32710 84970
58337 58861
59198 59125
61993 93321
79647 21393
26291 54259
74198 76048
57851 49450
75838 37799
60309 13382
86676 72545
29406 23958
76718 75217
33197 67338
65924 20094
88612 52547
75554 14101
36525 94200
70266 20090
36358 87645
36508 93007
28589 91657
48088 77015
22798 11552
56726 20677
80189 32314
21360 96490
90866 88706
39003 18500
27798 10095
66032 15135
11051 34048
94174 88313
15442 61388
10452 20090
11929 13583
34739 41426
64828 49036
73891 39034
52449 99470
71065 77445
89965 71632
60544 34717
21118 78369
49478 35177
26213 93444
49857 23226
74220 32262
72833 27081
38455 99610
54342 61755
43456 26783
24034 76570
32201 17321
23799 39823
72637 37646
10964 34048
42818 20090
21006 39063
39063 82696
30375 66442
15052 93444
87906 50391
17028 10100
81936 32511
12837 64709
16027 78058
49036 60337
99212 39063
28629 21118
65863 84395
20677 39063
92405 60182
55155 39063
39167 69664
74584 30893
69147 41166
75535 23751
41314 88960
47916 76048
95846 15467
14883 29065
85080 93428
52335 68547
98645 93444
39194 96760
73927 23226
90575 88313
46134 11217
85511 31236
10109 37785
20240 30893
26094 56917
35316 34048
73503 25694
89783 93444
76048 84368
63277 64756
70675 53597
44803 20677
47915 20090
12885 20090
96783 88706
55441 39063
28482 98092
91088 20088
56209 49036
73427 54203
84253 46441
45378 88313
61961 65758
68877 21118
99259 53597
52459 33058
52656 56240
95881 45231
77445 13060
91203 71632
80736 20127
33376 22802
35538 34048
98323 92633
51634 45231
55669 87627
21536 17362
32629 77445
49199 71632
57371 20583
23040 90921
73189 76359
18892 84970
75932 53597
35376 53731
29756 88313
80575 64370
11795 42629
72509 82819
80073 66528
39611 78343
55678 77155
74003 35177
82981 87429
44472 88313
15879 43889
92293 30401
68169 72422
46139 13583
25753 71632
29238 13583
65772 94594
72372 98661
49282 29132
59258 51774
20268 19289
68202 10161
30853 12555
79108 66252
93219 49036
97625 14093
15662 78058
74532 12621
84970 66528
43513 68633
24015 37782
61575 50110
75452 32111
95466 69622
27039 13583
72285 35711
84251 33375
29424 76359
58618 70025
14379 66528
89386 88706
93381 20090
91398 98680
42769 45231
12169 87022
25979 78058
72635 41261
17059 63554
47259 79838
76636 98092
73546 95012
91197 19703
65589 88706
73955 16375
23737 62914
57497 65544
89971 53597
65549 60337
49793 76048
47384 76610
23011 71632
50105 41881
56427 43543
30880 76048
24879 88313
68581 69278
74682 15597
43180 76048
90603 49036
52305 12532
22850 81110
83915 39167
19676 43682
18372 71954
89452 88706
59733 65480
70454 82540
60701 46004
90655 83636
70929 71632
28216 29450
96165 67274
34322 77426
31874 57584
54166 90667
99511 98508
31060 92465
55106 51095
79552 22669
27806 75575
46797 33693
64746 32111
76861 10157
76339 65246
13583 91436
14467 16938
85582 35177
13718 20378
99759 66607
59581 15550
96543 22529
86658 75460
65202 88706
38311 38185
19721 38534
20090 65369
21044 60105
45323 93444
41853 88706
48731 39841
44220 71632
49345 80849
77455 96766
64991 79807
84833 99183
15508 15491
31649 95360
47963 15187
32556 10033
98424 72571
20214 45512
92261 73300
83550 30893
40965 30434
73994 76048
55035 53597
25828 60337
75771 88313
67673 77526
44405 93052
18454 90175
88189 33126
87628 49036
71632 71504
37621 85292
23775 66528
52816 35363
30089 60337
98618 96587
44216 21118
26104 88313
42299 45510
45953 35177
88461 49036
94707 98092
44832 34048
30018 97006
10073 60126
32801 21118
93444 78058
14724 75670
88496 89181
97226 64756
44779 84970
20417 20090
74763 34048
86926 21988
82229 51396
41522 77498
97004 64462
94063 53597
33439 77445
52901 86349
95858 45194
46763 37729
99339 32386
97353 39063
30474 20090
29221 48754
54778 62716
32771 39063
20116 71632
69722 87766
51398 43440
97793 76359
56926 32111
66003 75722
11344 94388
45264 39251
94465 49036
12978 38585
17184 53348
87705 34048
32187 85695
51481 78692
54232 60337
99572 51669
29822 15075
65918 82780
66528 23226
40810 85626
71957 88313
93701 88706
10667 73326
51857 77839
13968 15900
99521 15237
43540 92443
27624 12544
65271 76048
44186 14578
33230 21393
33874 35177
54932 45194
18315 53578
69769 71632
75322 51896
20861 47764
88546 23226
29838 93444
83883 52312
67889 35177
59762 39167
30665 65756
13966 93444
38266 43913
60711 39167
42774 72205
76359 37929
65904 13043
34048 77445
38275 66528
84943 34580
50731 74327
64612 53597
14016 49346
55402 66508
93047 76359
49251 20090
75392 87115
90871 76589
13432 49036
18501 19808
73315 38104
18380 78457
56744 85328
44147 13583
98969 79480
16683 63967
83183 68296
33184 80175
36362 93444
40671 53597
65788 71632
23573 75722
50571 60337
67765 76048
73101 48453
67112 35176
46594 70172
75172 17447
45231 76197
20392 53244
35352 32191
20609 45194
78496 95165
12271 85861
89991 76048
65923 30779
71880 30893
73845 19368
25694 77445
44679 71632
95542 29625
72865 48533
43025 65302
38909 78058
38961 77445
12553 66528
66378 76359
79514 46457
96727 76359
12664 91220
22671 32111
60272 21393
54910 43373
78968 52670
31357 84820
98176 98092
43398 88955
51128 13514
97517 39212
53814 40263
56961 35177
90552 31236
13602 13583
12187 44890
47432 44401
84078 64709
77515 71632
88313 70149
69118 78954
75221 27687
64709 20090
89680 59037
31715 65294
61413 21118
75865 32111
67755 31175
52584 94277
47546 95471
91225 55015
28913 58527
65645 71632
19183 39377
47460 95947
75848 23226
56518 43259
60240 48233
31724 84970
37699 76048
18796 64805
37497 45231
42751 75722
28509 34048
90061 17966
65385 83274
72856 25904
41016 21118
86979 93485
18571 88706
37984 84970
36879 21118
72715 56620
88099 34048
61613 85581
15090 77445
35177 86160
52551 58172
60337 20677
95870 77445
51272 34048
31236 15332
77046 35697
+62
View File
@@ -0,0 +1,62 @@
--- Day 2: Red-Nosed Reports ---
Fortunately, the first location The Historians want to search isn't a long walk from the Chief Historian's office.
While the Red-Nosed Reindeer nuclear fusion/fission plant appears to contain no sign of the Chief Historian, the engineers there run up to you as soon as they see you. Apparently, they still talk about the time Rudolph was saved through molecular synthesis from a single electron.
They're quick to add that - since you're already here - they'd really appreciate your help analyzing some unusual data from the Red-Nosed reactor. You turn to check if The Historians are waiting for you, but they seem to have already divided into groups that are currently searching every corner of the facility. You offer to help with the unusual data.
The unusual data (your puzzle input) consists of many reports, one report per line. Each report is a list of numbers called levels that are separated by spaces. For example:
7 6 4 2 1
1 2 7 8 9
9 7 6 2 1
1 3 2 4 5
8 6 4 4 1
1 3 6 7 9
This example data contains six reports each containing five levels.
The engineers are trying to figure out which reports are safe. The Red-Nosed reactor safety systems can only tolerate levels that are either gradually increasing or gradually decreasing. So, a report only counts as safe if both of the following are true:
The levels are either all increasing or all decreasing.
Any two adjacent levels differ by at least one and at most three.
In the example above, the reports can be found safe or unsafe by checking those rules:
7 6 4 2 1: Safe because the levels are all decreasing by 1 or 2.
1 2 7 8 9: Unsafe because 2 7 is an increase of 5.
9 7 6 2 1: Unsafe because 6 2 is a decrease of 4.
1 3 2 4 5: Unsafe because 1 3 is increasing but 3 2 is decreasing.
8 6 4 4 1: Unsafe because 4 4 is neither an increase or a decrease.
1 3 6 7 9: Safe because the levels are all increasing by 1, 2, or 3.
So, in this example, 2 reports are safe.
Analyze the unusual data from the engineers. How many reports are safe?
Your puzzle answer was 624.
--- Part Two ---
The engineers are surprised by the low number of safe reports until they realize they forgot to tell you about the Problem Dampener.
The Problem Dampener is a reactor-mounted module that lets the reactor safety systems tolerate a single bad level in what would otherwise be a safe report. It's like the bad level never happened!
Now, the same rules apply as before, except if removing a single level from an unsafe report would make it safe, the report instead counts as safe.
More of the above example's reports are now safe:
7 6 4 2 1: Safe without removing any level.
1 2 7 8 9: Unsafe regardless of which level is removed.
9 7 6 2 1: Unsafe regardless of which level is removed.
1 3 2 4 5: Safe by removing the second level, 3.
8 6 4 4 1: Safe by removing the third level, 4.
1 3 6 7 9: Safe without removing any level.
Thanks to the Problem Dampener, 4 reports are actually safe!
Update your analysis by handling situations where the Problem Dampener can remove a single level from unsafe reports. How many reports are now safe?
Your puzzle answer was 658.
Both parts of this puzzle are complete! They provide two gold stars: **
+36
View File
@@ -0,0 +1,36 @@
#!/usr/bin/env python3
import sys
def safe(report):
if report == sorted(report) or report == sorted(report, reverse=True):
start = report[0]
for l in report[1:]:
if 1 > abs(l-start) or 3 < abs(l-start): return False
start = l
return True
return False
if __name__ == '__main__':
reports = [[int(x) for x in line.strip('\n').split(' ')] for line in open(sys.argv[1])]
# challenge 1
saferep = sum([safe(r) for r in reports])
res1 = saferep
print(f"challenge 1:\n{res1}\n")
# challenge 2
for r in reports:
if not safe(r):
tolerate = False
for i in range(len(r)):
r1 = r[0:i] + r[i+1:len(r)]
if safe(r1):
tolerate = True
break
saferep += tolerate
res2 = saferep
print(f"challenge 2:\n{res2}")
+6
View File
@@ -0,0 +1,6 @@
7 6 4 2 1
1 2 7 8 9
9 7 6 2 1
1 3 2 4 5
8 6 4 4 1
1 3 6 7 9
+1000
View File
@@ -0,0 +1,1000 @@
31 34 36 38 40 43 46 44
67 68 70 72 74 77 79 79
32 35 36 38 42
18 21 22 24 27 30 35
63 66 67 66 69 72
63 64 67 64 65 67 64
35 36 38 41 38 40 42 42
59 62 63 64 66 64 67 71
55 57 55 56 61
58 60 62 62 65 67 68
84 86 89 91 93 94 94 91
32 34 36 36 37 39 41 41
13 15 18 19 19 21 22 26
61 64 64 67 68 74
56 57 58 61 65 66 68
53 56 57 61 62 64 62
78 80 84 85 85
38 39 41 45 47 51
2 5 8 9 12 16 18 24
50 51 53 55 60 61
31 32 37 39 40 42 40
46 48 53 54 54
40 43 45 51 55
31 32 35 37 44 45 51
15 12 15 18 20 23 25 27
78 76 79 80 78
46 45 48 49 52 54 54
17 16 17 20 24
80 78 80 82 83 90
48 47 44 46 48
62 60 59 62 61
26 23 24 26 24 26 28 28
4 3 1 4 5 7 9 13
48 45 43 45 47 52
93 90 92 95 95 98
80 79 81 81 83 84 83
6 4 4 6 8 8
8 5 6 9 12 12 16
42 41 41 44 45 47 54
66 63 64 68 70 73
45 43 44 46 50 49
5 4 7 11 12 14 14
72 71 75 78 80 84
79 77 79 82 83 87 88 93
75 74 76 77 84 85
26 25 28 30 36 39 38
26 25 26 32 32
49 47 50 53 60 61 65
18 16 17 18 23 29
73 73 74 75 78
43 43 46 47 49 50 51 50
87 87 89 90 93 93
52 52 55 58 62
78 78 81 82 83 85 91
48 48 46 49 51
89 89 92 93 91 92 95 94
13 13 15 14 16 19 19
68 68 65 66 68 72
39 39 37 38 39 46
23 23 25 25 26 29
90 90 93 94 94 95 98 96
26 26 27 30 30 31 32 32
61 61 64 66 66 70
34 34 34 36 41
35 35 37 39 40 44 45
70 70 74 77 79 82 84 82
16 16 19 23 26 28 29 29
41 41 42 46 50
33 33 34 38 40 46
28 28 29 36 39
79 79 85 87 88 90 89
66 66 69 72 77 77
49 49 51 52 59 63
38 38 40 42 49 56
78 82 84 86 88 90 91
41 45 48 50 52 49
60 64 67 68 69 72 75 75
78 82 83 85 89
33 37 40 42 48
78 82 85 87 89 87 88 89
2 6 5 6 7 9 7
1 5 3 5 6 8 8
81 85 83 84 86 90
65 69 67 68 69 72 74 81
15 19 21 24 26 26 28
4 8 11 14 14 16 15
9 13 14 14 17 17
15 19 20 20 22 26
9 13 15 16 16 22
16 20 23 27 30
18 22 25 29 31 29
1 5 6 8 10 13 17 17
9 13 17 20 22 26
28 32 33 37 40 46
30 34 36 38 40 47 50
44 48 54 57 59 60 61 58
9 13 16 22 22
62 66 68 71 77 81
36 40 42 49 54
43 50 53 55 56 58 60 63
5 10 11 13 10
5 11 12 15 17 19 19
34 39 40 43 47
50 57 59 60 61 63 70
38 43 44 43 46 48 51
79 85 88 85 87 86
72 78 79 76 78 80 81 81
42 48 47 48 52
55 62 63 66 68 65 70
47 54 55 55 58 59 60
79 85 87 87 89 88
7 14 17 20 23 24 24 24
68 73 75 75 76 77 79 83
9 16 19 19 24
66 72 73 77 79
12 18 22 23 24 23
26 32 33 36 38 42 44 44
30 37 39 43 46 50
66 73 74 75 79 86
47 53 58 60 62
46 53 59 62 59
56 61 63 66 68 75 76 76
23 29 32 34 39 40 44
33 40 41 43 48 49 56
13 12 11 9 11
41 38 35 33 33
99 96 94 93 90 88 84
20 19 17 16 13 7
80 79 78 75 72 70 71 70
88 87 88 86 85 83 84
44 42 41 44 43 43
23 20 17 18 15 14 10
22 19 18 19 12
17 16 16 13 12 9
38 36 36 35 32 31 34
41 40 40 39 38 37 35 35
63 61 59 58 56 56 53 49
30 27 26 26 21
47 45 41 38 37
48 46 45 41 43
27 26 24 20 19 19
17 14 10 7 3
66 64 60 57 52
82 81 78 73 70 68 65
93 90 87 84 82 75 77
83 81 80 73 73
41 38 32 29 25
50 49 48 41 36
83 86 83 81 78 75
39 41 39 37 36 37
39 41 39 37 37
61 62 59 58 57 54 50
61 62 59 57 51
72 73 72 71 74 73
90 92 93 91 88 87 88
31 33 30 31 28 25 25
74 75 73 72 71 70 73 69
78 81 78 79 78 71
66 69 69 66 63 61 60 57
7 9 6 5 5 7
51 53 52 52 51 51
90 92 89 86 86 84 80
88 91 91 90 89 83
52 55 54 50 48 46 45 44
87 90 88 86 82 81 78 81
46 49 48 45 41 38 38
41 42 38 37 33
90 93 91 90 88 84 81 76
52 54 52 46 43 42
43 46 43 36 38
12 14 11 10 8 7 2 2
29 30 23 22 21 17
68 71 65 64 61 59 56 51
99 99 97 94 93 90
46 46 45 44 47
65 65 62 60 59 57 54 54
90 90 87 86 84 81 80 76
22 22 20 19 18 17 10
56 56 55 53 55 54 51 49
46 46 47 44 45
94 94 95 92 90 90
51 51 54 51 47
64 64 62 64 62 60 55
99 99 97 96 96 93 90 89
70 70 70 68 66 64 66
91 91 89 87 84 84 83 83
92 92 92 91 89 85
11 11 8 8 6 1
81 81 80 76 73 70
56 56 54 50 48 45 43 45
72 72 69 68 64 61 59 59
80 80 77 73 69
61 61 59 55 49
24 24 21 20 15 14 12 9
38 38 35 32 26 28
53 53 52 51 49 42 42
60 60 54 52 51 50 46
42 42 39 36 34 27 20
16 12 11 8 7 4
34 30 28 27 25 22 25
94 90 88 87 84 84
84 80 77 76 75 74 70
65 61 59 58 57 55 49
72 68 71 68 65 64
75 71 70 71 70 71
97 93 91 88 85 87 86 86
29 25 23 26 22
92 88 86 89 86 83 80 75
85 81 79 78 78 77 75 73
80 76 75 75 72 69 72
59 55 52 52 49 49
60 56 56 54 50
75 71 71 70 67 60
81 77 76 72 70
36 32 31 27 29
86 82 79 77 73 71 71
56 52 49 45 41
94 90 86 85 80
95 91 88 87 84 78 76
63 59 56 55 54 47 49
63 59 56 54 48 48
70 66 59 57 55 53 49
24 20 18 15 8 7 6 1
61 54 51 50 47 46
31 25 23 21 19 16 15 17
89 82 80 77 77
58 53 51 48 44
63 56 55 52 50 47 45 38
58 52 50 52 50 47 45
86 79 80 79 82
70 63 61 60 63 63
54 48 47 45 46 42
58 53 52 54 52 45
54 47 44 41 39 39 36 33
56 51 50 50 49 47 49
79 73 73 70 69 69
80 73 72 71 71 69 67 63
70 63 62 60 59 58 58 52
21 15 12 9 6 2 1
42 35 33 29 31
36 30 26 23 23
30 23 22 21 18 16 12 8
29 24 20 17 14 9
47 42 36 34 33
99 93 90 89 82 81 78 81
29 22 17 16 16
59 53 52 50 48 46 40 36
97 92 85 82 81 79 78 71
52 57 60 61 62 64 70 73
14 13 11 10 9 7 5 1
42 44 47 50 53 57 60 64
34 27 27 25 25
92 90 90 92 99
73 75 76 78 82 85 87 85
23 19 21 18 16 14 8
21 26 27 28 30 27 33
26 23 24 27 31 32 31
30 31 33 32 29 28 26 26
42 44 45 46 46 48 49 55
45 49 52 53 55 60
22 26 28 31 32 35 37
47 47 46 42 42
61 61 60 62 61 58 56 50
15 15 15 18 21 19
28 26 22 19 12
23 29 30 33 30 32 35 39
20 20 17 16 13 9 7 2
76 72 71 70 67 65 59 55
78 81 81 82 83
35 40 42 44 47 49 49
87 83 86 83 82 82
37 32 30 27 24 20 20
21 21 23 21 28
41 39 40 42 45 48 51 51
74 74 73 70 68 67 65
84 85 84 82 80 76
45 45 39 38 38
47 43 43 41 38 31
33 33 32 29 22 21 15
31 37 40 40 47
62 62 63 65 67 68 69
70 67 64 63 61 62 57
39 34 33 30 29 26 26 19
63 63 64 66 66 68 69 71
38 45 48 51 50
53 59 63 66 65
59 59 56 56 55 56
71 67 66 64 60
48 50 57 60 60
73 73 75 76 76 77 77
62 62 63 70 71
45 41 38 34 33 31 29 26
85 85 88 89 92 89 92 90
64 61 60 59 56 53 48
49 47 48 51 53 53 53
17 16 13 15 16 18 18
56 57 58 62 65 72
13 13 18 20 20
76 72 67 66 64 58
4 11 12 13 15 19 19
32 28 27 24 21 14 11 11
11 11 10 10 6
42 42 44 45 47 53 56 60
96 95 94 93 91 91 89 87
77 80 77 75 74 72
41 45 49 52 55 56 59
30 35 36 37 38 38 41
69 72 73 76 78 80 80 84
78 74 71 69 68 64 66
21 16 12 10 6
94 90 86 83 83
81 85 88 89 90 88
43 45 43 39 37 33
99 95 94 91 94
57 57 54 52 50 47 45 39
24 25 23 22 15 14 14
88 84 83 80 79 76 74 74
98 94 92 90 89 85 80
37 37 38 41 44 44
95 96 96 93 92 85
6 6 7 9 15 17 16
68 71 78 80 81 85
35 37 39 40 41 42 43 43
30 34 37 40 41 45 45
9 13 15 15 16 19 22 26
55 49 46 45 42 40 41
76 72 68 67 63
26 33 36 37 34 35
51 44 41 39 41 39 35
12 9 11 14 15 16 18 15
42 42 45 45 46 48 49 56
4 8 9 10 8 8
17 15 18 19 21 22
53 53 50 49 44 42 44
8 12 16 18 20 24
67 68 70 69 69
56 49 44 43 42 40 43
39 41 42 43 49 50
39 37 40 43 44 49 53
59 63 66 72 72
44 44 47 48 49 52 56 56
62 59 57 57 58
83 83 81 78 77 73
54 58 60 62 69 74
37 35 35 32 26
39 43 46 52 55
31 27 24 22 21 20 18
73 80 83 84 86 90
67 69 67 67 64 63 61
53 54 51 48 45 44 45
34 34 35 36 38 40 37 37
73 75 72 71 68 65 62 62
39 46 52 53 55 52
32 32 31 29 26 28 28
6 9 12 10 7
26 26 28 32 35 38 40 44
67 70 67 65 58
32 33 32 31 30 23 20
17 16 16 13 9
81 80 79 77 75 69 66
22 21 21 22 24 26 29 33
91 91 93 91 92
28 28 29 31 32 33 32
39 39 40 37 34
9 9 9 8 5 3 1 1
21 19 18 14 13 12 15
58 54 51 50 48 48 45 41
14 12 6 4 3 5
19 22 22 19 16 17
87 80 74 72 68
94 94 90 88 84
16 10 13 10 8 8
60 53 50 53 55
56 53 50 47 46 47 44 42
25 28 30 31 33 35 42 39
33 28 25 23 20 19 15
44 41 38 36 34 31 30
51 49 48 45 42 41 39 37
44 43 42 41 38
88 85 82 81 78 76 75 74
30 27 24 23 22 20 19
94 92 90 89 88 85
62 65 68 70 71 74
48 50 53 54 57
49 50 52 54 55 58 61 62
51 54 56 57 60 63 66 68
29 26 25 23 21
17 14 11 8 6 5 2
18 19 20 21 23 24
67 65 63 62 59 57
52 49 48 47 45 44 43
55 56 58 61 62 64 66 67
60 58 57 54 51 50
56 59 60 62 64 66
70 72 73 75 76
20 21 24 27 28 30
52 55 57 60 62 65
84 82 79 77 76 74
58 59 61 63 66 69 71 74
36 35 32 29 26 23 21
69 70 72 73 76 78 81
53 52 50 47 44 41 38 35
62 63 64 65 67 68
65 63 61 59 56 54 53 50
75 76 77 80 82 85 86
68 66 64 61 60 57 56 55
14 12 9 8 6 4 3
78 76 73 70 67 66 63
28 29 30 31 34 35 37
32 31 29 27 26 23 22 19
66 65 63 60 59 57 54
10 11 13 16 17 19 22
61 64 65 67 70 73 76 78
81 78 77 75 73
40 37 34 32 31
35 37 39 40 41 43 45 47
49 51 52 54 56 59 61 64
52 54 55 56 57
86 85 84 81 80 79
53 50 49 46 43
44 42 41 40 37
32 35 36 39 41 44 45 48
25 27 28 29 30 31
90 88 86 85 83
42 45 48 50 51 53 54
22 20 19 16 13
93 90 87 84 82 80 78
18 16 15 13 12 10 7 4
96 94 92 89 87 85 84 83
38 41 44 46 49 52
63 62 60 57 55 52 49 46
51 52 55 58 61 64 67
77 78 79 82 84 87
58 61 62 63 65
55 58 59 62 65 68 69 70
29 28 25 23 22 20 18
18 20 22 24 26 29 32
77 78 79 81 83 86 87
15 14 11 9 6
72 71 68 67 66
82 84 85 87 88 89 92
50 49 48 47 44 42 40 39
82 80 78 77 74 71 68
60 58 55 54 53
71 72 73 76 77 79
38 39 41 44 45 47 50 51
65 62 61 59 56 53 51
56 57 60 62 65
34 37 39 42 44 47
12 14 16 19 22 25
19 17 16 15 14 12 10
22 20 19 17 16 15 13 10
82 79 78 77 74 71
15 13 10 7 6 4
56 58 59 61 63 65 66 69
86 85 83 81 78 77 74
75 74 71 69 67 65
33 31 29 28 26 25 24 21
58 60 62 63 65 68 71 74
43 45 48 50 52
15 17 20 23 24 25 26 29
73 70 68 67 66 64 62
91 88 87 84 82 81
51 53 54 56 58
9 11 14 17 19 22 23 26
55 52 49 47 46
9 11 13 15 17 18 20 21
89 91 92 94 96 97 98
58 59 60 61 64
14 13 10 9 8
30 33 36 39 41
75 78 80 81 84 85 87
40 42 43 45 46
71 70 68 67 65
21 23 25 28 31 33 34 36
54 51 50 49 48
61 64 67 70 73 74 75 78
19 17 16 14 12 9 8 5
22 24 27 28 30 32
80 83 84 86 88 89 90
95 93 90 89 88 85
24 26 27 30 33 35 37
96 93 90 89 87 85 82 81
82 79 76 74 73 71 69 67
77 74 71 69 67 65 64 61
29 26 23 22 20 19 16 15
72 69 66 63 61
13 12 10 9 7 6 5
15 18 21 22 24
30 28 26 23 21 19 18
49 46 43 42 39 37 36 33
62 64 67 70 73 75 78 79
47 46 45 42 41 40
44 43 42 41 38 36
52 50 49 47 44 41 38 36
45 42 40 37 36 34 31
16 14 11 8 6 5
69 66 65 63 61 59 56
29 26 24 21 20 19 18
54 52 50 47 46 43 40 38
80 83 85 86 88 89 91 92
39 40 43 45 48 51 52 55
80 79 78 77 76 75 72
8 10 11 12 15 16 18 19
86 89 90 91 93
48 51 52 55 58 59 61 63
75 72 70 67 65 62 60 59
11 14 17 18 19 20 23 26
52 49 47 45 42 41 38 35
36 38 39 42 43 45 47 48
73 70 67 65 62
80 78 75 72 69
72 70 67 65 62 61 59
59 61 62 64 66
8 11 12 14 17
45 47 49 50 53 55 58 59
51 50 48 47 46 43 42
16 18 21 23 24 26
21 20 19 16 15 12 11
13 16 17 20 23 24 25
94 92 91 90 89 86 83 80
94 91 90 87 86 83 80
17 14 12 11 8 7
23 21 18 17 16
76 75 74 72 71 70
43 41 40 37 36
32 34 35 36 39 40 43
19 21 22 24 26 28
13 14 16 17 19 22 24 26
18 15 14 11 9 8
63 62 60 58 56 55 52 51
71 72 73 75 77 78
40 42 43 46 48 50
84 83 80 78 75 72 70
28 31 32 34 37 39 40 42
27 25 24 22 20
79 77 75 73 72
86 84 83 81 80 79
81 83 86 89 92 94 96
85 86 88 90 93 96 97
81 78 75 72 71
14 17 20 23 26 28 30 31
66 65 62 59 58 57 54 52
54 56 58 61 64 66 67
37 35 33 31 30 27 26
75 73 70 68 67
76 75 73 70 68
25 28 29 31 33
70 73 75 78 80 83 84
42 41 40 38 36 34 33
20 21 22 24 26 29 31
24 21 19 17 14 11 9
77 75 73 70 68 65 63
55 54 51 50 48 47
78 77 76 75 73 72 69 68
29 27 24 21 20 19
73 71 70 69 67 64 62
91 94 95 96 97
11 13 14 16 19 20 23
63 64 66 68 70 71 74 76
64 63 61 58 57 56 54 53
46 49 51 52 54 55
20 22 24 25 28 31 32
46 49 52 54 56
74 77 79 81 82 85 86 89
45 47 50 53 54
58 57 55 54 51 50
91 90 89 86 85 83 82 80
49 46 43 42 39 36 35
75 72 71 70 69 68 65 64
42 41 39 36 33 32 31
59 61 63 64 67 69 70 72
79 81 83 85 86 87 90
35 34 32 31 30
76 73 71 68 67 65
5 7 8 11 14
26 28 29 30 32 33 34
80 83 85 86 87 89
19 18 16 14 13 10 7 4
21 18 16 15 12 11
64 67 70 72 75 76 79 80
5 6 9 11 13
87 85 82 80 77 75 72
23 22 19 18 17 16 15
51 50 47 44 41 38
34 33 31 30 29 27
39 36 33 30 27
15 13 12 10 9 8
27 28 31 33 35 36
31 30 29 26 23 20 19
47 46 44 41 39
60 58 56 54 53 51 49 48
50 47 44 42 39 36 33 30
70 68 65 64 63 60
61 63 66 69 72 75 77 78
19 17 16 13 10 7
51 50 47 45 44 42 41 40
72 73 76 77 80 81
69 68 65 64 62 60 58
47 44 41 38 35
33 30 27 24 22 20
54 51 50 48 46 43
96 95 94 93 91 88
77 76 73 71 69
2 3 5 7 9 10 12
20 21 23 24 25 26 27
28 26 25 23 21 20 18 17
52 55 57 59 60 63 64
37 35 32 29 26
62 61 60 57 55 53 52 50
80 82 83 86 87
64 66 68 69 71 72
22 19 16 14 13 11
98 96 93 91 88
22 25 27 28 31 32
63 61 60 57 56 55 53 50
13 10 8 6 4
35 37 38 40 41 42 43
95 94 93 90 88
98 96 93 90 88 87
39 40 43 44 45 48
21 24 26 27 28 29
31 34 36 39 40 41 42 43
68 65 64 61 58
47 49 52 54 57 60
26 28 31 34 36 37 40 43
82 84 86 89 91 93
78 75 74 72 71 70
43 46 49 50 52 53
64 66 67 69 71
1 4 7 9 10
47 49 50 51 53 56
54 53 52 49 46 43 42 40
59 58 57 56 53
29 28 26 23 20 18 15
41 42 45 48 49 52 54 55
30 32 34 37 40
34 37 38 41 43 46 48 50
18 20 23 25 26
61 63 66 69 72 74 77
34 37 40 42 45 48 49 51
64 61 60 59 56 53 50
71 68 66 63 61 58 55 53
25 22 20 19 16 15 14
25 22 21 19 18
13 15 16 19 22 24 25
53 54 56 58 60 62
6 7 8 11 14 16
61 60 59 58 56 54
89 86 85 82 79 76 74 73
19 21 23 26 28 30 31
90 89 88 86 83
68 69 71 72 74 75
67 65 63 61 59
13 11 9 7 6 5 4 3
52 53 54 55 56 59
82 80 77 76 74 73
11 9 6 3 2
59 60 62 64 65 67
69 67 66 64 62
65 67 68 71 74 75
73 74 75 78 80 83 84 87
96 93 91 88 85 83 81 80
28 25 23 21 19 16
61 62 63 66 67 70 73
86 87 88 90 91
69 66 63 61 59 58 56
24 26 27 28 31 34 37
15 16 18 20 22 23 24
64 66 67 69 71 74 75 76
77 76 75 73 70 68 66
26 27 29 31 34 36
95 94 93 92 90
1 4 7 8 10 12 14
66 64 62 60 58 56 55 54
40 42 44 45 47 50 52 55
16 17 18 20 22 24 26 29
27 25 24 21 19 16 13
99 96 95 93 91 89
29 32 35 38 39 40 43
96 94 92 91 88 85
51 48 47 45 43
37 35 34 31 28 27 25 23
92 89 87 86 83
69 71 74 77 80 83 85
17 20 21 22 25 27 28 29
15 16 18 19 21 22 23 26
50 52 54 56 57 58 59 60
63 60 57 54 53 50 47
57 59 62 64 66 67 68
82 81 79 76 74 73 71 69
34 35 37 39 42
81 83 86 89 90 92 95 98
1 2 5 6 7 10
57 55 52 51 50 48
2 3 5 7 8 11 12 15
14 11 10 8 5 4
11 14 16 19 20
73 76 78 79 81 84
70 71 73 75 78 80 82
24 27 28 31 34 37 38
47 45 42 40 38 35 33
30 29 27 26 23 22
13 16 17 18 19 21
58 55 52 51 48 46 45 42
73 72 69 66 63 62 60 59
21 19 16 15 12 11 9 8
70 71 74 77 80
57 58 59 60 61 62
39 36 33 30 29 26 24
36 35 33 30 28 25
51 48 46 45 43 42
69 70 73 74 77 79 80 83
33 35 36 38 39 40 43
48 47 46 45 44 42
14 15 16 19 22 25 28
76 79 82 85 88 89 90
55 56 58 59 62 64
1 4 6 7 9 10 12 15
64 61 59 58 57 54
30 29 27 25 24 22 20
67 65 62 59 56 54
70 69 68 65 64 63
93 92 89 87 85
26 25 22 21 19 16 14 13
30 31 34 35 38 40 41 42
33 35 37 38 41 44 46
91 89 86 85 83 82
59 62 65 67 70 73 75
62 64 65 68 69 72 73
19 22 23 26 28 29 32
40 37 34 33 32 29 27
34 36 39 41 44 46
3 4 7 10 13 15 16 19
74 72 69 67 66 65
78 76 75 73 72 70 67 65
2 5 8 9 11
8 11 14 17 19 22 25
39 42 44 46 48 51
36 35 34 31 30 27 25
38 40 43 46 48 49 50
64 66 68 71 73 76 78
66 69 70 72 73
64 61 60 58 55
84 81 79 76 74
14 17 20 21 23 25 27
77 80 81 84 87 88 91 93
20 17 14 12 9 6 3
81 84 87 89 92 95
73 72 71 70 67 64
50 48 47 44 43 41 38
62 64 66 69 72 74
35 34 32 31 28
79 78 76 74 73 72 71 70
35 32 29 28 27 26
63 62 60 58 56 54
19 16 13 10 9
80 78 75 73 71
68 65 62 60 58 57 56
36 39 40 43 44
46 44 42 39 36 35 34 32
29 31 34 37 40 42 43
57 55 53 52 49 46
87 84 83 82 80
13 10 8 6 3
92 91 90 88 85 84 83 82
36 33 30 29 27 25 23 21
39 38 36 34 32 30
77 80 81 83 85 86
79 81 82 83 85 88 90
24 25 28 29 31 33 36 38
87 85 83 82 80 79
88 90 92 93 94
17 19 20 21 22 25 26 29
37 34 31 30 27
23 21 19 17 16
27 25 24 23 22 19 18 17
13 12 9 6 4 1
81 83 85 88 91 93
15 14 12 10 9 7 6
44 46 48 51 54 55
27 25 23 22 20 18 17 16
45 48 49 51 52 53
23 25 27 28 30 31
60 59 56 54 53
70 73 75 76 78 79 80 82
32 29 27 26 23
7 8 9 11 14
80 81 83 86 89 92
85 84 82 80 77
95 94 92 91 89
20 17 14 12 11
20 18 16 14 13 10 9
26 23 21 19 18 17 15
25 27 30 33 36 39
58 59 62 65 68 69
16 19 22 23 24 25 28 30
71 70 68 67 64 62
31 28 27 24 22
5 8 10 11 12 14 15
88 87 85 83 82 79 77
52 53 56 57 59
45 47 48 50 51 54 56
49 51 53 55 56
92 90 89 86 85 83 82
84 85 88 91 94
79 77 75 74 72 70
67 66 63 62 61
84 87 90 91 93
84 83 82 79 78 76
78 79 81 82 83 86
17 18 19 22 23
49 51 52 53 56 59 61
29 28 26 23 21
73 75 76 79 82 83 85 87
52 54 56 58 61
83 81 80 77 74 73
74 76 79 82 85 88 90 91
80 79 78 76 75 73 72 70
59 62 65 68 71 73 75
27 29 31 34 37 39 41 43
12 11 8 6 5 3
49 48 45 43 42 39 36 33
26 25 22 21 18 17 15 12
20 18 17 16 13
56 54 53 50 47
46 43 41 40 38 36 35 33
6 7 9 11 14
45 48 50 52 55 57 58
35 37 39 42 44 47 50 51
93 92 89 88 87 84 81 79
15 17 20 22 25 28
65 63 60 57 55 53
84 81 80 77 76
79 82 85 88 89
84 85 86 88 91 93 94
42 45 46 49 52 53 56
16 17 20 23 24
59 60 63 65 68 71 72
48 49 50 51 54 55 57
52 55 57 60 61
42 45 48 49 52 55 57
18 17 16 14 13
20 23 26 28 29 32
22 19 17 15 14 12 11
72 74 76 78 79 80
11 12 13 16 19
24 27 29 32 34 37 39 40
18 20 22 25 26
68 70 71 74 76
49 51 52 54 56 59 61
29 30 33 34 36 37 39
80 81 84 87 89
52 55 57 59 62
58 56 54 53 50
28 29 32 35 36 39 40
21 18 15 13 10 7 6 4
79 80 82 83 86 89 92 95
46 48 50 52 55 56 59
41 43 44 45 47 49 50 53
18 20 21 22 25 27 29 32
22 24 26 27 30
82 79 78 75 74
86 85 82 81 78 75 73
51 49 46 45 42 41
85 88 89 90 93 94 95 98
52 55 58 61 63
60 59 57 54 52 50 47
68 69 71 74 75 76 79 80
39 42 44 45 47 49 52
56 53 51 49 48 45
78 81 84 87 90
3 4 6 7 8 10
25 28 31 33 36 39 40 42
59 62 63 65 67
93 90 88 86 85 82 80 78
35 33 32 30 29 28 26 25
28 30 33 36 39 41 42
88 85 84 82 81 80 78 75
26 25 24 23 20 19
81 84 85 88 89 92 93 96
31 28 27 24 23 22 20 19
96 95 93 90 89
69 72 74 77 80
97 96 95 92 91 88 87 84
86 85 84 82 80 79 77
44 42 39 37 36 35 32 31
70 68 66 65 62
79 80 82 83 85 88
28 31 32 33 34
15 16 19 21 24
73 75 77 78 80 83
50 52 53 54 57 60 63
81 79 78 75 72 70 68
46 49 52 54 55 57
57 56 53 50 49
41 42 45 46 49 51 54
86 83 81 80 79 78
50 51 52 55 58 61
61 64 66 69 71
15 16 17 20 23 26 27
56 59 60 61 64 65 68 71
72 71 69 66 65 62
35 36 39 41 42
79 81 84 85 87
72 70 69 66 65 64
59 60 62 64 65 66 67
28 27 26 25 24 23 21
34 32 30 29 26 24
14 16 19 21 23
61 63 66 67 70 73 75
62 64 66 69 72
52 54 56 57 58
67 70 72 75 78 79
74 72 70 68 66 64 63 61
86 84 81 79 76 75 73 71
31 30 28 26 23 22 20
78 79 81 82 85 88
20 21 22 23 25 26 28 30
12 9 7 4 1
97 96 95 94 92 90 89 86
51 53 55 58 59 60
53 52 49 47 46 43
44 43 42 39 38
67 70 73 75 78 80 83 84
68 66 64 61 59 56 53
49 46 45 43 41 40 38
70 68 67 66 65 63 61
40 39 37 34 33 30 28 25
16 18 20 22 23 25 28
79 78 76 74 73 70 68
69 67 64 61 59 57
50 52 55 57 58 59 62
46 49 51 54 56 58 60 62
55 57 60 62 63 66 69
99 97 94 93 92
26 29 32 33 36 37 39
13 15 18 20 22 23 25 27
76 77 80 82 85 86
32 33 36 39 40 41
27 26 24 21 19
12 11 10 9 7 6 5 2
50 53 54 57 60 62
23 25 28 29 31 33 34
31 33 35 36 37 39 41 43
48 49 51 53 54 55 58
70 67 64 62 59 57 55
37 38 39 41 42 44
71 74 76 78 80 82 84 87
61 63 65 67 68 70 72
87 84 82 80 79
3 5 6 8 11 13 14 17
95 93 91 88 87 85 84
34 37 39 42 45 46 49
61 58 56 55 54
17 14 11 8 6
50 48 45 42 40 38 35
52 51 50 47 44 42
21 22 23 26 28 29
26 29 31 32 33
46 45 43 42 41 39 37 36
85 87 89 92 94
78 76 75 73 71 70 69 68
59 61 63 64 66 69 70 72
20 17 15 13 12 11
25 27 30 31 32 34 36 37
68 71 74 77 79 80
73 72 69 67 64 62 60 59
22 20 19 18 16
49 47 45 43 40 38 36
70 71 72 75 76 79 81
66 67 69 70 73 75 77
94 91 89 87 84 81 79
45 46 47 49 52 54
31 33 34 35 38 41 43
21 19 18 17 14 12 9 8
54 57 59 60 61 62 65 66
39 42 45 47 48 51 52
97 96 93 90 88
38 35 34 31 28
91 89 86 83 81 79
77 80 82 83 86
36 35 33 32 31 28 26 23
37 40 41 42 44 47 48 50
42 43 44 46 48 51 52 54
79 81 82 84 85 86 89 91
38 40 42 45 46 49 50
21 19 16 15 12 11
35 33 31 29 28 27
42 41 40 37 35
85 82 81 78 75 73 72
22 25 26 28 31 34
77 74 71 69 68 67
71 68 67 64 61 58 57
68 66 63 61 59
31 32 35 36 38 39 41
33 30 28 26 23 21
18 15 13 11 9 6 5
60 63 66 67 68 70 71
38 41 43 44 45 47
+45
View File
@@ -0,0 +1,45 @@
--- Day 3: Mull It Over ---
"Our computers are having issues, so I have no idea if we have any Chief Historians in stock! You're welcome to check the warehouse, though," says the mildly flustered shopkeeper at the North Pole Toboggan Rental Shop. The Historians head out to take a look.
The shopkeeper turns to you. "Any chance you can see why our computers are having issues again?"
The computer appears to be trying to run a program, but its memory (your puzzle input) is corrupted. All of the instructions have been jumbled up!
It seems like the goal of the program is just to multiply some numbers. It does that with instructions like mul(X,Y), where X and Y are each 1-3 digit numbers. For instance, mul(44,46) multiplies 44 by 46 to get a result of 2024. Similarly, mul(123,4) would multiply 123 by 4.
However, because the program's memory has been corrupted, there are also many invalid characters that should be ignored, even if they look like part of a mul instruction. Sequences like mul(4*, mul(6,9!, ?(12,34), or mul ( 2 , 4 ) do nothing.
For example, consider the following section of corrupted memory:
xmul(2,4)%&mul[3,7]!@^do_not_mul(5,5)+mul(32,64]then(mul(11,8)mul(8,5))
Only the four highlighted sections are real mul instructions. Adding up the result of each instruction produces 161 (2*4 + 5*5 + 11*8 + 8*5).
Scan the corrupted memory for uncorrupted mul instructions. What do you get if you add up all of the results of the multiplications?
Your puzzle answer was 166630675.
--- Part Two ---
As you scan through the corrupted memory, you notice that some of the conditional statements are also still intact. If you handle some of the uncorrupted conditional statements in the program, you might be able to get an even more accurate result.
There are two new instructions you'll need to handle:
The do() instruction enables future mul instructions.
The don't() instruction disables future mul instructions.
Only the most recent do() or don't() instruction applies. At the beginning of the program, mul instructions are enabled.
For example:
xmul(2,4)&mul[3,7]!^don't()_mul(5,5)+mul(32,64](mul(11,8)undo()?mul(8,5))
This corrupted memory is similar to the example from before, but this time the mul(5,5) and mul(11,8) instructions are disabled because there is a don't() instruction before them. The other mul instructions function normally, including the one at the end that gets re-enabled by a do() instruction.
This time, the sum of the results is 48 (2*4 + 8*5).
Handle the new instructions; what do you get if you add up all of the results of just the enabled multiplications?
Your puzzle answer was 93465710.
Both parts of this puzzle are complete! They provide two gold stars: **
+32
View File
@@ -0,0 +1,32 @@
#!/usr/bin/env python3
import sys, re
if __name__ == '__main__':
instr = '\n'.join([line.strip('\n') for line in open(sys.argv[1])])
res1, res2 = 0, 0
do = True
dos = []
prev = 0
do = re.compile(r'(don\'t|do)\(\)')
for d in do.finditer(instr):
if d.group() == 'don\'t()' and do:
do = False
dos.append((prev, d.start()))
elif d.group() == 'do()' and not do:
do = True
prev = d.start()
if do: dos.append((prev, len(instr)))
mul = re.compile(r'mul\((?P<d1>\d{1,3}),(?P<d2>\d{1,3})\)', re.DOTALL)
for m in mul.finditer(instr):
res1 += int(m['d1']) * int(m['d2'])
if sum([m.start() in range(*r) for r in dos]): res2 += int(m['d1']) * int(m['d2'])
# challenge 1
print(f"challenge 1:\n{res1}\n")
# challenge 2
print(f"challenge 2:\n{res2}")
+1
View File
@@ -0,0 +1 @@
xmul(2,4)%&mul[3,7]!@^do_not_mul(5,5)+mul(32,64]then(mul(11,8)mul(8,5))
+1
View File
@@ -0,0 +1 @@
xmul(2,4)&mul[3,7]!^don't()_mul(5,5)+mul(32,64](mul(11,8)undo()?mul(8,5))
+6
View File
@@ -0,0 +1,6 @@
mul(168,87)}*:mul(911,800)(%,)where()#&&$mul(734,19)?when()why(){$:?mul(829,495)do()mul(724,312){;^mul(520,383) mul(137,485)select()-mul(700,211) <(who()who()/mul(295,600)]~<select()'$why()do()when()mul(310,255)^}where()who()(!+mul(16,916),)what()@:@#where()mul(918,822),when()~/)mul(177,722)<&]:who()where()>mul(439,650)?+$mul(349,399)mul(807,317)what()?@[%mul(674,778)!mul(104,928)~[!!mul(60,636){where()when()&@why()-+mul(742,28)select()why()'&why()@>select()mul(527,483)mul(797,855)how()mul(502,647)what() {(*'}%mul(688,600))!??,+$mul(538,127)&from(),>~&*mul(963,787)~mul(820,259)~}~how()>do()what()^<}[?{'mul(202,9)$select(795,484);from()<!mul(913,93)/{{what()#-select()how()]mul(520,288),^&what()mul(583,623)mul(657,601)>;^@what()mul(671,74)&@how(151,76)!?:{mul(933,567)/)&select()do()>+,~?>mul(627,488) *mul(437,91){!#}%?how()who()mul(741,704)select():where()mul(258,129),&why():)mul(770,13)@ from()?-!what()$mul(229,613)from() select()why()};select()mul(59,263)where()from(97,930)?where()mul(514,278)(-don't()&$[how()why(783,866)&who(589,80)#; mul(130,239)don't()mul(195,249),~>>who()mul(945,698) /}how()>mul(983,248)[~why()({from()-(how()?mul(206,469)&>~who()]mul(661,410)how()&mul(768,601)/!--select()>,%mul(455,805)(}]how();<who(735,631)why()mul(216,340))what(181,514)mul(736,427)^when()]$%where()'<;mul(754,836)*@!why()select()]mul(869,551)~mul(752,713) <(~&@#mul(124,162)why()/mul(512,273); /where()why()mul(471,915)/(where():?}mul(608,515){[@:'select()[][ mul(983,96)%where(),why(){~-+]mul(102,860):#?select()%who(105,947):who(416,728)mul(765,635)@(mul(898,549)$where(580,81){mul(497,154)>/from())mul(728,180)'(what()[mul(915,20)who()+&don't()select()^)}$!who()+>mul(481,439)- *mul(332,923)when()-why()!mul(625,335)?mul(156,134)why()*'$:mul(104,186)^?#>/mul(605,863),,?mul(161,457)!#~,#~>/mul(514how()where(),'$;'$+)mul(207,90)&>$how()mul(394,95),where()'mul(827,742)how()[from()(]:/why()$+mul(46,294)>who()who()^@[^mul(500,356){]{mul(989,398)(}: mul(300,17):how()who()%?#@why()!mul(362,556)>$mul(29,294)who()<;when()mul(108,898),#<<~-*(where()@mul(86,710),'-$&what()(mul(573,832)),?{mul(953,794)why()^what()-*,/?)mul(511,634):how()/how()'what()what()mul(709,593)]mul(721,842)(!&why()where()&mul(259,304/$[*why()+#mul(932,748)? {mul(979,591)mul(576,282)(-when():^,select()>@mul(146,41){[<#(#'*}mul(615,174)&>when()what()&(mul(914,488)[~why(267,875)mul(167,385)+<%~}@![why()mul(221,316):,;[:@(!who()mul(340,617)&*how()%mul(151,744) >},-)'?mul(414,238)mul(100,868)%%what()where()mul(467,880):mul(266,276)!@!#'who()'mul(500,629)[#^select()*+how()(mul(538,599):* [;'mul(919,315)mul(760,200) <$/$}{why()'(mul(794,683)from()**'$,}}mul(915,608)>$$mul(114,893)what()select()do():^from()??from()from()^mul(316,793)>'/when()+mul(199,368)[~mul(539,838) ^(*??%mul(162,286){mul(647,357)who()$(>what()?,why()>from()mul(239,449){select()who()mul(408,790)mul(567,879)
when(),who()[what()mul(874,22)mul*'mul(908,653)>~)@mul(773,355)#mul(716,195) ?@who()mul(128,574)^select(),{:mul(799,387)who()-)+]select()'mul[mul(153,811)from(854,516)select()'(',#mul(760,387from()mul(434,344)@?what(),&!'mul(108,675) 'who()%>+why()mul>]%select()[mul(793,13)mul(333,332)~why()/what()mul(774,658)**mul(375,739)[)*what()what(),>::>mul(702,335)%}{-@'~who();mul(992,903)}where()$(~@)'%mul(488,891)where()*);why()what():{&why()mul(29,881)&]where()where()~*mul(886,964)}&):where()who(){?mul(60,664)why()from()< +select()[when(789,49)$mul(40,510)<how()who()mul(755,503)mul(851,686)?#;}{{from()~'do()>from()~ who()>?from(431,14)%[mul(313,439)mul(999,227)[how()']what()(%,don't()who()><{#~'where()?mul(796,988)what()$/why()#select()/#what();mul(401{~mul(949,141)when()why())/^$$}^(mul(472,738){]:+mul(372,612)mul(647,895)>&$***mul(619,883)(;^mul(864,456-}#/?mul(68,612)~,}>from()!>-when()mul(997,365)mul(524,378)where()where()/!mul(301,937) ++?^what()mul(656,303)}{}mul(953,842);select()select()~[)<mul(617,87)where()what(517,442)~{mul(412,205)-?^?from()],+mul#?%#mul(389,357)how()!$<mul(809,511)who()>do() !;!mul(344,321)from()mul(819,403)+how()where()where()<($mul(908(,>%*why()what()^mul(533,374)-,select()mul(905,803)mul(140,691)what()([mul(874,79)]?how()what()?->mul(344,908)$#&#;from()!mul(256,631){where()#@,]~*:why()mul(225,679)where()?[mul(141,585)+)@~#how()mul(933,177)((+select()mul(312,241)+mul(247,632)how()^[,&from():where()%mul(663,72)![@@when()mul(274,536)>who()@mul(269,240)mul(732,115)!%@'%mul(479,836)-why()mul(502,828)#mul(548,385))mul(312,586)/&{//+{^mul(275,705)where(377,884)$ *!who()mul(382,713)+<@(<>)[select()'don't()mul(182,291)select()]:*select()where(872,531)what()&)mul(361,941)why()/+mul(832,469),-$)mul(753,874)^when(){,@mul(865,352),+#what()mul(749,612)!?#]from(),#mul(734,31)when()^mul(992,318)mul(396,187where()mul(134,182)&<&%$[>,mul(527,215)mul(400,794)'~what()mul(427,148)where()from()<<mul(867,258)<>-mul(495,578)where()}-don't()select()%+^{]what()where()mul(730,966)%$where()'mul(507,416)from()~)how(488,343) %<%>$mul(486,368)what()why()[mul}^^{who()what()[select()'why()who()mul(214,853)from()how(301,437)^):)]how()mul(657,161))(^@select()'mul(313,702)(mul(486,323)*&;&why(){'&how()-mul(911,603)-what()%mul(519,498))select():from()mul(652,991)!!/,mul(308,418)- &#+(who())~)mul(749,786);what()(mul(731,76)<!mul(572,33)/%:;select()from()mul(509,810)~mul(861,431)>do(){&what()$+-^how()mul(214,122)mul(540,414)from()mul(640,157)select()< #:;]^mul~mul(705,467)(?[}when()>where()?mul(45,584)~when()^;mul(519,782)}#when()+[mul(670,319?>]mul(451,604):mul(646,328)when()^mul(326,180)why();who();'$mul(642,425)from();?+when()]mul(907,636)what()%;do()what()?{who()mul(974,27)>{how()(^}mul(357,294)${~[@mul(983,221)who(){(!~from()^mul(128,197)*mul(942,48)>:+]{/from()#mul(237,772)<+select()@mul(361,84);why()]!)who()}+mul(740,305)&,[>]how()mul(660,613):)from()do() select()?when()%select() (mul(835,437)why();)</? how()mul(417,353)-( !select(480,286)mul(935,409)who()/*^+$mul(48,5)>how()mul(819<%/{how(675,621)where()@(>from()mul(722,49)
+)do()%;!who()who(772,423)]$<-mul(328,361))mul(149,957))do(){#!where()>#what()(select()/mul(756,781) *-select()?why(713,643)mul(514,277)$]how()/^mul(7,203)%when()how()who()mul(389,589~]who()*>$^@mul(129,92)~;mul(759,369)how()*!&from()/when()%mul(650,562),*who()*'%when()mul(236,299) }?how()how():don't(),who()how()'why()who()what()@mul(322,510):-@:$@^mul(634,343)-what()#what()from(38,805),<+mul*where(835,107)where()&where(816,43)(%{mul(617,254)where()!^![ who()?;<mul(166,155),$*:<mul(827>/~*;why()mul(788,442))-what())!?(mul(662,916)mul(401,521)mul(234,405)+~,{>from() :{select()mul(635,416)+[~[,mul(562,550)mul(152,551)#]mul(164,957)~<what()#where()>from() mul(761$who()?--<where()+mul(795,259)[~{?<select()&:mul(229,87)mul(864,182)how()?mul(974,34),mul(627-mul(177,523);,^mul(45,82)[-!}mul(370,437)(#:];:(mul(818,270)'}^]when()how(934,258)don't()'{+*why()}mul(530,297)]^/$from()<who()*$mul(842,310)from()^/)%select())+mul(482why()select()&from(415,942)!]how()why()mul(279,984)~when()>}~'/who()when();mul(796,168)what()mul(199,983)>:]when()?why() mul(410,263) when()how()?mul(413,448)]mul(825,830)# mul$mul(261,686)@~{>{what(276,567)mul(341,638)who(){?*$[why(831,759)^ from()mul(741,711)'who()select(){mul(61,52)[what(){%don't():who()@mul(219!)?];where();' *mul(371,514)>[:mul(53,428!mul(538,853)]$#~do()@mul(200%{$$[$#$)mul(57,357)/mul(399,855)~<(*@~what()(@mul(814select():what()]~[#mul(507,982)**mul(68,893)}#mul(631,348)from()mul(205,133)mul(497,687from() !mul(728,117)[;)'@/}@{mul(678,169)who()@$@@~%how()mul(959,969)%@^&{~! ]%mul(324,123)'from()who()}^%mul(763,855)from()^when()#{ /from()#]mul(316,502)what())^<^%%mul(813,959)&why()~~-?-mul(798,375)$>{#'why()&:,why()mul(83,95)(don't()mul(798,687)when(506,624)from()(,how()^: ]>mul(149,563)why()~mul(41,612)-:?when()^/)mul(974,373)>when()?how()*mul(36,761)what(){&@)mul(390,671)when()mul(696,964,@when()@$/?~>~mul(548,987)select()what()% who();$mul(80,587)&^{+,don't()?what()*why(),( mul(124-^>how()/>'mul(155,901)?<;when()!!mul(90,13))/'^from()&[,)mul(805,998):@select()/~from()+(^/mul(823,626)%where()select()how()%&>mul(257,517))#->mul(304,899))mul(255?mul(302,286)>?@<mul(777,721)^&what() !from()/*where()mul(817,696)why()#+&who()why(351,81)}where()$mul(237,864)<&(do()^?from():*{<who()select())mul(975,616),{+where()/@@who()mul(549,977)@<)when(),mul(508+<$mul(716,515)^,-]who()#select()<+mul(118,226how()mul(543,380)(how()?select()from()@}mul(28,144);;'>mul(899,21)@mul(619,488)$->&^@from()(*-mul(266,282)/]from()@who(109,244)()mul(98,720)why()what()>;% mul(681,256)#~)]from()@&mul(517,40)@@what())mul(725,452)mul(852,71)?$mul(612,673*select()what())#mul(120,4),where()who())mul(808,259)who()'^~mul(325,215)!>select()~mul(853,581)%why()mul(652,100)%<select()##what()~mul(237,441)when()!how(753,120)^mul(890,518)from():,who(196,65)+#$ mul(664,43)}%^how()/from()[[when()mul(39,906)mul(324,714)#[#from()mul(569,489)'<who()*@mul(167,880)*select(){>^@don't()/,when()~what(),+&mul(975,420){+*when()]^how()*why()who()mul(448,331)!/when()~mul(235,190)^$}+*++{#mul(96,137):?%where()mul(511,78)};^{&:when()!don't()&when()''&#:{mul(205,318)*!where()?when()~/&from(733,701)?mul*#&#where()where()]{select()mul(474,265)from(755,678)why()!;#]'>-]mul(132,817);&)]^*what()[mul(831,118)select()<mul(181,530)%)mul,])!<>+how()how()mul(292,875)%&select()[@*mul(868,274)&@select(),{mul(427,903)/@]mul(620,307-+what()select()-where()mul(206,860)-mul(937,784):where()!+mul(347,517)#!/usr/bin/perl(select()~from()mul(730-,what()!where(360,351)what()*how(600,916)mul(929,974)
~]#<!when()[~*<mul(132-+why()#%*~:@mul(416,703){@#';>mul(190,848)?{from() }where()<mul(527,529)-mul(209,184)?[what()when()mul(77,529)why()how()<#who(360,918)-mul(417,741)where()what(269,273)from()(mul(322,695)select()@^][don't()]mul(739,357)']when(789,549)/:&when()>mul(532,685)#+~^&]^where(947,658){mul(835,556)mul(785,197)@mul(20,129)>(%*$?,%^]mul(309,855)(!select(){[?](mul(408,217)+;who()why()-&$ ,$mul(824,38)&mul(848,553)@where()who(774,973)-[;mul(590,491)what()'/mul(625,672)!}~~%>-{]-mul(113,831)}+//>(what()mul(822,256):<*$!select()mul(743,335)how()^* (<mul(341,513)do() {,(how()*,^&mul(777,587){>^what()'{[,select(249,901)mul(795,853)@$;mul(486,10)>>?~mulwhere()<~}mul(375,790)/}when()*!mul~-select(){select()select()<]don't()''-'mul(934,731)select()';*select()&why()mul(280,932>mul(530,961)how(),-{how()&what()>(mul(285,204)who()+select()>~>?/<)mul(791,587)from();~mul(142,801),from()~>when()mul(636,737)mul(122,583)select()mul(29,534)[<}>~?;++,mul(853,461)where()&/where()>do()what()where()mul(224,748)when()(from()$%>mul(537,689)@how()from(97,626)%!mul(854,118)when(998,592)-+>how()'when()/mul(548,649)who()who()#) &@!,do()}[^[@mul(154,777)mul(96,225)when()mul(951,144)what()mul(358,785)select()+from()what()-$mul(507,770);select()where()where()mul(696,121)who()when()]&$}how()what(){mul(63,669)+*where()/why()mul}&@where()!?'@;mul(81,559)*]how(372,376)mul(602,773)+mul(511,514)) (,}mul!#%$where()from()%~?>+mul(451,596);from()mul(719,514)^who(533,943)}how()@mul(382,562)!#[,@*)>mul(234,778)&-mul(280,479){, [do()how()!&{mul(971,30)'@why()) ?:+>don't()where()%from()/*&&!mul(551,129)where()!when()@@>[$mul(266,378)&mul(354,236)where()who()mul(198,648)when()~<[what()what()mul(215,213)mul(687,432){,mul(595,927)+<why()*@how()*{%mul(764,459)>who(829,436)^+mul(424,283)@why(),mul(169,939)/[*from()> %!(mul(537,425)%^mul(352,791)*#when()when()-&;what()mul(904,80) select() how()how()mul(34,66)@%<mul(276,65)where()when()how()})mul(52,448)who();select()mul(692,130)what()${%&^%mul(444,170)[)(,<mul(297,209)%&]select(170,397)$mul(577,234),select()^:~,[*>do()mul(921,346)/#what()mul(49,901)mul(734,885)/)(:mul(553,997)(who()mul(62,853)from(535,930);where()#what()mul(457,969)&(+(*}why()mul(317,972)where()when()$do()why() why():~%:^mul(447,529){mul(612,477)how()$when()mul(66,532)>$$*mul(945+*<how(289,725) who() what()how()how()}mul(304,883)select()^':{/':'-mul(715,525)!mul(270,804)from()::['when()why()mul(93,166),-when()!mul(736,616)+;mul(531,606)<how()&[+&mul(967-^'}+-}from()mul(178,389)who()<*mul(116,273)#);#select()mul(628,521)@}where()<where()(;how(376,88)<mul(99,450)}<how()$mul(612(mul(214,455)?:mul(841,59)~~mul(162,250)^]#&>*^)who()mul(291,880)/mul(903,311)*;how()mul(58,539)]-@+&%),what()mul(501,878)*[[mul(626,427)]}how()?when()[mul(280,653)/when()]-<mul(765,466)~-<(select()}{){do()from()*where()!;mul(701,836)'~mul(529,579);!:'+@/'mul(54,282)^<'mul(792,927)&mul(470,236)who() @ ])+??mul(693,230#+~?:-^mul(814,574)from()<when()@#mul(430,705)where(),when()@*$!what()$how()mul(95,323)who()when()mul(38,704)@{where()why(),from()where()[{<mul(455,604)}where()from()~mul(719,681)mul(131why()^where(389,683)**mul(331,541)-}{mul(320,970)
:}#mul(737,307) *?)~,]mul(740,642))><mul(666,137)why()where()where()from()why()$ mul(709when(),select()*]when()(mul(510,937)&+>where()why()mul(235,299){;select()mul(543,852)>mul(456,133)(>mul(671,153)'?*who()(mul(12,640)<{##+mul(432,266)*>)'[~>$~?mul(816,840)what()-mul(698,399)how()mul(45,603))~*what()mul(737,715){when()why()~from()mul(995,968)where()mul(262,96)^?who(){; )from()who(615,278)mulhow()mul(838,616)}from())mul(865,576))~-;how()mul(192,403)))[-$]^select(),mul(184,369)#why()*^;)(do()#,'mul(423,897);)]what()/[$]mul(867,533)select(138,395)*-how()mul+#<why()}[~{mul(925,163)<mul(798,343):mul(137,381)~/>;mul(515,882)]:(mul(364,946)&!&,how()select()- mul(111,167):~$from()^]don't()&mul(829,425)!'/how()where()]/<what()mul(521,742)mul(316,792)mul(311,104)from()<%mul(869,189)^&why()[&:mul(683,138)how()mul(533,311)from()%what()@mul(785;select()~?{}++where()mul(102,590)}&what()}(^[<:mul(997,376)'@/$;mul(25,111)~+$]^;+?mul(786,845)@why()&mul(737,79)''from(340,968) how()where()^?mul(803$select()*why()!select()*/%-mul(450,746)who()-(from()where()when(525,894)mul(110,878)-%select()$)@;mul(445)]-~~*/)&mul(205,632)$[^}select(599,536)how()how()who()]mul(952,986)who()/#*:]who()+/mul(346,355)^where() don't()@who()?+&;mul(617,393)&how()>mul(195,257)*mul(953,79);who()when()$,from()<>why()mul(529,405)from()&mul(492,793)&#*[;+;-mul(331,898)?/{+}mul(424,343)$~[mul(523,74)why();mul(772,703):;mul(17,157)! }why()/]!^mul(979,338when()$?mul(898,616)}why(359,279)+from()what())}$from()!mul(612,784)(where()mul(640,368){#!mul(69,807)]how()( #mul(739,987)'*~&%who()!}@mul(834,525)when())::$mul(122,894)%+^(who()@when()%mul>when()from()?mul(464,80)$^! !/@?@,mul-what()!!@:[mul(283,21)([how()[mul(11,617)]}where()/mul(976,268)mul(843,731)<how()why()[mul(601,412)%how()!]@*why(136,791) -mul(371,365)@~$*'~[/ mul(15,594)how(),/{#-}>'mul(676,131)where()}{(]'where()mul(459,88);(where():mul(64,747);[&$})+select()&;mul(750#[{;*&mul(458,334)?where()select()%)mul what()?when()mul(808,879)what()*}-$+from()where()@mul(152,857)'#%where() /<:+?mul(304,149)from()!<when(865,985)mul(238,815))~!+<)@from()mul(401,975)%&mul(625>*!mul(802,11)!*select(),; )-;how()mul(199,993)/!when()^;[)mul(577,723)!?^who()+what()<mul(489,809)~what(625,812)<?;*#)how()do()!(]who()what()where()*from()+mul(705,108)(who()why(815,180)[]^[mul(821,379)&^(&<,%mul(197,678)%-what()mul(944,295)select()how()!mul(357,711))$-what()'&)'mul(114,910)}<*@-from(688,563)[mul(279,269)from()}$mul(707,287)<;*+what()*>when()mul(447,881)+'(+&@&do()mul(192]what()%/mul(463,832)mul?^*>why()where()from()what(){*mul(456,920) $where(911,93)select()+who()select()}don't()}!how()what()~+what()mul(404,558)>,>{(?{'&,mul(936,304);mul(232,989~;>]who()mul(582,897)*!mul(11,23),~>!{<who()$>mul(542,522)^;,from()(?mul(177,928)how(985,316)}who()@](-#why()mul>~why(851,863)[)!@>mul(101,448)select()+?%&select()~((mul(11,450)how()^)mul(344,639)}+;mul(343,648)^why()!where()&{/'#mul(9,810)where()-%mul(877,263)&select();where(240,275)[mul(289,282)how()&<{who()} ['do(){mul(818,421)/}$]mul(617,829)~['why()?&~)mul(741,559)mul(133,701)$]:@&mul(594,307)[',how()^{how()mul(388,657!({'mul(492,896)#@/why()why()mul(127,225)}>where()-/,^mul(219,314))mul(682,893)what()why(){(,from()(?mul(219,360)what()' ](mul(80,569)
select(82,585)mul(693,510)%$what()from()mul(740,749){~'<]mul(281,263)when()(!?>/% +mul(116,41)-*-when(506,165)?^}mul(651,943){~,/what(){#{!mul(629,41)/mul(74,998)?mul(525,86)&how()do()+/%mul(15,103)#select(671,57)from()who()]mul(309,559)%>mul(311,459)'when()@#mul(980,750)when()+%how()how()~:mul(484,554) )+{ - :]mul(113,626)[^<%,mul(187,326)*:!]*!mul(374,45)from(),mul(41,137),^)-,#when()?who()mul(93,289)select(853,56)]^where()mul(43,349)*where()mul(406,653)from()from()*&*mul(486,350);)*~how()mul(817,387)>>when()who():mul(417,224)^!&{from()}@mul(342,365)why()^who()+~!}when()do()why()when(939,686)^)((mul(160,438)what()>mul(23,766)+]*mul(618,433[/~where()[;why()what(){mul(292,318)*$why(664,963)how(68,975)why()who(276,89)where()!why(777,555){mul(875,358)@'[#who();)mul(198,992)?:(?~where()what()how()-'mul(956,332)mul(889,561)from()((what()mul(753,443)#>? , -mul(267,527):when()+mul(225,923)>>?^mul(726,980)~when()'mul(760,283)!;why(),;when()mul(358,713)//select()]%^{why()*'mul(406,429,(: {how()!^;mul(363,272)--where()*:select()when()?when()mul(242,130);why()>:!&why()$mul(386,685)@!}>when()why()>how()how(872,684)mul(418,627)why()[{:[-%mul(946,701)(}mul(10,874)&mul(109,151)],mul(676,79:;]}),mul(206,822)mul(228,261)-how()?]+mul(295,706)/]@( how()-mul(558,819)@::!>where()*when()?}mul(709,558)*)~;?}> how()from()mul(489,495)[*where():}(*%mul(189,692)how()/where()why()(mul(895,190))]<select();'who()when(309,317)mul(204,524)from(),&# mul(563,48)what()mul(207,241)&mul(450,18)when()what()select()^]{$why(565,783): mul(422,431){,}?+how()what()where()mul(782,229)[%}:~mul(994,946)){,$*,mul(84,333)#?@^]mul(324,259)<mul(723,626)*)/select()mul(22,373)from()mul(158,952) #mul(862,250)'$#;{mul(816,365)&$who(930,819) mul(440,442)^@@mul(35,883))>{+mul(904,446)~(?-*:select():]?mul(21,770){&?/what()mul(810,761)( <{#^why()select()mul(542,583)mul(517,719)*who()]mul(229,391)^:,;where()who()[&mul(181,416)>when()( %+{mul(376,885)+}/}*what()[%when()mul(412,213)who() mul(151,478)do()+when()mul(683,117)@how()[@>(*%mul(666,434)%+mul(83,30)^}:mul(983,213)@-what()mul(36,788)';%-#+]#mul(575,6)#when()'&@who()<$ who()mul(764,292)<,where()where()mul(230,519)<<^('mul(384,769)%,what()@who()when()where()when()mul(104,361)&select()what()-!mul(523,283)do()mul(920,551)mul(589,394)$(select()?#>&*'mul(672,365)+:]@$)mul(373,982)mul(810,292)-mul(990,386)?mul(372,766)where(),]^mul(651,898)from()from(){?;select()mul(293,197)why()( [;&^~@mul(505,310)what()what()select():]-what(873,670)mul(885,505);-#{';-how(967,119)select() mul(956,774)mul(51,516)mul(756,597)^~select()how()%&from()mul(463,747)&why()who()())mul(193,948)from()when()what()why()from():select()%select();mul(143,694)(mul(448,194)@<(-where(536,660)?select()mul(280,832)select()#^}mul(296,908)where()@{> #*do(); ;how()mul(417,4)mul(939,57)&'~?-'(#do())[where()+<<where()mul(223,643):%/mul(367,601)}*}[mul(451,653)why()<when()from();(#<;mul(960,745)>%:?(}mul(975,356):,select(275,833),#?(when()&]
Binary file not shown.
+75
View File
@@ -0,0 +1,75 @@
--- Day 4: Ceres Search ---
"Looks like the Chief's not here. Next!" One of The Historians pulls out a device and pushes the only button on it. After a brief flash, you recognize the interior of the Ceres monitoring station!
As the search for the Chief continues, a small Elf who lives on the station tugs on your shirt; she'd like to know if you could help her with her word search (your puzzle input). She only has to find one word: XMAS.
This word search allows words to be horizontal, vertical, diagonal, written backwards, or even overlapping other words. It's a little unusual, though, as you don't merely need to find one instance of XMAS - you need to find all of them. Here are a few ways XMAS might appear, where irrelevant characters have been replaced with .:
..X...
.SAMX.
.A..A.
XMAS.S
.X....
The actual word search will be full of letters instead. For example:
MMMSXXMASM
MSAMXMSMSA
AMXSXMAAMM
MSAMASMSMX
XMASAMXAMM
XXAMMXXAMA
SMSMSASXSS
SAXAMASAAA
MAMMMXMMMM
MXMXAXMASX
In this word search, XMAS occurs a total of 18 times; here's the same word search again, but where letters not involved in any XMAS have been replaced with .:
....XXMAS.
.SAMXMS...
...S..A...
..A.A.MS.X
XMASAMX.MM
X.....XA.A
S.S.S.S.SS
.A.A.A.A.A
..M.M.M.MM
.X.X.XMASX
Take a look at the little Elf's word search. How many times does XMAS appear?
Your puzzle answer was 2493.
--- Part Two ---
The Elf looks quizzically at you. Did you misunderstand the assignment?
Looking for the instructions, you flip over the word search to find that this isn't actually an XMAS puzzle; it's an X-MAS puzzle in which you're supposed to find two MAS in the shape of an X. One way to achieve that is like this:
M.S
.A.
M.S
Irrelevant characters have again been replaced with . in the above diagram. Within the X, each MAS can be written forwards or backwards.
Here's the same example from before, but this time all of the X-MASes have been kept instead:
.M.S......
..A..MSMS.
.M.S.MAA..
..A.ASMSM.
.M.S.M....
..........
S.S.S.S.S.
.A.A.A.A..
M.M.M.M.M.
..........
In this example, an X-MAS appears 9 times.
Flip the word search from the instructions back over to the word search side and try again. How many times does an X-MAS appear?
Your puzzle answer was 1890.
Both parts of this puzzle are complete! They provide two gold stars: **
+50
View File
@@ -0,0 +1,50 @@
#!/usr/bin/env python3
import sys, re
import numpy as np
from scipy.ndimage import rotate
from collections import defaultdict
# copied from stackoverflow
def groups(data, func):
grouping = defaultdict(list)
for y in range(len(data)):
for x in range(len(data[y])):
grouping[func(x, y)].append(data[y][x])
return list(map(grouping.get, sorted(grouping)))
def a_cross(puzzle, x, y):
if puzzle[y][x] != 'A': return False
elif x == 0 or y == 0 or x == len(puzzle[y])-1 or y == len(puzzle)-1: return False
elif ((puzzle[y-1][x-1] == 'M' and puzzle[y+1][x+1] == 'S') or (puzzle[y-1][x-1] == 'S' and puzzle[y+1][x+1] == 'M')) and ((puzzle[y+1][x-1] == 'M' and puzzle[y-1][x+1] == 'S') or (puzzle[y+1][x-1] == 'S' and puzzle[y-1][x+1] == 'M')):
return True
else: return False
if __name__ == '__main__':
puzzle = [line.strip('\n') for line in open(sys.argv[1])]
words = re.compile(r'(?=XMAS|SAMX)')
res1 = len(words.findall('D'.join(puzzle)))
npuzzle = np.array([list(p) for p in puzzle])
# rows = groups(puzzle, lambda x, y: y)
#cols
res1 += len(words.findall('.'.join(['.'.join([''.join(l) for l in groups(npuzzle, lambda x, y: x)])])))
#fdiag
res1 += len(words.findall('.'.join(['.'.join([''.join(l) for l in groups(npuzzle, lambda x, y: x + y)])])))
#bdiag
res1 += len(words.findall('.'.join(['.'.join([''.join(l) for l in groups(npuzzle, lambda x, y: x - y)])])))
res2 = 0
npuzzle = np.array([list(p) for p in puzzle])
for y in range(len(npuzzle)):
for x in range(len(npuzzle[y])):
res2 += int(a_cross(npuzzle, x, y))
# challenge 1
print(f"challenge 1:\n{res1}\n")
# challenge 2
print(f"challenge 2:\n{res2}")
+10
View File
@@ -0,0 +1,10 @@
MMMSXXMASM
MSAMXMSMSA
AMXSXMAAMM
MSAMASMSMX
XMASAMXAMM
XXAMMXXAMA
SMSMSASXSS
SAXAMASAAA
MAMMMXMMMM
MXMXAXMASX
+140
View File
@@ -0,0 +1,140 @@
SXMSMMXMASMSSSSXAMXMXAMXXAAXMAMSAMMXMAMXSAMXMXMMMMSMMXMXMASMMSMMSSSMAXXMSMSSXMASMXSSSXSMMSSSSSXMASXSAMXSMMSSMXXXXXMASXMXMSSSMMSSMSSSMMMMSSXM
SAMAMSMSMSXAAMAAXMSXMSSSXSXMSMMSASASXSMSMSSMSSMXAAMXMASXSAAMAXASAXMASXSASMASMMSMMAMXSAAXAAXAAAASAMAXAXASAAAAMMSMMSMMMASASAMXSAAAAMASMAASMMAS
SAMXSAAXAMMMMMMXAXSAMMAMAMXMAAXSXMASAAMSXAXAAAXSMSSSSXSAMXMMASMMMSXAMSAAXMAMMMAAMASAMXMMMSSMMMMMASMXMMXSMMSXMAAAAAAAXMASMASAMMSMMMAMMMXMAMAM
SAMXSMSMAMAAXSXSSXSAMMAMAMASXSMSXXXMMMMSMMSMMXMSAAAMXXMXMXXMXXXASAMXMSMSMMXXAXXXMAXAMSXXAAMXSAASMMMSXAAXMAXMSMSMMSXMXMMMSXMXSXMMMMXSXSMSSMMS
MSSXMAXMASMSSMAXMAMXMMASAXMXAMAMXMMMXMXMAMXXAXSMMMSMXMMAMMXMAMSMMMSSXSAXMSASXXSXMSSMMSAMMMSAMMMMAAAAMMMSSXMAMAAAAMMSXXAAXXSASAAAXMASAAAAMAXA
XAXASMXSAMAMAMMMMAMASMMMMSXMSMSMSAASXSXSAMAMSMSAXSAMXAAAXMAMAMAAMAAMAMAMAMASAASAMAAXAXAMASMMSSSSSMMSAMAAMAMAMSSMMSAMMSMXXMMASMSMMSAMXMMMSMMM
MMSMMMAMMSXSAMAASAMXMAAAXMAXMAXAMSMSAMASXSXAMASMMXAAXXXMXMMMASMSMMSSSMSMSMAMMMMAAXXMXMMMXMAAAAXAAMAMMMMASMMXXAAAAMAMMAMXMXAAMXMAAMXSASXMAXAX
XAAAAMMSAAASXMSASASXSSMMSMMMSAMSAMXMAMAMMAMSMAMMXSXMSMSASXMSXSAMXMAXMAXXXAXXXASXMASMXSAMSSMMSXMXMMAXXASAMAASMSSMMSSMMASAASMXSAMMMSMSXSASASXS
MSSMMSMMMMMMMMMAXAMAAXMASASASXMXMAMSAMXXSAMXMAMMXSMAAAMSMAASAMXMSXMXMAMSSMMMSASMMXXAASXMAAAMAAMSXSSSMMMSMMMSXAXXXAAXSAXAXMAASXSAMXAXXSAMXSAS
XAAASXXAAMAAXAMSMMMXMMMMXAMAXAMXAMMSXSXMXSSXSAXXASMMMSMAMMMMAMMAMXXXMASXMAAXMAXASMMMMSAMSSMMMXMAAAMAAMAMMMSMMMSMMMSAMAXSAMXMSAXXSMMMAXAMAMMM
MMSMSAXSSSMMMMAXAXMASAXSMSMXSAMXXXAMMMMMAMMMSMSMASXMXMMMMAXSMMSASMSSSXMASXMXMMMAXMAMSSMMMAMXXSSSSMSSMMASAMAAAAAAAAMMMXMAASAXMXXMXMASMMSMMSAS
AXAXMAMMAXAXAMSMSMMAXMXSAXAMSAMXMMMSAAAMAMSAMXAMAXASXMASMMMMMASAMAXAAXSMMMXAAXMXMMMSAMASXAAAAAAAXAXXASASMSSSMSSXMXSXXXMXAMXXSSMMAMMAXSMAXXMA
XSASMMMMAMMSXSAAMAASXSASXMAMMSMASAMXMXXXAXMASXXSSSMMXMASAAXAMMXXMSMMMMMAAAXSXXMSASXMASXMSAMMMMMMMMMSMMXSXXXMAXMMSMSMSMSAMASXSAAAASMMMAMMMSXM
XSAMMAXMMMMSMSMSMSMMAMASASXMAAXXMASAXXSMSSSMMAXAAMAAXXASMMSSSSMSAMASAAXMMMMMAAAAMMASXMXMAXXXAAAMXSASAXMMMSSMXMAXSASAAAXXSAMXMSMMXMAASAMSASAX
AMAMSXSXMASMAMAMMMAMMMXMXAMMXSSMXXMAMSAMXAAMASMMSMSASMXXAASXAAASASAMSSSSSXASMMXMASAMASMMMAMXSSXSAMXSAMSAMXAMASMMMAMSXSXXMAXAXMMSMXSMMMMASXSM
AMMMXAMASMMMAMAMSSMMXSASXMMSAMAMAMMMMXAMMXMAAXMXXAMXXAXXMMSMSMMSAMAXXXAAAMXAXMXMAMASAAAAAAMXMMXMMMXMMMSASXMMXAAAMXMXXMMMSSMMASAAMMMMASMMMMMM
MSSMSAAAXAASMSMSXAXMMSASAAAMASMMASAMMSMMMXXMSSSMMAMXMSMXSAMMASMMMMSSMMMMMXXSXXAMAXAMXSSMSMSAAAXMAMXAMXXMAAXAMSMSXMXMSMAMAMAMAMMMXAASAXMXXAAM
MAAXSAMXMSMSAMXSMXMXAMAMMMXMMMXSMSASAAMAMAXXAAAMSAMAMAAMMAMSAMMAAAXAAAXAXMMMMMMMSXMMAAAAAASMSMSMAMSAMXMXSSMXAMAMMMAXAXAXXXAMASXXSSMMMSSMSSMS
MMSMSXMAMXMMXMAMMSMMXXAMXXSSXSASASAMMXSAMSSMMSMMSMSMSASXXAMMMMSXMXSSSMSMSMAAAASMMASMMSAMMMMAMAMXXXASMMSAAAASMMAMAXSSSXSSMMASASMXAXAAAAAAAAAS
MMAAXAMXXSAMXSSMASMAMXSXSSMASXAMMMMMXMXAMAAXXAXXSXSASAMMMSSMMASMMMXAXXAAAMMMSASAXXMAAAAXMXMAMAMMMSMMXAMMSMMAAMMXSMMAXAMAMSAMAXAMMXSMMXSSMMMS
MSMSMMSAMXAMAMAMAXMASMMAMXMXMMSMSAMSXMSSMSSMMSXXMAMAMAMSAAAXMASASMMAMSMSMSMAMXSAMSMSMSSMSASASASAAXXXMMMMAAMSMMSAMASAMXMAMXMMXMSXSAXMAXMAMMAX
AAXXAAXAXMAMXXAMXXMASAMSMMMSMAXMMAMMAMAMMXAMAXSMMSMSMXMMMSSMXXSAMXMAMXAAAAAMXAMMMAAXAAXASXSAXXSMSMMXMXSSMSXAAAMASMMMSXMAMAXMXXXAAXSXMASAAMAM
SXXMMMSXMMSXMSSSMMMASXXAAAAAMAMMMSMXAMASMXAMXMASAAXMSMXMAXAAXMMMMASAMMSMSMSSMAXMXMXMMMMAMMMMMMXMXASAMAMAAXMMMMSAMMASAASASXSXSAMMMSMMXXMAMMAS
AMSXSAMXSAMXAAAMAMSXMASXXMMSXSAAAXASMSXAMMXXAAXMXSMMAXMXMSMSMXAXSXSASAAAAXAXMAMSMSMXMMXXXAAAXXAMXSMXSASMMMXXAXSXAMMXMAMXAAAAXAAXXXMASMXSAMAM
XMAXMASAMASXMMSMSMSASXXMASXMAMMMMSASAAAMXASXMSMSMMASMMMAMMAMASAMMASAMXSSMMMSMSXSAAAASAMXSMSSMSASMAAASXSAMAMSMMMXSSSSXSMSMMMMMXSMXMMASAAAAMXS
SAMXSAMXSMMXMAXXXASXMXAMXSAMAMXXXMXMXMMXMMAAAAAAASAMXMSASMAMXXXAMMSMMAMAMXXAMMAMSMMMSAAMMMMAMSAAXMMMSASXMAMAAAXAXAAMAAXAXMAXSXMMSAMXMMMMXMXM
MAXAMASXSAMXSASXMAMXSXMAMMAMMMXMMXXXSMSXSMSMMMSMMXXSAMSASXMXAMXMSAMXMXSAMSSMMMAMXSXMXMXSAMSAMXMAXMAXMMMMSSSSSMSXMMMMSXSSSSSSMXAAMXMXSASMMMMS
SXMASMMMSAXXMASAMXXAXASMXXMMXXMSAAMMMMAMSAXAAXXXXSMMAMMAMMSMSSXAMXMXXAXAMMAMXSAMMAMSAMASAMXASMMSMSMSSXAASAAXXAAMMXMAXMAMAMXAMSSMSAAAMAAMAAAX
MAMAMASASAMXMAMXMMMMSAMXXSSSSXAMXMMAAAASMAMSMSMSMMXXXMMMMASAAAMMMSSSMSMSMSMMMMASXAMMMMASAMSSMXAXXXMXMSMSMMMMSSMAAXMXXAXMXMSAXAAASMXXMMMSSMSS
MMMASMMAXXAMMMSMMMAASXMMMAAAMMAMXMMMMSMSMSMXXMASAAASMMXSMASMMXAAAAAXAMAMMMAAMMMMMXSXXMASAMMXAMXMMMMAMSXAAXMAXAXSSXSMXSXSMASXMMSMSASMXSMAXXAX
SASXSXMMMSXXMAAAASMMSASAAMMMMASMSSMSAXAXAAMMSSSMMMXSAMMMMXXAXXSSMXSMSMAXAMSMSASASAAXMAXSAMXMMMAAAAXAXXAXXMMXSAMXAASAMAAAMAMAMAMXMAMXAAMASXMM
AMSAMXMMASAMXSSSMSMXSAMXSXXMXSAAAAAAAMAMMMSAMXAMXMXSXMAMXASXMXMAAXMXMMXSMMMXSASASMAMSXAMAMMAMSSXSSSSSMMSAAAXAMXMMMMSAMXXMASXMASAMSMMAMMXXAAA
SXXAMXMMAXAAMAMAMXAAMAMXXMAMXXMMMMMMMMXMSAMASXMMAXMSASXXMAASMSXMSMXAXSASXSAAMXMXMASMXXXXAMAMXAXMXAXAAMAAXMMSAMMXSXXAXXMXXAXAMXSAMAAMMXMAXSMM
ASXSMXMMSSMXMAMAMMMASAMXMSMXXSXMAXAXMXAAAASAMAASASASXMAASXMXXAAXAXSMMMXMASMXXAMXSAXXSMMSMSSXMASMMSMXMMMXXMXMAXSAMXMMMAMXSSMSMMMMSSMMMAMSMXAA
MAMAAXXAMAMASMSSMMXMMASXMAMXMASASXSSMMSMSAMXSSMMMMAMMMMMMAASMSSMMXXXASAMXMMMSSSMMASAMAXMXAMXMSAMXMASMSSMSSSSMMMASMAAMAXAAAAXMAAAMMSXSAAAASXM
XXMAMMMXXAMAAAAAASXMMMMMSASXMASMMXXAXXXAMXMAMMMXXMXMAMXMSMMMAAAAXSASAXXMMAXXAAAAMAMXMSMSASMMXMAMXMAMAAAAMXAAAXSMSMMSMSSSMMMMSSSMSAAMSMSMXMAA
XXASASXASXMSSMMSMMAMASXXSAXXSAMASXSSMMMMMAMXMAMXMMAMXMAAXXXXMMXMMXAMMSSMSAMMMSMMMASAXMAMMXAXAMAMSMMXMXMMMMSMMXMAMMSMAMAXAMXMMMXAMMMXXAXMASXM
XMAXAAXMASAAXMAXAXXMAMAAMAMXMXMAMAAAMAAMSXSSSSMASAMMSAMXMASMXSXMXMXMMAXAAAMXAXAAMXSAMMSMXSAMASAMAAAMSASASAAAXMMAMSASMMAMMMAMAXMXMSMSMSMMMXAA
SXAXXMMXAMMSMMMMAXSMSXSAMAMXAAMSMMMMMSXMXMAXAAMASAAASASAMMMMAXMAMSAMXMMXMMMMXSSMMMSAMAMXAXAMXSXMSSMXSASAMSSSMMSMSMAMXMXMMSMSMSAMXAAXAAAMSSMM
AMXSSMXMXMSAMASMXMMAXAMXSXSMMMXMAMMXXXSSMSMMSMMMXXMASMSASXAMXSMMMMSAAXMMMAXMAXASAASXMXXMSSMMXSAXMAMXMMMAMAMAMAAMXMAMXMSSMSAXMAMXSMSMMMMMAASX
MAXAMXAMMMMASAXAMXMAMAMAAAMXSAMSSMAAXMASAAMMMMSSMXMAMMSAMMSSMMMSAAXXXXMASMSXMMAMMMMASMSMMAMXAXMMSAMXMXSAMXSAMSMMASASAMAAAMXMMSMMXAAXXAAMSXMM
XSMXXSXSAXSAMXSSXMASXXMXSXXAMAXAMXXMMMMMMMSAASAXAXMXSAMAMAXXMSASMSMASMMMXAAXXMAMSASXMAAMMAMMMSXXMAMSAMXMMXMXMMXSAXXMMSSMMMMSAAASMSMSSSSMMASA
SXSAAMMSAMMXMAMXASAMXSMMMAMSSMMSSMSMSAAMMXSMSMMXSAMAMXSAMXSMXMASAMXMMAMAMXMMXMSXSASMASMSSXMAAMXMSXMAMMAXMAMMMMXMMSMSAMXMAASMMSSMAAXXXAMAMAAS
SASMXMAMXMAXMAXMAMXSAMXAMAMAAMAMAXAAXSMSAASXXMXAXAMAXMMAXMAXAMAXMASXSSMAXSAMXAMXMMMXMAXAASMMSSSXSAMSMSSSSSXMAMXAAAXAMASXMXSAMXMASASMMXMAMMMA
MAMXMSSSSSSSSSSMSMMMXSAMXAMXMMASMMMSMXMXMASAMXMXSASXSMSAMSMXXXMXXASXMASAMSAMXSSSXAAXSMMMSMMAXAMASAMMAXAAXAASASXMMMSAMXSAXASMMAXMASXAXMSXSSSM
MAMAAXAAAAXAAAMAAAAAMMASMXMASMXSMMMAAXAMXAXAMAAXSAMXAASXMAMMSAMSMXSASXXXMMAXAXAMMMSXMXMSMMMSMAMAMAMMAMMMMSMMASXASAMXXXSAMXSASMSXXMMMMMMXMAAX
MAXXMMMMMMMMMMMSSSMSSXAAMXXMXMAMAAMMXXSSMMSAMXSAMXMMMMMXSXXASAMXMMSAMMMMSSSMXMMMASMMXAXMAXAMXXMXSAMXXAMAMXAMAMMMMMSMAMMASXSAMXMXAMAMXXXAMSMM
SSSMMAXAXXXSMSXMAAAAMMMMXASXMSSSMMSMSMMAAASXMXMXMAXAXSSMMSMASXMAMAMSMAAAXAXAAMASMSAXXMSSMMSMMMMXAASMSSMAMSAMMSMSAMAAXXMAMMSASAMMSSSSSSSMMAMX
XAAASXMMMAAMMSAMXMAMXMASMMSAAAAMMSAMAASMMMMMMASMSMSSXMAAAXMMMMSASASMSXSXMXMSASASXSXMSMAAAAMAAAMAMMMAAAXAMAMXAAMMASMSMXMAMAMMXAXAAAAAAAMSAAMX
MMMMMMASMSMXAMXMAMXXMSAXAASMMMMMMSASXXMAXXASMXMAMXAMASXMMSMAMASMSXSAMXXXMMXAXMAXAMMAAMSSMMSSMMMMSMXXMSMXMXSMMSMSAMXMASMMMSSSSSMMSSMMMMMAMSMM
ASXSMSASAAAMSSMXXSAAXMSMMMSXMXMAXSAMXMMSMSXSAXMMMMASXMASXXXAMASASMMXMAMAMSXMAXSMASASMXMAXMMMMSMSAMXSAAAASASAXAAMASXMMMAMXMAMAMMMAMMXXXXMAXXA
SXAAXMASMMMMMAXMASMSMAMXMASASXSMMMSMMSMMASASAMSMSAAXMMXSXASMSASMMMSMMASAMAMXMAMXXMAMXSXAMMAAAAMXAMAAMMSMMASMMMSMSXMAXSAMAMAMAMASAMMAMXSMXMAX
MMMMMMAMXXXASAMMAMAXMAMAMAXAMAXSXAXMAAAMSMXMAMAAAMMMSMAMMXMMMMSASAAMSASXSAMAMMSASMAMAMMMSSSMSSSSSMSMXMAAMXMAAXAXMASMMAMSXSXSXSMSASXXXASMSSSM
SAXMASMMXASXMAXMSSSXMSSSMSMSMMMMMMMSSSSMMMAXAMMSMXSAAMSSSSSMSSSXMMXXMASASXSXSAAAMMMMMSMXAAAAXXMAXAMASXSSMMMSMSMSMXMMAMXMASMMXSXMXMASMMMAAAAS
SMMMXMAASMMMXSMAXAMASAAAAXAMXSAXSAAMMAAMXXSSSSMXXAMMASXAAAAAXASAXMXMMMMMMMMXMXMSMXSAMAAMXSMMMSMAMXMASAMAXAXAAAAAAAXMAXXMAMASAMMXSAAXAAMMMXMM
MAAXAXMMSAAMAXMMMAMXMMXMMMASXXASMMXMMMMSXXMAXMXSMASMMSMMMSMMMSMMMMMMAAAAAAXAMXXAAASASMSMMMASAMMXSMSAMAMMMMSMSMSMSMSSXSXMASAMAMAXAMXMSMXSSMAX
XSXSSSMASXMMMMASMMXMAXXXXMSMASXMXMMSSMASMMMAMMASMAAAAXXXAXXXSXSXAAASXSSSSSMMSAMXMMSAMMAMXSAMAXXAXAXXMAMXAXAXAMXAAXXMMMAMAMXSMMSMMSMXMMSAXSXM
MMXAAMAMXXXMXMAMMXAAASMMAXXMAMMAXXAAAMXMAMXMMMAXMSSMMSXMMMMXMASXXXMMXAMMAMXSAMSAXXXMXSAMMMAMXASMMMMMSMMSSSMSAMXXXSAAAMAMASMSXXXAXAXAAXMMMMXM
XMASMMSAMXMXSMMSMSAXMAAXSSSMSSSMMMMSSMSSSMMSXMMSAAAAAXMAMASAMXMASMSSMSMMAMSXAMSMSMAMXMAXMMAMXMAXAMAMASAAAAMAMASAAXMAMSASMMMXMMSMMMSMSMMXMMAA
ASAXXAMAMASAMXMAMMMMMSAMXAAAAMAAXXAMAMAAXMAMAMSSMSSMMSAXSASASAMAMAAXAAXSXSSMMMXMAMAMMSMMSSMSMXMXXXASMSMMXSMMSAMMAMAXMSAMAXMMSAAAMXXAXAXAAXAS
MMAXMXXAXSMMXXSASXSAAXMMMMMMMSSMMMAMAMMXMMSSSMXSAAMAMXXXMXXMMMMSMMMMSSMMXXXAAAASASXMXAAAMAAAXAXXMSASXSASAAXAMXSXMMMMAMMSMMXAMXMMMMMMMSSSSSMM
MMSMMSMXMMASAASMSAMXSXMXASXSAXXAXMASMSXAMMAAXSSMMMSMXMASMSSSSXAAAAXMAMMSSSSSMSMSXSAMSSMMSMMMSASAAMAMASAMSSMXSMSMSAASXMAAXAMSSSSSSXSAAXXMAAAX
XAXAAMMMASAMMMMAMMMMAAMSMSASXMSMMMMAAMXXSSMMMXMAMXMMAXMASAAAXMSSXMSMASXAAMAAAXAMAMAMAAMMAXXXXAXMXMAMAMAMXXXXAAXXMSXMAMSSMMAXXAAAMAXMXXAMSMMM
MMSMMSXAMMMMXXMMMXMMMSMAAMAMAAAXXMMXAMXXMMAMMMSXMASMSSSXAMMMMMMXAASMASMMSMSMMMASMSSMSXMMAMMMMSMMMSASASMMMAMSMMMSMMMSMMXAMXSXMMMMMMMMAMSAMXAA
XXAAAXMSXSMSSXSAMXSAAAXXMMAMMSMSASMSAMXAXSAMAAAASMMMXMAMMSXXXSASMMMMAMAXAMXMAMXAXAXAXMMMXMAAAMAAAXASASXAMAMAMAAAAAAAMXMAMAXASASXAASMASAAMSSM
XSSSXSAXASAAXXMASASMSMSSXSXSXAMAAAASAMSMMSXSMSSMMMSSSSMXAAXMAMMSMAMASXSSXSXSSSMSMMSAMXSAMSSSSSMMSSMMAMMXXAXASMMXSMSMSASAMASMMXSSSXSSXSAMXAMA
XMAAAXAMMMMXSASAMAXXXMXMAMAMXXSMSXAMAAMAMXMSAMXAXSXAAMXMMSSMAMXXXAXAAAXMASXAAXAAAXMXMAMAMAAAAAMMXXXAAMMMSSSMSXSAAAAMSMSXMAXAMAMMMMMMMMAXMASM
MMMMMMXMXAXAXAMSSXMSSMAMAMAMMMXMMMXSMMMAMXAMSMMSMAMMMMAASAXXAMXMXSSMMMMMAMMMMMMXSXMAMXMMMSMXMASMMSMXMAXMAMAAXAAMMMMXSAMXMSSMMAMAAXAMXXXMMAMM
AAXMASAMXXSMXMAMXAMXASMSXSXSXXAAXSMXASXSSSSMAXXMMMASMSASMXXMXSXSAMXMASAXMAMSAAXSMMSASMXXAMXXXXAXAAXMXSMMSSMMMSMSSXXAMAMMMXAXSASXXSAMXXSAMAAX
SMXXAMASXMXXSXSXSMMSMMMMMMXMAMMSASAMXMAXAAXSSXSMAXAMXMMAMMSSXSAMSSXSASXMAMXXXXXAAXSASAAMSMSMMSMMSMMSAMXAAAASXMAAXAMXXSMMSMMMMASAASMSAMSAMXSM
XAAMXSMMAXSAMXMASMXXAAAXSSSMXSAMXXMAMMMMMMMAXAXSMMAMAMSASAXMASMSAMXSAMMSMXMXSSSSXMXMMMMMMAMAAAXMMXAMASMMSSMMAMMMSMXMSMAAXAAAMXMMMMXMAMSAMAXM
AMSSMAMSXMMAAMMAXMXMSSSMAAAAAXXSAMMSXAAAAMSAMSMSXMAXAXSAMASMMMXMAMAMAMMAMMMMAAMXXMXXMMSXMAMSSMSAMXXXAMXMAXASXMAMAMASASMMSSSSSMXXMMMSSMXAMXMX
SXAAMAMMMXSMMMSAMXSMAAMMMMMMMMMXAMXMSSSSSXMASMAMMMMXMMMXMASASMMMSMXMAMXAMAAMMSMMAMAMMAAAMSMMAAXMMSSMASMMAMMMMXAXASMSASMXAMAMAAMXXMASAMSXXXXX
MMSSMXSXXAXASASASASMMXMMXSXASASXSMXXAMXAAXSXMMSMSASASXSAMMSMMXMAXASXSSSSSSXSAMASXSASMMXSMAASMMSXAAAMXMASXSAAAXSXMSXSAMXASMAMXSAMXMXSAMAMMMMS
MAMXMASMMSSMMASMMASXSMSAASMXSXMAAMMMSSMSMMAMXXAXSASASASMSMMXSAMXSAAAAMXMAMAMASAXASAMXMAXMXMMAAXMMSSMXXXAASMMSMMAXXAMXSXMXSMSXMMMMSASAMMAAAAA
MASAMASXAAAAMAMMMSMAXAMMXMAXXMMSMMAAMXXAXMASXSXMMMMAMAMMAXXXMAMAMXMMMMAMAMMSMMASMMSMAXMMAMSXMMSMMAXAMXMMMMXXMASMMMXMAAAXAXXMMMAXAAAMXMXSSSSM
SASXMASMSMSMMMSXSAMXMSMSMSXAAMMMXSMMSASMXMAXMAXSAMMSMXMSASMMSSMMSSMMMSXSASXSASAMXAMSXMXMSMSASXAASMMMAAXXXXXXMAMMASAMXMXMMSXMAMSMSMSSMXXMAMAX
MASAMXSMMXXAMXSMSASAMXAAASMMMMAMMMXSMAMMAMMXSAMXAMAMAMAMAXAAAAMXAXAAMMMXMXXXAMXSASMMSAXXMASAMSSXMAXMSXSXXMASMAMSSSXSSSMAAMXMAXXAXAMAAASXMSSM
SAMXXMSASASASAMAXSMAMMMMSMAXMSMSAMSAMXMXAMMMMASMSMMSAMMMSSMMSSMMSSSMSXAXSSSMAMAMAMAAXSMXMXMXMXMAMMMXAASMSAMXMAMMAMAXAAXMMMXXMXMAMXMMSMMAXAMX
MAXMAXSAMASXMAXAXXXAXXAMAMMMMMXSASMMSMSSMXAASAMMMAAXASXAAMMMAAMXAAAAXMMSMAXSAMASASAMMXXMMMSMMAXAMXSMSXSAXXXMXMXMAMXMXMMXASMAMSMMMAXXXXSSMSSS
SAMASMMXMAMMAMXSSMSMXSASASMSXSAMXMMAMMXAASMXMXSXSMMSMMMMXMAMXAMMMSMMMMMAMMMSXMXMXSASAXMAMAAAMMSSXXMAXAMXMSMSAAMSSMAMMAXSAXSAMXAAMMXMXMXAAAAA
MASMMAAXMASAMXAMAAAMXXAMASMSAMXXXMMASMSMMMMAAAMMMMMAMXSSXSXSASAMXAAAAASMMXXMASASMSAMXSASMSSSMXAMXSMSMMMSXAAMMMMAAMASMMMAMMSMSMSMSSSXAMSMMMSM
SAMXSMMXMASASMSSSSSMMMMMXSAMSMMMSSSMMMAAMASMMAXAAASASXAXAAASAMXSSSSMSAMXSXAASAMXAMXMAMXMXXMAMMASASAAAAAXSMSMSAMXSMXMAAXMMXXXSAAAAAMXXXAMXMAX
MMSASAXXMASAAAAAAAMAAAXMAMXMMSAASASAXXMXSASXXMAMSXSASMSMMMMMAMMMAMXXMMXMAXMXXMXMSMAMMMAMXMMMXSSMAXXAXMSMMXXAMASAAAASXMMXMAMAMSMMMXMASMMSSSMS
SMXAXMMSMASMMMMSMSSSSSSMASXMAMMXSAMXMMSAMXSMMMSAAXMXMAMSXAXAMXMMMMSXSSMSAMSASXMAXSMSSSMSMSAXASAMXMXSAMXAXAMXSAMMSMXAMXSAMAMXXAXASXMMSAXXAAAA
MMMSSMAXAMSAXMXXAAAAAAAMASMSMSMAMAMXMAMASMMXSAMMAMXAMSMSSMXXMAXAXXXAAAXMAMMASXMAXAXAXAAAAMASMSXSXMAMMXSXMSSMMXMAXMMXMASAXXSMSXXXSAAXSXMMSMMM
SXAMAMXMMXMASMMMSMMMSMMMMMAAAAMASAMMXAMSMXAAMAMXAASMSMMMSMASMMSASMMMMMMMAMMXMAMXMMMSSSMSXSAMXMASMMMSMAMMMXAMXAMXSMSXMASMMSMMXSSMSMMMMAAXMXXX
AMSSMMXMSAMXMAAAAXXAAXXSXMSMSMSASASXMSSXAMMMSAMSMMMMAAAAMXXSAAMAMAAXMXSXXSMMSSMAAXAMXAAAAMXMAMXMAMXAMASASXXMSXSMAXSMMMSAMXAAAXMASAMASXMMMMAM
MXAMXMAMAASXSSMMSSMSSSMXAXMAMMMAXXMAAMAMXMAXXMMMXAAXSSMSXMAMMMMXMSMMMASXAMXMAAXSMMSSSMMMSMMMXXSSMMSXMASAMXAXAASMSMMAAAMXMSXMASMAMAMMSMMAMAAX
XMAMAAXXAXAMXAASXMAAMAMXMMXMXSMSMXMMMMASXMASXSAMMSSMXXAAXMAMMMMMMAMXMASMSMAMSSMXAAXXMAXAAXMASMMAXASMMMMXMSMMMSMAXASXMMSAXMAMSAMXSSMAXAXAMSSS
AXSSSSMMMMMXSXMMMMMMMAMMXSXMMXAMMSSMMSAMXMASMMAXXAMXMMSMXSAXAAAAMASAMMSAAXXMAAXSMMSASAMSSXSASASXMMSAMXASMAMXMAMMMXMAAASAMXSMXXXMAMMSMXXAMAMX
SXMAAMAASASXSAXSAAAXMMXSAMASAMXMAAAAAMAMXMAMAXAMAMXSAXAAMSAMSSSSSMSASAMMMSMXMAMXAXXAMXMAAAMASXMAAASAMMMMSMSSSMSMSSMMMMMSAMXAMXMMAXAAAMXSMMSS
AXMSMMMMSASASMMMSASMXSAMASAMMSXMMSSMMSXMXMMSSMMMXSAXSXMSMMXMAAMMAMXMMAMAXAMMSMSAMXMAMXMMSMMAMXSMMMSAMXMAMXAAAAXAAXASAMXAMAMAMSXMMMMSSXAMXXXA
MXAMASAAMMMMMMXXAMMAAMMMMMXSXMASAAMAMSXSAAAAAAXXAMXSMXXMXMMMMMMSSMSMSMSMSMSAASAXXAAAMAXAMASXSASXMASMMXMSSMMMMMMMMXXXAAMMSSSXMXSAASAAMMMSAMAM
XMAXAMMXMAAAAXMMMSMMMMAAXMASAAMMMXXSMSASMSMSSMMMSSSXMAMMAMMMSAMMXAXAAAAAMAMMSMMSXSMSSSMMSAMMSASMSAMXXAXMAMASXMSAXXSMSMXXAAXMAAXXAMMMMMXAAMAX
MSAMSMMSSSSSXSAAASASAXSXSMAXMMMXXXAXAMAMAXXMAAXAAXMASXMSSMSASMSMMMMSMXMSMAXXAAXMXXAAMAAAMMSAMAMXMASXSMMSAMASAASMSMSAAMXMMMMSMSSSSMSAASMSSSXS
XMAMMAXXMAMAXXMMXSAMAMMASMSSXXMASMAMAMSMMMASMMMMXMSAMXMAXMMASXAMASAMXXSXXMMMXSMMAMMMMSMMSASXMMMMSSMMMMAXXMXSMMMAAAMSMSAMAMAAXXAAMAMSMMAMXMAM
XXAMSAMMMSMMMMSMMMAMXMMAMAXMASMASMMMMMXAXXMMMMAXMAMASXMSSXMMMMMSAMMMSMSAXSASXXMMAXMAMMXMSAXXSAAMXMSASXSSSSMSAAMXMSMXXSMSAMSASMAMMAMMSMSMSMSM
SSMMXMAXAMAAASAAAXAMXSMMMXMMASMMMAXMMAXXMMSAMSAXSASAMXAAXXSAMXXMMXAXAAMAMMASAAXSAMSASMMMMSMXSSSSMMXSXAMAAMASMMSSMXASASASXMAXSAMMSAXMAXAAAAAM
XAMAMMSMSSSMXAXSMSMSXSAXMMMSASAMSAMXMASMAXSAMMAMSAMXSXSMSASASMMASMMSMSMXMMAMMSMMAMMASAAAAMMAMXMXAMMXMMMMMMMSMXMASMXMAMMMSMSXMAMAXXMSMSMSMMMX
SAMXSMAMXAAXSMMMAAXXASXMAAAMMMAMXMMMMAMMSMMXMXMXMSMMXAAXXMSAMXMAMAASXXMASMXMAAXXSMMSMMSMSMMASXMXAMXMASAXXMAMMXSAMMSMXMXAAXMASMMSSXMAXAAAXMSS
SAMXMMAXMSMMAXASMMSMXMMSSMSSXSSMMSAMMASAAXXAMASAAAMMMMMXXXMXXAMASMMMMMMASXSMSMXAMAXAAXXMXXSASAASMMMSAMMSMMMSAAMAMXASASMXSAMMMAAMAMSAMMSMSAAX
SMXASXSSMXXAXMXXAAXMAMXMAMAMXAXAASASXMSMMASMSASMSMMXSAMXMASMSMSXXMAXMSMASXXXMASMSXMMXMMMMAMAXMMMMAXMAMXAAMXMMXMAMXMSXXAXMXMMSMMMSAMXXXMASMSM
SMMXSAMXAMXSSMXSMMMSAMMSMMASMMMMMSMMXMSASMAAMAMMXAXAMAAMSAMAAAXAMMMMAAMMMMXAMXMXAMXSAXAAAXMASMSMSSMSAMSMSXXXSMSSSSXMMSMMMSMXAMXXMMXSAAMAMXAA
XXAMMXMMXMAMAXMAXSASXSAMAMSSMAAAASMASMSAMXXMAMMXSMMMSMXXMAXSMSMSMASXSMSAAXMXMAXXXSMSASMMMSAXXAAAMMAMMXAAMMMMMAXAAMXMAAAMAAMXAMXXXXASMSMAAXXS
AXSXXAXAAMASAMMSXMASXMAMSMAMXSSXXSMASXMXMASXSSMXXAAAAXMXXXMMSMAXMASAAXSMXSASXMXSMMAMAMXAASXMMSMMSMSMMSMXMAXAAXMMMMAMSSSMMSSSSMMMSMMSAMMSSSMM
SAMXSMSSXSXSXMXAMMAMMMXXXAMXAMAMSMMMSASXMXSAMXMASMMSSSMSAMXMAMSMSXMXMMXXASMXAMMXAMSMAMXMMSAXAAASAAMAMXSAAMSXMSSXAMXMMAAMXAAMMAAXMASMMMAAAAXM
MAXAAAAXMMMMAXXMSMASMMMAMAXMAMAMAAMXXAMAXXMMMSMAXAAXAAAXMMAMMSXMASAMXAXMASXXSMASXMMMASMMMMMMXXSMMXXAMASXSXXXASAMXMMAMXMXMMSMSSMMSXMAAMMSSMMS
SSMMMSMSMAAXAMXMAXASAAXXSXMXMSSSSSMMSSMMMMSMSAMMSMAMMMMMXXAMXMXXMASXXXSAMXMSMMMXMAXMAXMASXSAMSAMXSSXMAMSAMXAMMAMAMSXMMSXXXMMXAXASXSXMSAMAAXA
MXAAAAXSMSSSMSXMAMSSMSAAMMMMXAAAAXAXAMASMXAXSAMXAXXXXASMMMXSAAXMXXMMMMAXXSXAXXMASMMMSSSMSMMAXSAMXXASAMXMMXAMASXMAXASMASXMMMXSMMMSASAXMMSSMSM
MSXMSMXMXXMAMMASXSXMAMMXMAAASMSMMMSMMSAXASXMXMMSXSMMSMSAXAASMMMMSMMAAXMMMMMMSAMXXMASAAAAXAMXMMAMXSAMXMMAMMSSMXASMSAAMASASMMASAMAMAMMXMAMMAXX
MAAMAMSMSSSMMSAMMMAMXMXAMSSXSXAAXXXAMMMSXXMASMMSAXXAAXSAMSMXAXSAXASMXSAAXMAXMXSXMASMMSMMMSMMMXMMMXAMXMAAMAAMXMMMMMXMAMSAMAMMSAMMMMAXAMAXMSMM
MMSMASXAAMAXMMMSASMMXMSXXAXXMXMXMMXMMAAXXAMXMAASASXSXXMAMXASMMMXXXAAXSMMSSMSAMMMMSXSAXMMAXAXXASASMAXSMSSSMMSSSMXAXASXMMAMXSXSAMXMSMSMSAXSAAA
XAAXXMMMMSSMXAXXMAAASMMSMMSSMSSMASASXMXSXXMXSMMMAMXAMSSMMXMAMAMAMMMXMSAMXAASXSAAMXAMXSAMASAMSMSASXMMXAAMAAXAAAXSXSASXMMAMMAASXMAXAAAXAASXMXS
MSSSSXMXAAAMSMSMMSMMMAAAXAXAAAXAXSASAMXSXSAMXAXMXMXMMXASXXSMSAMAXXAXSXMSSMMMASXSSMSMMSMAMMXMMAMAMMSMMMMSSMMMMMMXMSAMAMSMSAMXMASMSMSMSMSMXXSM
AXAAXMASMXAMAAAXMAAXSMMMMASMMMSMAMAMASXMASXXXXXMASXXSSMMMAMAXXXMXMMSXAXMASMMAMMMMAMMMMXMMMMSMAMAMAAMAAMMAMMSAXXAMMAMSMAAMXXAMXMXMAXAMXAAAMAM
SMMMMAAXMASMMSMSSSSXSMAMMMMAMXMMAMAMMSAMAMMMMSMSMSXMAMAAMAMMMSMXAAMXXAMSMMXMAXAAMAMMAMAAAAMXSMXMMSSSMSMXAMASASXSSSMMASXSSSSSSSMASMMAMSMSMMMS
XAAXSMMSSXMAAXAAAXMAMMSAAASAMMAXXMASAXXMASAAXXMAAXXSSMSMSMSAXMAMSMSAXMMASMASXSSSSMXSASXSSMSAMXMSXMAXAAXSSMMSAMAMMMSMASXMAAXXAMSASASXMXAXXXXS
XSXXAMAMXAMMMMSMMMXMAAXMSMSMSMSXSMXMMSXMXSASXMSMSMMMMAAAAAXXSMSMAAMMMXSASMXSMAMAMAXMASXAXAXMMAMAAMAMMMMMMAMSMMAMAAMMAMAMMAMMXMMXSAMXSMMMXSAS
MXMMMSMMMSMSAMMAXAMXMXSAXXMMAMXASAAAAAAMXSXMAXSXAMSAMSMMMSMMMAMAMXMMAMMAXMXXAAMAMAXMAMMMMSMMSXSMSMAXAXSXSAMXASXSMSSMMSXMXMMMAMMMXMMMSAAAMMAM
AXAAXAAAAAXSASXSMSAAXMMMMASXXXMAMSSMMXSMAMAMXMSAMXAXMXXMAMXAMMMAXAXMSSSSSMXASXMSMSAMAMAAAAAXXXXAMMSMMMAASMXSAMXXXMXAASAMXMASAMAMMXXXSSMSMMXM
MMMMMSSMXXXMMMAXAXSMMMAAMAMXMASAMXMASAMMAXSASXSXXAMMMMSAMXSMSASMSSSMAXAAAASXMSXMAMMSASXMSSSMMMMMMAXASAMXMAASXSMMMMMMMXASASASMSMSAMSMXXMAMSAM
XMXSAXMAMSMSSMMMSMAXASASXMXSAAXAMSAAMAMMAMXAMAMMMSXASAMAMMSAMASXAMAMMSMMMMMAAMMMAMXMMSXAXXXAAAAAMAMAMXSAMXMXAXMAAAMAXMXMAMASAAXXXAMMAMMSXSAS
XAAAXSAASAAAMASAMXSMXSAXASXMMMMAMAMSSSMMSMMAMXMASAAASXSAMMMSMAMMSSSMAAXAXXSMMMASAMAMXSMMMXSSSSSMSAMAMXSAMMXMAMXMMMSASAAMXMAMMMSMMMASXSAMXSSM
XMAMMMXMSMMMSAMMSXMSMMMSAMXMAMSAMASXAXMAXAMXMAMMMMMMMASASMAMMXMXAMAMSSSMSMMXXSMSASASAMAMMAMMMAAASMMSSMXXMXAASMMSAMXAMXAMXMAMSASAMXAXXMAXASMS
SSMMSXMXXXSXMXXMAMMASAAMAMAMAXMAMXSMAMMASXMSSXSASXSXXXMMAMAMSMSMMSMMAAXXAAASMMMSASAMMSAMMASAMMMMMAAMAXSMXXASXAASAMMMMXMXMXSAMASASMAMXMSMMMAM
MAAASASXMMAAXSMSAMMAXXMMAXXMSXSAMMMMMXMASAXXAASAMAMXMSMXAMAXAAXMXAXMMMMSSSMSAAXMAMXMMSAXSASASXMAMMMSAMXAMSMMMMMSAMAMAMSAMXXMMXMAMMMAAAAAXMAM
XSMMMXMAAASMMSAMAXMSMSMSMSAXAASASAAAXXMASMSMMMMMMAMASASMSXSAMXMXSSSXSAAAMXMMMMSMAMSMASAMMXSXMASXSAXMXMAXMAAXXSAMXSASAMMASASXSSMMMMXSMSSSXSSS
MXASXSSSMXAMAMXMAMSMAAAAASMMMXMASMSMSMXXSAMXAXMASXSMSAMXXAMXMASAAAAASMSXMASXMASXAAAMMXMXXAMASAMXSAMSASASXXMMXMASXMMSASXSMASAXSXXAXXXMAMXAXAM
MSAMAAAAXSMXSXXXXXAAMMMMMMSSMMMXMMMMMMMMMXMSMSSMAMAMMMMAMMMXMAMMXMMMMXMAMAXAMASXSSSSXSXSMXSAMASXMAMMXMASMMSAXSAMMSMSAMXAMMMMMMSSSSMMSMMXSMSA
MMMMMMMMMASAMXAMXSMSSXXXMMMMAASASAXAAAMAAAXAAMAMMSSMAAMXSASMMSSMXMSXMSSSMSSMMXSMMAAMAAAXXAMAMXMAMMMXSMMMAXSAMSASAAMMAMXMASAXAAAXXAMAAAXMXAXA
XAXXAXXXXAMMXSMAMXAAAMAMAAAMSMSASMSSSSSMSSSMSMXSAMXSXSAASMSAMAAXXMASMAAAAXAMAASMMMMMMMSMMSMSMSSSMAAMXAAXSMMAMXAMMMMXAMXXASXSMSXSSXMMXMMAXMXX
SMSMXMMMMMSXMASXAMMMSAXMSSSXMXMAMXMMMMAAAAAAXMXXAMAMMMMXSXSAMSSMXSASMAXMMMAXMMSAMXXAXAAAXAAMAMAASMSSSXMXMAMSMMXMMSSSMSXMASMXMAAMMMSSMMSSMMSM
AXAXAXAAAMAAAMXSMMSAXXXMAMMMXXMXMAAAAMAMMSMMMMMSMMAMXAXXMAMAMXXAAMASXMSSXSAMMXMMMMXMMSSSMMSMAMXMASAAAXSASMMMAXSAAAAAAMXSAMXMMMMMAAAAAAAAAAAA
MSMMMSXMXXAXMSAXMASMXSMMASMMXXMAMXXSSSMSXXXXAAAAXSAMSSSMMXMSAMXMMMAMAMAMXSXMMASXMMAMMXMAMXMXXMAXMMMSMMMAXMASAMSAMMSMMMAMASMMMSMSMMXSMMXMMSSS
MAXAMSMSSXSAAMASMXSAASXSASAAAXSSMSMMAAAXXXXSSMXSMSMMMXAXAMXXASXMAMASAMAXMMAMSMSAMSSSMASAMMMXMXXSAMAAAXXXMMXMXMXAMXAAAMASAAAMXAAXAXXMXSMSMAAX
SASXAXASAAMXMASMXAMMMSAMXSMMXXAAASMMSMMMMXXMAXAMMXMAXSMMMMMSXMASASMXAMMMAMAMSAMXMAMAXASXSAMXMAXMAMSSSMMXMXXMXMSSMXMMASAXMSXMMMMMSMXXAXAAAMMM
MASXMMMMMMMAMSMMXXSMAMAMMXMAXMMMMMAMASXAMXSSSMMSASXSXMMXAAXSMSAMXMASXMSASMASMAMAMXSAMXSMXASAMSMSAMAMAASAMSXMAAAXMASMASAXMMMMASAMAASMMMSMSAMS
MAMMXAXAXXSAMAAAAMXMASAMSAMXSSXAAAMMAMSASAMXAAAAXMAMXAASXSMXAMSSXMASAASAMSXMMAMXSAMXSXSASXMASAASMMAMSAMASAASMSMXSASMAMAMAAMSASASMSXAAAXSXMSX
MMSASMSMSASXSSSMMAMSXSASMXMXSAMSSSXMXXSXMXSSSMMSSMXMAMASAAMMXMMSXMSSMMMSMXXMAXSAMXXSAMXXSSSSMMXMXSSMXMSMMMXMMAMXMXSMASMSMXMMASMMXMMSMSSMMSSX
Binary file not shown.
+97
View File
@@ -0,0 +1,97 @@
--- Day 5: Print Queue ---
Satisfied with their search on Ceres, the squadron of scholars suggests subsequently scanning the stationery stacks of sub-basement 17.
The North Pole printing department is busier than ever this close to Christmas, and while The Historians continue their search of this historically significant facility, an Elf operating a very familiar printer beckons you over.
The Elf must recognize you, because they waste no time explaining that the new sleigh launch safety manual updates won't print correctly. Failure to update the safety manuals would be dire indeed, so you offer your services.
Safety protocols clearly indicate that new pages for the safety manuals must be printed in a very specific order. The notation X|Y means that if both page number X and page number Y are to be produced as part of an update, page number X must be printed at some point before page number Y.
The Elf has for you both the page ordering rules and the pages to produce in each update (your puzzle input), but can't figure out whether each update has the pages in the right order.
For example:
47|53
97|13
97|61
97|47
75|29
61|13
75|53
29|13
97|29
53|29
61|53
97|53
61|29
47|13
75|47
97|75
47|61
75|61
47|29
75|13
53|13
75,47,61,53,29
97,61,53,29,13
75,29,13
75,97,47,61,53
61,13,29
97,13,75,29,47
The first section specifies the page ordering rules, one per line. The first rule, 47|53, means that if an update includes both page number 47 and page number 53, then page number 47 must be printed at some point before page number 53. (47 doesn't necessarily need to be immediately before 53; other pages are allowed to be between them.)
The second section specifies the page numbers of each update. Because most safety manuals are different, the pages needed in the updates are different too. The first update, 75,47,61,53,29, means that the update consists of page numbers 75, 47, 61, 53, and 29.
To get the printers going as soon as possible, start by identifying which updates are already in the right order.
In the above example, the first update (75,47,61,53,29) is in the right order:
75 is correctly first because there are rules that put each other page after it: 75|47, 75|61, 75|53, and 75|29.
47 is correctly second because 75 must be before it (75|47) and every other page must be after it according to 47|61, 47|53, and 47|29.
61 is correctly in the middle because 75 and 47 are before it (75|61 and 47|61) and 53 and 29 are after it (61|53 and 61|29).
53 is correctly fourth because it is before page number 29 (53|29).
29 is the only page left and so is correctly last.
Because the first update does not include some page numbers, the ordering rules involving those missing page numbers are ignored.
The second and third updates are also in the correct order according to the rules. Like the first update, they also do not include every page number, and so only some of the ordering rules apply - within each update, the ordering rules that involve missing page numbers are not used.
The fourth update, 75,97,47,61,53, is not in the correct order: it would print 75 before 97, which violates the rule 97|75.
The fifth update, 61,13,29, is also not in the correct order, since it breaks the rule 29|13.
The last update, 97,13,75,29,47, is not in the correct order due to breaking several rules.
For some reason, the Elves also need to know the middle page number of each update being printed. Because you are currently only printing the correctly-ordered updates, you will need to find the middle page number of each correctly-ordered update. In the above example, the correctly-ordered updates are:
75,47,61,53,29
97,61,53,29,13
75,29,13
These have middle page numbers of 61, 53, and 29 respectively. Adding these page numbers together gives 143.
Of course, you'll need to be careful: the actual list of page ordering rules is bigger and more complicated than the above example.
Determine which updates are already in the correct order. What do you get if you add up the middle page number from those correctly-ordered updates?
Your puzzle answer was 5948.
--- Part Two ---
While the Elves get to work printing the correctly-ordered updates, you have a little time to fix the rest of them.
For each of the incorrectly-ordered updates, use the page ordering rules to put the page numbers in the right order. For the above example, here are the three incorrectly-ordered updates and their correct orderings:
75,97,47,61,53 becomes 97,75,47,61,53.
61,13,29 becomes 61,29,13.
97,13,75,29,47 becomes 97,75,47,29,13.
After taking only the incorrectly-ordered updates and ordering them correctly, their middle page numbers are 47, 29, and 47. Adding these together produces 123.
Find the updates which are not in the correct order. What do you get if you add up the middle page numbers after correctly ordering just those updates?
Your puzzle answer was 3062.
Both parts of this puzzle are complete! They provide two gold stars: **
+37
View File
@@ -0,0 +1,37 @@
#!/usr/bin/env python3
import sys
from functools import cmp_to_key
if __name__ == '__main__':
lines = [line.strip('\n') for line in open(sys.argv[1])]
rules = [tuple([int(y) for y in x.split('|')]) for x in lines[:lines.index('')]]
updates = [[int(x) for x in line.split(',')] for line in lines[lines.index('')+1:]]
def compare(a,b):
for rule in rules:
if a in rule and b in rule:
return -1 if a == rule[0] else 1
return 0
res1, res2 = 0, 0
for update in updates:
correct = True
for i, u in enumerate(update):
for u2 in update[i+1:]:
if compare(u,u2) == 1:
correct = False
break
if not correct:
update.sort(key=cmp_to_key(compare))
res2 += update[int(len(update)/2)]
break
if correct: res1 += update[int(len(update)/2)]
# challenge 1
print(f"challenge 1:\n{res1}\n")
# challenge 2
print(f"challenge 2:\n{res2}")
+28
View File
@@ -0,0 +1,28 @@
47|53
97|13
97|61
97|47
75|29
61|13
75|53
29|13
97|29
53|29
61|53
97|53
61|29
47|13
75|47
97|75
47|61
75|61
47|29
75|13
53|13
75,47,61,53,29
97,61,53,29,13
75,29,13
75,97,47,61,53
61,13,29
97,13,75,29,47
+1371
View File
File diff suppressed because it is too large. Load diff
Binary file not shown.
+195
View File
@@ -0,0 +1,195 @@
--- Day 6: Guard Gallivant ---
The Historians use their fancy device again, this time to whisk you all away to the North Pole prototype suit manufacturing lab... in the year 1518! It turns out that having direct access to history is very convenient for a group of historians.
You still have to be careful of time paradoxes, and so it will be important to avoid anyone from 1518 while The Historians search for the Chief. Unfortunately, a single guard is patrolling this part of the lab.
Maybe you can work out where the guard will go ahead of time so that The Historians can search safely?
You start by making a map (your puzzle input) of the situation. For example:
....#.....
.........#
..........
..#.......
.......#..
..........
.#..^.....
........#.
#.........
......#...
The map shows the current position of the guard with ^ (to indicate the guard is currently facing up from the perspective of the map). Any obstructions - crates, desks, alchemical reactors, etc. - are shown as #.
Lab guards in 1518 follow a very strict patrol protocol which involves repeatedly following these steps:
If there is something directly in front of you, turn right 90 degrees.
Otherwise, take a step forward.
Following the above protocol, the guard moves up several times until she reaches an obstacle (in this case, a pile of failed suit prototypes):
....#.....
....^....#
..........
..#.......
.......#..
..........
.#........
........#.
#.........
......#...
Because there is now an obstacle in front of the guard, she turns right before continuing straight in her new facing direction:
....#.....
........>#
..........
..#.......
.......#..
..........
.#........
........#.
#.........
......#...
Reaching another obstacle (a spool of several very long polymers), she turns right again and continues downward:
....#.....
.........#
..........
..#.......
.......#..
..........
.#......v.
........#.
#.........
......#...
This process continues for a while, but the guard eventually leaves the mapped area (after walking past a tank of universal solvent):
....#.....
.........#
..........
..#.......
.......#..
..........
.#........
........#.
#.........
......#v..
By predicting the guard's route, you can determine which specific positions in the lab will be in the patrol path. Including the guard's starting position, the positions visited by the guard before leaving the area are marked with an X:
....#.....
....XXXXX#
....X...X.
..#.X...X.
..XXXXX#X.
..X.X.X.X.
.#XXXXXXX.
.XXXXXXX#.
#XXXXXXX..
......#X..
In this example, the guard will visit 41 distinct positions on your map.
Predict the path of the guard. How many distinct positions will the guard visit before leaving the mapped area?
Your puzzle answer was 5212.
--- Part Two ---
While The Historians begin working around the guard's patrol route, you borrow their fancy device and step outside the lab. From the safety of a supply closet, you time travel through the last few months and record the nightly status of the lab's guard post on the walls of the closet.
Returning after what seems like only a few seconds to The Historians, they explain that the guard's patrol area is simply too large for them to safely search the lab without getting caught.
Fortunately, they are pretty sure that adding a single new obstruction won't cause a time paradox. They'd like to place the new obstruction in such a way that the guard will get stuck in a loop, making the rest of the lab safe to search.
To have the lowest chance of creating a time paradox, The Historians would like to know all of the possible positions for such an obstruction. The new obstruction can't be placed at the guard's starting position - the guard is there right now and would notice.
In the above example, there are only 6 different positions where a new obstruction would cause the guard to get stuck in a loop. The diagrams of these six situations use O to mark the new obstruction, | to show a position where the guard moves up/down, - to show a position where the guard moves left/right, and + to show a position where the guard moves both up/down and left/right.
Option one, put a printing press next to the guard's starting position:
....#.....
....+---+#
....|...|.
..#.|...|.
....|..#|.
....|...|.
.#.O^---+.
........#.
#.........
......#...
Option two, put a stack of failed suit prototypes in the bottom right quadrant of the mapped area:
....#.....
....+---+#
....|...|.
..#.|...|.
..+-+-+#|.
..|.|.|.|.
.#+-^-+-+.
......O.#.
#.........
......#...
Option three, put a crate of chimney-squeeze prototype fabric next to the standing desk in the bottom right quadrant:
....#.....
....+---+#
....|...|.
..#.|...|.
..+-+-+#|.
..|.|.|.|.
.#+-^-+-+.
.+----+O#.
#+----+...
......#...
Option four, put an alchemical retroencabulator near the bottom left corner:
....#.....
....+---+#
....|...|.
..#.|...|.
..+-+-+#|.
..|.|.|.|.
.#+-^-+-+.
..|...|.#.
#O+---+...
......#...
Option five, put the alchemical retroencabulator a bit to the right instead:
....#.....
....+---+#
....|...|.
..#.|...|.
..+-+-+#|.
..|.|.|.|.
.#+-^-+-+.
....|.|.#.
#..O+-+...
......#...
Option six, put a tank of sovereign glue right next to the tank of universal solvent:
....#.....
....+---+#
....|...|.
..#.|...|.
..+-+-+#|.
..|.|.|.|.
.#+-^-+-+.
.+----++#.
#+----++..
......#O..
It doesn't really matter what you choose to use as an obstacle so long as you and The Historians can put it into position without the guard noticing. The important thing is having enough options that you can find one that minimizes time paradoxes, and in this example, there are 6 different positions you could choose.
You need to get the guard stuck in a loop by adding a single new obstruction. How many different positions could you choose for this obstruction?
Your puzzle answer was 1767.
Both parts of this puzzle are complete! They provide two gold stars: **
+81
View File
@@ -0,0 +1,81 @@
#!/usr/bin/env python3
import sys
from copy import deepcopy
import numpy as np
def show(maps):
st = ''
for line in maps:
print(''.join(line))
def find_guard(current):
move = (0,0)
for y in range(0, len(current)):
for x, field in enumerate(current[y]):
if field == '.' or field == '#' or field == 'X': continue
elif field == '^': move = np.array((0, -1))
elif field == '>': move = np.array((1, 0))
elif field == 'v': move = np.array((0, 1))
elif field == '<': move = np.array((-1, 0))
guard = np.array((x, y))
return(guard, move, field)
def guard(m, guard, move):
next = {(0,-1): '>', (1,0): 'v', (0,1): '<', (-1,0): '^'}
nextm = {(0,-1): (1,0), (1,0): (0,1), (0,1): (-1, 0), (-1,0): (0,-1)}
current = m
while (0 <= guard[0] + move[0] < len(m[0]) and 0 <= guard[1] + move[1] < len(m)):
gx, gy = guard
guard = guard + move
x, y = guard
if m[y][x] == '#':
current[gy][gx] = next[tuple(move)]
return current, True, np.array((gx, gy)), np.array(nextm[tuple(move)])
else:
current[gy][gx] = 'X'
current[guard[1]][guard[0]] = 'X'
return current, False, np.array((guard[0], guard[1])), np.array(nextm[tuple(move)])
def test_loop(m, x, y, g, move, o):
current = deepcopy(m)
current[y][x] = '#'
positions = set([])
positions.add((g[0], g[1], o))
running = True
while running:
current, running, g, move = guard(current, g, move)
o = current[g[1]][g[0]]
if (g[0], g[1], o) in positions:
return True
positions.add((g[0], g[1], o))
return False
if __name__ == '__main__':
maps = [list(line.strip('\n')) for line in open(sys.argv[1])]
sguard, smove, start = find_guard(maps)
# challenge 1
running = True
current = deepcopy(maps)
g, m = sguard, smove
while running:
current, running, g, m = guard(current, g, m)
res1 = sum([m.count('X') for m in current])
print(f"challenge 1:\n{res1}\n")
# challenge 2
res2 = 0
for y in range(0, len(current)):
for x, field in enumerate(current[y]):
if field == '#' or field == '.': continue
res2 += test_loop(maps, x, y, sguard, smove, start)
print(f"challenge 2:\n{res2}")
+10
View File
@@ -0,0 +1,10 @@
....#.....
.........#
..........
..#.......
.......#..
..........
.#..^.....
........#.
#.........
......#...
+130
View File
@@ -0,0 +1,130 @@
................#.................#.#...........................#.#..................#............................................
..........#................#...........#...................#.#....................................................................
....#......#......#............#.#........#..........#.......#.......#...#........#..........#.........................#..........
..................#............#.....##...............#..#.....................#...........#......................................
#.........#.............................................................#........#............#........#.....#...#...........#....
.....#...#......#..................................................#........#..................#......#.......................#...
#.................................................#......................#......#...................................#.............
...#.#...#.....................................#.......................#.........#..................................#....#........
..............................................#..............#...#...........##..........................#.......#............#...
........#.#.......#.................##.......................#..........#...........................#...#.........................
.................#..............................#.................#............#....#.....#.......................................
.................................................................#......#............#.#.#..................#.....................
.#..........#......#...#.......#..........................#....................#.#.............................#..................
...............#.....##.......#..#...###......#......................#.................................#.#......#..#..............
#.....................#......................................#..........#...............#........#...............#...#.#..........
.......................................#..................#.........................#.............................................
.......................#...............................................................#........................#...........#.....
......#....#..........................................................................................#..........#................
........#.......................................#..........................#.............##.........#............#.#.........#....
......#........#........................................................#..........................#..............................
....................#.................................................#.....................#......#..#...#....................#..
...........#....................##.....#...#............#...#......................................#.....#.......#.........#....#.
#..............#.................#......#..................#...................#......#...........#...............................
.......#.......#.........................................#.....#..#.................................................#..........#..
..#..................#.......................#..#..#...#..........................#.........#...##......#..........#.#..#.........
..#.........#....................#...........................#....................#..........................#................#..#
......#.....................................................#..#.......#.............#...................#......................#.
.....#..................................................................#...#.....................#......................#.#......
......#..............#...................................#.......................#...................................#...##.......
...........#..........#....................................................................#........................#.............
#.......................................#..........................#........#......#......................##......................
.............#...#..........#......#..........#.#......................................................................#..........
........................................................#....#...#......##..........................#..........#..................
.#...#.....#..........#....#...........................................#........#....................................#............
....#....................................##.......#...........................................#.......#...........................
...........#.............#........................................................#...#................#........#.................
.....#.#........................................#....................#.........#..................................................
.........#............#..............................#...#..............#...........................#...............#.....#.......
......................#........................................#.#..........#...#..#......................#.......................
##...........#..............#......#....................#..........................#.......................#.......#.......#......
....#..#.........................................................#.....#..#.........................................#.....#.......
....#......##................#......................................#.......................................#..................#..
..............................#............................#..................#.......#.......#..................#...#............
......................................................#............................#..............................................
.......#.............................#......#.................................#...................................................
..................................................................................................................#...............
.......................#.....#...........##........................................#..............................#...............
..........................#................................................................#..................#...................
..........................#..................#........#..............#.#..#...................##..................................
..................#............................................................................................#..................
.......................#..........#...##................#.........................................................................
...............#.....................................#............................................#...............................
....#..................................................................................#........#.................................
..#................#.....................................................................#...#....................................
..........#.............#.........#......#................#......#.........#........#.......................#.....................
..........................................................................#.................................#.....#....#.#........
....#..........#......................................#......................................................#.......#....#.....#.
.....#...............................#............................#........................................................#......
.............................................................................#.......................#....................#..#....
................#.............................................................#...................................................
.....#................#.......#....................#............#.......#.....#.................................#.................
...........................................................................................................#.#....................
.....#...............................................#...................................................................#..#.....
................#..............................#.............#.#..............................................................#...
..#............#...................#..................................................................#...............#...#....#..
..........#...............#...............#............................................#......#...##........#..#..................
......#..###..........................................................................................#................#..........
..........#........#.....#.......................#.........................................#.#........#.#.........................
.....#............................................................#.....#..........................#..............................
...............................................................#..............#........................................#..........
.................................................#....#...#....................................#..#........................#......
.................#..........#......#......................#.......#...................#.#.........................................
.#............................................................................#..............#..............................#..#..
..#........#...#..........#.................#...#...................................................#...#............#............
...........#.......#..#...............................................................................#...........................
.#.#..#...........##...................#...................................#...........#...............................#..........
......................................................................#............#.....................................#...#....
....#............#.#.#................#............#....#...#......#....................................................#.........
.......................................................................................#.....................................#....
.......................................#..................#........#................................................#.............
.........................................#.....#..........#.......##..................................#................#..........
..............#.............#............#..........................................................#.............................
.#...................#...#..........................................................#........#........#..........................#
..#..............................#.....................................#.................#.............#...........#..............
.................................#........................#.#....#......#....................#....................................
.#..................................................#.....#............................#..........#..................#.......#....
.....................#.......................^............#...#...#..............#................#...............................
.........#....................................#....................#...........#...........#..............#...................#...
............................#...........#....................#.............#.......#.......................#...#....#.............
............#.................#...........#..................................................................#............#.......
...........#....................#.................................................#......#.#....................#.................
..............................................................#..........#........#....#.........#................................
...............#.........#......#..........#.#.............................................................................#....#.
...............##...##..........................................................................................#.................
..........................#.#...........................#......................#...............#..................................
.....#...#..................#...........#....#.........#............................#.............................................
.........................................................................................#...................#...#................
............#.....................#...........#..................................................................#................
.#.............................#............................#..........#......##...................................#.#............
............#.........................................#...............................................#.#....#....................
.........................................................#..#.#...............#......#....#........#..........................#...
............................#..#.................#................................................................#...............
............................#.........................................................................#....#..#............#..#...
....#........#....#....#..#..............................#...#......................#.......................#............#........
..#...............#............................................................................................................#..
#.......................#...#............#..................................................#.........................#...........
.....#.................#..#.............................................#...................................................##....
...............#....................................#................#.........................#.#...........................#.#..
.................#....#....#..............#....#.#....#...............#......................#...............#..................#.
...........#...............................................................................#....#.................#...............
...............#............................................###.#.#.#........#...................................#....#...........
................#.................#........#............#..............#.....................#.............#......................
....................................#.....................................................#....#..................................
..#..#.............#......#.#..................#........................................#..........#...#..........................
...............#........................#...............................#.............#...................#..#....#...............
......#...........................#..............................................#..............................#...............#.
...........#..............#................#....#..........#................#.......#..............#.........#.................#..
......#....................................................................................................#......................
...........#.............#...............#..........#....#.#...##..................#....................#.........................
.......................................................#.#.....................................#..................#.......#.......
...............#...............#...........................................................................#..................#...
...............#......#.........#..................#.............................#..............................#.................
...............#..........#..#.......#.............#............................#.#............................#..................
..........#................................#..#...................................................................................
..#................#............#........#...................................#...............##.................##....#.......#...
..#.....................................................................#.............................................#.#.........
#...#...#.......................##............#..............#.........#......................#........#.#........................
..............................#......#.......#.........#...#..#.......................................................#.#.........
.#..................#.#................................#..........#.......#..........................#............................
...............#.....................#...#..........................................#..........#......#...........................
Binary file not shown.
+54
View File
@@ -0,0 +1,54 @@
--- Day 7: Bridge Repair ---
The Historians take you to a familiar rope bridge over a river in the middle of a jungle. The Chief isn't on this side of the bridge, though; maybe he's on the other side?
When you go to cross the bridge, you notice a group of engineers trying to repair it. (Apparently, it breaks pretty frequently.) You won't be able to cross until it's fixed.
You ask how long it'll take; the engineers tell you that it only needs final calibrations, but some young elephants were playing nearby and stole all the operators from their calibration equations! They could finish the calibrations if only someone could determine which test values could possibly be produced by placing any combination of operators into their calibration equations (your puzzle input).
For example:
190: 10 19
3267: 81 40 27
83: 17 5
156: 15 6
7290: 6 8 6 15
161011: 16 10 13
192: 17 8 14
21037: 9 7 18 13
292: 11 6 16 20
Each line represents a single equation. The test value appears before the colon on each line; it is your job to determine whether the remaining numbers can be combined with operators to produce the test value.
Operators are always evaluated left-to-right, not according to precedence rules. Furthermore, numbers in the equations cannot be rearranged. Glancing into the jungle, you can see elephants holding two different types of operators: add (+) and multiply (*).
Only three of the above equations can be made true by inserting operators:
190: 10 19 has only one position that accepts an operator: between 10 and 19. Choosing + would give 29, but choosing * would give the test value (10 * 19 = 190).
3267: 81 40 27 has two positions for operators. Of the four possible configurations of the operators, two cause the right side to match the test value: 81 + 40 * 27 and 81 * 40 + 27 both equal 3267 (when evaluated left-to-right)!
292: 11 6 16 20 can be solved in exactly one way: 11 + 6 * 16 + 20.
The engineers just need the total calibration result, which is the sum of the test values from just the equations that could possibly be true. In the above example, the sum of the test values for the three equations listed above is 3749.
Determine which equations could possibly be true. What is their total calibration result?
Your puzzle answer was 4998764814652.
--- Part Two ---
The engineers seem concerned; the total calibration result you gave them is nowhere close to being within safety tolerances. Just then, you spot your mistake: some well-hidden elephants are holding a third type of operator.
The concatenation operator (||) combines the digits from its left and right inputs into a single number. For example, 12 || 345 would become 12345. All operators are still evaluated left-to-right.
Now, apart from the three equations that could be made true using only addition and multiplication, the above example has three more equations that can be made true by inserting operators:
156: 15 6 can be made true through a single concatenation: 15 || 6 = 156.
7290: 6 8 6 15 can be made true using 6 * 8 || 6 * 15.
192: 17 8 14 can be made true using 17 || 8 + 14.
Adding up all six test values (the three that could be made before using only + and * plus the new three that can now be made by also using ||) produces the new total calibration result of 11387.
Using your new knowledge of elephant hiding spots, determine which equations could possibly be true. What is their total calibration result?
Your puzzle answer was 37598910447546.
Both parts of this puzzle are complete! They provide two gold stars: **
+31
View File
@@ -0,0 +1,31 @@
#!/usr/bin/env python3
import sys
def maths(nums, sec=False):
if len(nums) == 2:
yield nums[0] * nums[1]
yield nums[0] + nums[1]
if sec: yield int(str(nums[0]) + str(nums[1]))
else:
yield from maths([nums[0] * nums[1]] + nums[2:], sec)
yield from maths([nums[0] + nums[1]] + nums[2:], sec)
if sec: yield from maths([int(str(nums[0]) + str(nums[1]))] + nums[2:], sec)
if __name__ == '__main__':
lines = [line.strip('\n') for line in open(sys.argv[1])]
res1, res2 = 0, 0
for line in lines:
test, nums = line.split(': ')
nums = [int(n) for n in nums.split(' ')]
if int(test) in maths(nums): res1 += int(test)
if int(test) in maths(nums, True): res2 += int(test)
# challenge 1
print(f"challenge 1:\n{res1}\n")
# challenge 2
print(f"challenge 2:\n{res2}")
+9
View File
@@ -0,0 +1,9 @@
190: 10 19
3267: 81 40 27
83: 17 5
156: 15 6
7290: 6 8 6 15
161011: 16 10 13
192: 17 8 14
21037: 9 7 18 13
292: 11 6 16 20
+850
View File
@@ -0,0 +1,850 @@
426048: 425 608 69 88 1 282
1234: 8 53 21 2 611 1 538
3493064: 42 823 101 932 966
7851123: 81 52 937 7 9
109137611815: 9 4 9 1 9 5 13 97 18 1 4
143516213: 2 906 6 5 12 22 578 3 3
629453: 7 492 3 28 6 6 9 104
5423661: 5 2 8 8 91 4 6 7 3 40 8 6
18682395: 93 37 3 1 431 765 2
556488358421: 794 98 33 6 917 7
14604120: 89 13 65 703 17
51347: 24 9 908 8 9 3 6 36 41 6
1200264: 1 324 69 614 9 34 52
84467: 99 1 694 50 64
832680: 3 58 68 45 3
13238: 4 3 58 9 652
1505251: 3 24 97 1 29 669 5
28869324: 99 749 1 46 74
125890: 6 894 7 6 87 9 2
265251: 8 9 8 87 251
928664914: 4 7 6 8 664 8 2 9 1
103228624: 7 2 73 7 94 91 95 26
5765376: 442 85 4 41 8 742 8 4 8
101551004: 2 78 991 38 75 8 4
11531: 4 42 589 122 1
230639: 88 6 3 722 3 9 1
533796498: 66 80 3 2 101 4 5 2 501
8494148: 32 35 79 2 8 3 30 2 8
222246692: 23 41 13 94 970 689
9841934: 2 998 419 815 5 809
2186556: 51 9 9 660 4 2 9 8 69 7 3
11207789126: 1 9 425 1 68 5 9 2 293 9
33355203: 7 199 5 84 119 57
60424: 989 61 79 8 8
651253: 3 4 904 8 2 8 72 87 493
2099106644: 277 842 9 624 22
29145931: 3 6 15 3 7 9 70 6 1 1 6 5
63140: 8 79 61 77 82
720845730: 9 3 43 1 53 45 650 81
3030: 45 57 85 280 5 94
64316066: 7 6 7 422 14 953 37 4 2
31898201: 77 74 3 622 3 797
99024982725: 48 77 1 3 47 8 1 30 846
3086415: 5 139 1 6 1 8 2 24 2 3 6 9
1604915280: 2 7 652 74 321 7 18 4
1040: 316 22 7 3 4
792201: 748 7 22 488 99 493 4
1449102: 23 525 6 4 4 5 82
6672: 8 1 563 7 9 593 863 1 4
641235: 18 5 76 3 87 8 8 93 15
836: 399 2 31 7
2589888404878: 4 8 94 21 41 40 4 8 77
79158297957: 221 570 58 29 795 6
94656: 64 547 254 223 87
158670130: 2 9 3 4 32 2 645 2 6 5
1172900: 5 624 9 5 3 69 38
18570144924: 6 3 570 144 926
11809188: 63 26 801 77 7 9 90
17569711116: 9 9 2 2 156 793 3 109 4
72864: 8 2 3 1 5 3 99 8 4 72
30090677155977: 38 89 11 5 217 41 9 79
54186: 5 418 6
536456640: 1 53 273 27 3 1 35 52
1324: 568 47 2 45 5 2 40
255466537: 98 49 133 4 82 56
108593: 440 931 5 635 54
274562: 18 4 88 12 3
2310: 168 125 6 551 1
158226796: 4 2 1 71 56 18 67
227860: 632 36 2 68 5
254276307: 211 927 13 62 57 90
969151: 96 75 1 79 6 608 1 856
1381920960: 329 7 7 6 4 3 5 51 5 4 3 8
57750433: 466 22 1 43 6 1 131
2039463: 8 532 4 2 2 4 3 59 245 1
924: 4 2 42 57 2 23
984: 9 5 1 3 4
3490: 32 9 8 5 7 7 18
764789: 47 91 3 83 341 2 942 4
8761312983: 1 5 1 645 2 56 981
49375245: 46 16 94 4 67
1371731088: 258 80 58 98 119 1 6
1691074: 3 653 36 8 2 4 61 153
237984: 3 60 942 4 84 514
8487: 3 836 6 3 7
1302665: 8 327 850 4 8 848 637
338504789434: 9 7 96 4 27 58 1 7 7 431
4375: 5 320 13 87 62
39114592: 24 74 32 3 53 53 8 58 9
55211: 1 2 5 261 3 6 6 3 873 6 5
3930310: 6 727 89 883 77
105416741: 8 6 2 7 830 2 7 81 29 72
1864306: 752 37 67 22 76
10308245: 460 6 22 56 243
8724688: 61 143 1 688
802716549428: 81 991 6 5 494 30
4542460: 5 11 52 818 924
3187936924: 8 9 54 879 356
63545: 1 459 7 429 71
117919: 9 76 202 28 91 1
3743973: 74 82 5 41 5 269
861952: 57 558 68 7 2
3334911: 668 16 39 8 255
66798536: 27 9 931 6 92 65 3 3
8653262: 4 82 5 326 2
658062508: 5 97 94 2 5 6 9 3 55 6 7
22128516: 111 222 898
1200278: 40 5 6 269 1 8
8492254: 465 206 452 28 74 6
3976640: 97 49 2 8 340
6598260668: 7 20 3 459 9 9 9 66 8
349711968: 699 417 1 4 1 9 50 4 4 8
4360998090: 46 474 98 40 5 9 586 2
38968452095: 4 8 59 12 7 172 6 592
7435934408: 521 8 34 8 32 2 2 2 7 79
3601746: 772 4 711 1 61 7
1037835487: 2 33 58 143 836 7
5238563720270: 5 238 5 5 4 9 720 27 2 5
73195290: 1 5 3 442 4 46 2 7 74 9
39219: 7 612 3 676 2 9 5 58 3 3
171333389699: 63 45 681 1 9 868 3 96
5938: 5 554 315 59 8
26921: 93 28 3 36 843
462492: 370 38 563 73 443
372492502: 9 1 521 5 407
252499564: 6 1 676 72 5 91 736 44
9089304: 8 405 786 1 28
22290929687: 18 8 255 512 849
496884960: 62 9 691 5 3 52 2 418 1
52469758: 7 21 96 244 80
1915494: 72 667 81 32 1 5
9240: 10 4 9 8 48 21
1229174: 39 965 1 6 16 2 676 73
63520233: 629 6 20 20 2 31
40053664: 520 36 298 72 207
31513519: 5 63 13 52 1
73259497328: 105 380 5 4 81 92 2 82
380149: 5 2 9 59 84 52
3532752: 75 6 40 8 7 9 1 4 7 7 48
735865836: 2 63 65 3 220 42 58
1036899: 1 972 63 89 6
119723575: 885 89 2 8 95 775
3394585738: 1 14 571 49 3 218 264
43184: 9 47 91 47 18 728
49179361: 3 2 358 1 27 7 8 5 1 35 1
60589: 51 9 55 8 31
3853: 376 9 454 6 9
97218628: 727 238 7 1 5 3 562 67
573: 3 18 8 47 306
2673281: 37 17 850 5 31
2519097323: 4 4 5 97 433 8 9 95 142
6282472: 46 1 691 942 3 472
1997842: 25 474 46 4 4
21463827009: 6 23 2 74 68 7 1 540 5 6
52876: 55 96 7 3 3
5458: 97 56 11 8 8
306: 4 93 5 1 3
2246440404358: 35 2 97 944 68 53 358
2156122429948: 627 6 8 625 3 796 3 1 9
705471450: 257 448 47 1 450
12086441200083: 60 4 322 5 3 8 5 5 20 86
95185977895: 98 5 36 209 966
66643: 1 3 7 1 6 43
243331: 233 9 57 6 756
12661228256: 590 33 4 6 7 5 4 774 8 4
1100: 141 1 952 1 5
10510801045: 69 2 2 9 86 5 9 1 76 28 3
9888464534: 77 6 246 98 7 74 967 5
361718875114: 2 97 4 725 12 1 5 186 6
106512316: 40 7 2 8 449 818 536
7588010: 64 694 772 1 291
991: 23 4 7 1
417: 6 45 7 75 65
15920852: 55 93 8 8 3 3 5 8 5 7 8 9
699: 4 8 55 43 589
35097279829: 4 6 2 2 7 9 58 9 5 7 982 9
108684: 5 6 2 62 283 1 6 4 9 2 1 6
35276: 28 575 4 57 677
8895075: 5 175 18 8 8 171
40618: 7 219 38 7 558 54 46
55909321: 4 4 4 6 3 2 41 705 8 3
176390408: 496 6 61 6 8 3 64 5 2 5
407788355: 40 778 7 603 3 747
102608197: 81 5 348 5 7 26 1 4 237
8020532: 9 9 9 1 969 8 4 5 8 884
2581035: 66 5 388 83 7
802185122: 561 993 4 360
3277848705: 9 6 53 9 95 6 7 11 7 6
134464957445: 1 493 1 9 495 74 44
229748861160: 67 46 3 205 234 518
2940111322: 37 12 917 589 22
18670960793: 9 6 5 3 9 8 261 3 1 46 4
1142150721: 5 16 55 5 212 5 5 2 18 3
22196443505: 815 786 45 77 4 1
573211: 2 377 7 24 18 9
4843: 3 6 9 44 4 82 8
302249666485: 3 194 57 134 54 717
662063: 5 3 2 1 624
132572: 6 8 36 82 57 2
3864582: 2 3 24 7 582
1690: 102 691 4 128 765
1209: 19 8 7 7 96
126089845: 7 5 8 5 98 736 3 7 9 1 7 6
46487320: 7 1 664 7 249 71
39486: 46 405 1 87 160
2736552: 3 28 8 83 7 28 537
2172301065: 63 91 618 3 55
523522: 93 1 67 362 522
986428764: 985 978 446 4 722 43
12315880: 9 29 96 8 470
3984391: 39 843 92
5689708: 5 4 5 7 7 576 6 157 6 19
64505661: 64 1 505 397 262
227515138: 227 5 1 513 5
215361445: 3 83 63 820 93 86 2 46
34003007060: 651 993 2 526 60
16267: 920 7 1 2 834 6 58 69
267374268991: 6 89 73 9 8 826 8 71 59
112166154: 10 2 93 5 66 155
135: 9 1 5 42 43
11248: 70 1 423 8
2911500: 7 1 379 10 647
65618: 984 65 686 971 1
1423917: 23 24 26 9 18 1 3 99
1436633024645: 2 84 134 9 2 9 9 8 79 8 2
280912: 935 3 3 62 52
102593598: 442 2 326 89 3 4 1 7 75
38611: 3 9 503 9 6 7
36060: 5 8 1 16 4 601
28487: 73 691 6 37
721930973: 72 18 830 479 70
36324778803: 800 100 3 2 26 454
70492231245: 571 990 211 5 591
801607886: 2 79 33 888 80 7 886
15442400: 28 69 999 3 72 157 8
354682: 8 40 1 3 5 5 4 8 3 18 9 1
11718044: 9 180 31 20 43
2292878: 7 56 82 229 425
8686510: 37 390 2 64 1 9 291 4 3
47239: 2 77 52 4 9 9
23755253: 2 3 1 14 707 19 10 22 1
20814560: 68 8 44 536 1 3 2 4 2 2
431195040: 3 579 696 74 1
29632103424: 32 66 6 7 6 62 898
3417: 8 81 2 28 869
10513496180: 211 3 56 7 2 6 7 135 47
4575903869: 45 6 2 3 9 1 903 8 6 9
481562: 2 15 946 50 5 9 3
23919714428: 27 8 335 3 2 6 39 4 2 6
7227024325: 393 870 603 211 22
113705615: 16 7 76 94 561 4
36627744: 31 879 122 467 76
9682305217682: 3 1 3 8 5 9 739 1 1 835 1
1883: 19 215 8 1 14
310865765704: 4 5 93 47 8 3 6 8 5 703 4
65640: 2 3 9 5 671 1 89 9 3 9 3
34615688: 8 581 1 9 1 6 5 699 4 90
2874960: 136 2 372 936 55
125692: 11 4 89 28 2
21607840833966: 9 9 950 1 75 96 871 39
23335608: 45 75 54 7 51
6234: 20 18 819 73 6 654
250181: 92 8 4 338 50 7 4
38566354: 9 7 120 611 37
62704469: 2 8 9 71 5 66 44 5 6 10
385850: 5 8 8 7 2 8 63 6 3 678 3 2
115032285: 8 150 96 7 913 15 21
24871: 8 3 270 600 1
77113465: 7 555 723 1 6 7 465
6231: 5 8 5 956 5
388: 4 291 1 18 4 72
63870451184: 1 1 3 2 911 508 8 293
961: 5 9 1 8 4 9 87 5 10 5 26 1
651002: 2 861 685 2 84 5 2
2999: 9 328 41 3 3
697540864632: 38 79 4 2 726 8 4 316 2
13399549: 3 1 11 73 8 59
3562090: 866 1 6 83 674
7828907: 74 2 706 87 2 10
2386854: 1 2 6 68 78 5 2 4 3 5 5 4
81760686: 706 5 7 1 6 6 2 7 2 19 87
214797: 8 9 3 421 8 1 3 4 1 9 42 9
54427336: 30 712 8 173 53 79 73
1053341344949: 65 569 3 712 238 4
1448736525566: 160 97 9 6 4 6 8 57 563
2123419597390: 606 83 8 9 9 6 6 9 7 393
123978240: 336 8 4 9 4 6 8 7 7 2 8 60
35148535: 2 7 4 48 565 8 4 2 8 9 5 2
204124802990: 9 630 13 340 36 7 583
539960: 44 66 196 25 960
37179596269: 5 9 63 806 153 6 267
46944: 256 517 694 4 8
164447918604: 3 3 5 68 2 239 59 3 20 1
606512067: 202 5 85 25 2 1 7 4 6
582: 6 82 4 78 1 8
358489335615: 4 8 36 290 49 3 356 12
37968920318: 619 787 27 6 9 203 1 8
45917891663: 6 97 6 743 4 91 665
56974260612: 681 192 73 598 894
1433362936: 23 81 301 2 938
13387282062: 71 5 209 7 382 7
1440477: 3 9 37 3 66 4 2 667 58 9
54297: 87 359 12 77 5 2 7
45930136: 75 180 3 3 8 378 104 8
15415060: 60 9 86 5 795 94 115
152568: 9 1 61 5 68
27460988: 2 74 60 488 501
1057969: 284 4 4 93
2426020: 856 7 13 202 2
49096: 6 5 24 2 68
9219: 345 9 3 85 8 23 15 5
502450092967: 1 142 17 6 6 1 85 589
252469069: 478 8 7 1 57 8 66 59
24272: 1 8 8 7 4 752 9 6 1
156972819: 21 9 858 968 3
4435814457: 77 9 8 8 6 1 14 460
7029: 57 3 5 6 971
7053569543: 70 52 914 2 653 531 9
19649102: 9 7 9 5 22 545 4 839 94
267089242: 3 5 3 83 8 2 342 7 29 5 7
93765: 40 945 53 957 47
815253659: 48 97 581 700 8 52 7
14381: 70 1 91 2 1
6727770: 8 5 1 2 7 47 96 2 4 2 9 38
488959: 12 7 770 5 7
444850: 57 3 7 68 6 350
359101435530: 819 36 14 3 143 553 2
255298640: 5 7 2 336 9 6 25 6 226 8
627971804: 91 69 71 723 81
376876294: 603 625 5 15 779
4870224: 8 32 3 2 68 8 93
2921378615: 7 3 1 1 7 7 272 2 3 953 5
25762: 22 3 475 1 288
9334: 8 9 6 1 5 125 42 364
61711944: 453 61 26 6 4 8 3
31159097: 62 1 5 953 605 32 97
1486721291: 178 87 68 96 9
164195070864: 93 879 40 795 8 4 22
209: 2 83 46
448419: 16 657 642 341 4
2213729487: 7 9 9 7 1 33 6 6 7 457 3 4
826: 83 91 642 8 2
69845916113: 4 6 87 39 6 1 6 62 78 77
420247390: 7 8 70 5 9 6 6 33 1 9 6 53
468391418: 1 5 4 363 885 7 3 9 6 3 8
730151: 729 320 7 816 9
6121517413: 707 9 6 6 4 4 6 43 6 9 3 4
1331520: 8 304 44 288 95
2651662: 24 755 9 34 1
55557168: 45 8 7 13 6 49 716 8
925030462: 453 992 2 8 8 64 4 2 3
22929993: 6 1 9 403 8 6 7 9 677 9 8
136079: 10 7 80 8 1
4018560: 24 2 115 4 182
155443251648: 1 89 7 9 6 2 2 819 48
47311914088: 1 739 4 9 498 7 71 7 4
12959675904: 7 558 529 98 1 84 64
117075505: 4 651 2 693 2 63 6 89 7
8663990338: 3 5 36 5 2 989 3 23 337
38598654357: 8 78 6 7 3 2 5 1 9 1 343
1066: 3 68 3 447 7
9763884: 4 8 11 4 806
2649: 710 3 76 94 1 3
97022: 6 5 4 84 77 2
4436743: 2 4 20 36 7 37 6
10887: 8 1 931 930 26
41289: 5 160 2 2 4
64001920: 561 4 3 61 38
4877046: 961 40 84 3 58
94551: 942 3 5 3 1
2348968: 234 86 3 6 8
4829697944: 5 51 4 9 7 8 687 122 8
1275687: 531 4 6 262 9 9
866: 5 3 7 3 8
62826: 1 6 1 1 6 2 634 84 491 7
234421278: 586 4 2 12 81
987: 5 81 3 31 864
1512712546: 9 8 7 63 7 125 47
81507: 1 4 800 69 38
6885843415: 743 5 546 570 926
28383880: 20 47 9 76 1 89 469
8399: 73 86 242 8 877 994
6734289681: 841 681 9 889
2487534047373: 259 5 3 948 9 974 101
11402873: 17 96 609 414 17 553
18904325600: 55 21 735 4 325 600
1335462451: 16 5 9 9 14 8 3 3 70 955
70253: 2 115 30 9 2 38
17112: 9 5 4 7 9 66 1 6 5 1 9 2
240212907: 4 9 83 31 381 71 8 21 4
1137902: 24 89 78 71 31
17115001: 8 9 5 100 978 2
8596391: 85 8 7 3 87 9 24 3 5 5 22
536020: 80 67 17
1999835: 8 241 881 8 790
91503776: 1 6 419 4 5 7 7 2 6 8 91 7
141043433: 470 5 59 6 4 796 1 2 3
662831: 69 96 6 5 31 9
2527482: 5 670 26 6 8 4 3 6 6 258
663617436: 3 8 420 90 66 91 7
5117396: 9 43 45 5 32 34 74
286833458: 299 976 59 956
1810904: 402 12 2 15 73 351 3
14755500281: 339 44 1 161 3 3 2 1 3 2
891738: 8 2 2 43 1 6 4 93 2 963
1431924: 1 32 3 124 9 92 4
18526: 572 3 33 7 71 27 4
204101449: 650 314 9 5 50
19637: 54 6 5 57 55
46435032: 4 5 706 87 84
3901884025: 21 5 80 167 377 335
1357110633: 798 3 2 85 633
368814453: 93 509 63 8 612
16783688: 4 9 9 417 4 972 5 31 9
12778007: 75 949 14 552 167
3103890: 775 4 3 89 3
746384: 52 14 91 74 5 8 305 9 8
1324077: 1 132 24 2 1 6 674 967
6907431: 203 9 3 7 2 6 3 6 30 4 3 3
291241150: 142 5 2 5 909 5 500 86
10416: 35 4 9 217
222786114772: 428 3 36 98 836 1 52
30956235: 5 263 130 3 193 37
1807890624: 973 24 27 1 688
70133160056: 822 711 9 1 4 2 6 5 5 5 7
882460946: 1 8 8 6 3 1 3 2 5 943 2 3
2371851: 8 27 50 5 890
40024680321: 1 8 5 7 65 5 4 38 941 3 7
487213: 29 9 661 697 9
740743860807: 77 75 6 2 46 134 812
17850: 20 9 9 26 83 5
83290948: 5 91 8 75 2 927
586005: 584 894 66 816 228
483120417: 3 3 72 4 50 99 4 17
21612195: 117 9 6 9 6 1 3 379 5 6 9
1146285425: 70 5 863 1 945 427
311680: 8 8 5 4 81 3 621 3 4 1 6 5
81: 2 5 2 4 1
1692432: 6 80 5 764 8 146
982802: 73 73 2 8 4 3 8 5 3 5 7 2
25409164560: 1 6 9 1 188 7 2 5 7 9 12 5
366260: 318 47 47 1 78 7
168240337: 5 944 11 6 9 9 4 3 5 2 67
156807: 47 4 8 456 80 7
14995745: 6 714 25 35 870
24780095: 8 15 5 5 4 7 67 4 3 7 11
104125: 557 482 2 22 2
1844501: 41 2 9 357 7 202 32 5
6275963892: 1 482 98 9 9 699 1 12 1
3890574408: 176 78 786 6 28
47467: 293 9 3 6 1
926285: 9 2 532 96 5
2209: 7 1 8 94 20 9
219763712: 294 7 62 184 8 8
1754288721: 344 99 440 155 814 9
531930: 49 85 694 65 6 900 85
1005239880: 1 733 9 94 6 997 2 4 60
462: 33 9 26 131 8
6132669: 9 52 546 4 6
14541: 30 6 1 8 8
49132039: 57 7 6 4 6 8 98 5 2 5 2 42
10597759252: 40 7 3 622 8 10 9 7 7 6 9
750879481848: 55 65 6 1 6 5 8 7 3 31 9 5
301540320: 46 510 83 819 8 795
25711201: 3 7 337 9 296 2 2 60 5 7
3131219615335: 6 1 51 20 21 9 615 3 35
190931: 6 6 9 7 836 2 1 7 6 1 552
39873482: 1 61 950 90 687
136495497599: 4 878 7 7 4 48 5 3 7 99 2
62: 5 9 3
4072901: 4 52 40 14 1 2 9 1 4 1 8 8
3639889: 665 7 2 540 6 46 7 1
44833: 8 910 6 472 1 8 3 672
226176: 2 65 275 30 608
100819083: 3 9 6 7 16 325 116 9 18
2124636580913: 5 382 61 9 6 580 91 1
18389: 71 5 6 4 6 2
74957687: 7 2 7 8 5 9 5 59 9 636 6
1935561104: 70 129 276 8 5 58 561
285412: 39 26 7 961 98 2
910425: 7 9 111 4 4 5 427
1868263488: 7 973 1 56 654 52
356: 9 9 7 64 4
121563: 2 3 84 6 25 566
11793880: 9 1 1 61 292 577
6433920: 50 265 4 8 4
757114712: 677 795 6 739 29 86 4
92196314: 91 427 769 314
3622: 9 5 32 3 9 8 9 20 65
748249: 41 5 3 5 3 9 1 101 4 810
57521100: 67 570 940 490 3
694140: 42 712 4 1 92
2584: 1 9 2 2 6 8 7 8 12 7 460 4
1299844: 72 4 567 8 8 47
4438062035: 7 710 541 133 8 1 996
17848382: 733 639 949 13 44
1285415254454: 377 73 415 786 82 3 2
42573460: 1 8 2 3 317 730 79 381
6487474065: 4 6 6 6 4 42 4 48 4 5 7 89
11248830: 1 570 7 7 4 3 5 7 11 6 9 6
1236900001: 24 10 720 625 57
774935037: 293 473 63 40 66
121832: 7 5 3 2 6 88 1 1 552 7 3 3
1016743: 76 37 6 658 58
2533368513: 61 4 55 636 596 21
6990058: 4 1 835 30 204
1847406607: 20 526 740 9 8
779328000: 6 373 4 2 3 8 80 9 12 5 8
96371: 3 5 88 208 156 7
5419039: 3 8 517 90 41
249830: 99 374 8 177 3 7 9 8 90
100166088: 8 9 99 5 45 733 9 264
3376144: 7 157 927 442 7 584 6
43593660: 11 9 537 99 41
411324689: 7 21 208 389 4 41 29 6
234004: 61 323 7 87 89 62
23183285: 23 18 26 6 88
97916165533: 269 91 4 165 535
1112448: 9 61 841 2 5 4 3 8 9 6 89
8963: 896 5 1
73558189852: 5 6 9 4 6 97 6 658 2 98 7
13680414: 49 47 66 90 594
24172014797: 48 336 8 5 1 479 7
9967992824: 9 41 946 706 93 28 2 4
76153297584: 47 81 66 2 975 84
541346194846: 45 1 6 73 5 2 97 4 2 2 5 2
2476666710: 2 630 15 208 17 630
60279278: 6 982 17 61 6 3 845
55027351: 4 528 9 2 88 135
929699919: 3 89 480 9 8 2 99 5 4 21
257203: 304 846 14 3 2
19954464: 4 2 199 29 8 7 2 8 6 8 12
349703121: 87 425 69 5 1 43 8 8 9
9607739480: 120 8 1 4 3 7 3 6 3 4 74 3
70229: 6 57 4 3 227
19346675608: 4 3 7 4 3 7 466 3 5 5 609
59456: 9 39 3 3 875 64
4049373107: 490 831 2 825 85 1 7
38708598: 9 8 89 40 412 1 7 18 2 5
217787072132: 186 39 5 2 3 6 9 5 355 6
1252444294: 382 309 78 42 9
7796721302: 7 796 71 6 5 300
232741316: 8 29 741 314 1
26910444: 298 907 9 879 9 15
40916974: 2 8 5 2 9 8 6 1 5 16 971
34830687: 15 387 6 668 19
49022893747: 778 140 1 17 7 4 9
240774: 4 815 4 1 5
2030: 4 95 11 46 895
141432: 8 9 395 3 5 8 7 8 3 49 7 1
466823: 1 32 544 26 71
5847912: 202 47 694 82 7
242621: 232 7 801 56 67
330876: 8 4 2 2 2 2 7 150 5 18 7
93687: 25 197 3 19 55
71444393: 1 6 5 9 7 8 5 789 8 423 9
6751035: 1 21 553 845 258 5 1
191462315465: 957 31 2 3 15 464
15511497: 55 8 2 94 73 289
494852056149: 918 7 65 77 610 4 9
116901382: 42 97 79 9 847 3 608 6
287727946: 1 643 7 8 1 2 799 5 1 7
26218340: 244 68 525 56 8 8 5 5 4
76566: 9 77 13 60 6
1830: 292 29 891 531 87
403126: 356 9 148 58 706
26406: 799 7 32 525 2 79 8
61533769122: 1 551 8 75 6 983 189
5083523328: 909 3 8 7 1 3 976 4 1 68
35952796: 7 5 952 35 39 5 51
167412767: 5 1 4 1 9 8 94 38 6 7 7 70
2195302: 85 6 308 41 46
1474198: 69 9 5 70 54
364088987: 88 8 41 8 987
78139858: 1 4 5 2 19 3 628 2 7 6 5 6
4404409: 63 832 69
78435: 7 47 2 61 5 16 7 21 5
757520426: 77 2 98 98 26
203318778: 4 281 991 7 5 62 31 8
287102009: 8 88 930 764 73 6 8 7
90227: 48 705 88 61 26
8181666: 73 8 8 166 9
4345042264: 16 1 3 8 23 5 183 8 62
1748: 74 8 5 4 2
253: 1 3 5 5 160 54
7800887: 9 4 5 7 5 99 79 15 94 7
5590: 14 42 8 5 81
37762: 87 9 48 2 9 167
333279: 2 2 58 80 363 524 1 57
171214269218: 844 322 681 3 63
118944: 5 8 7 873 93
124807260: 419 9 9 3 40 8 270 300
57067: 5 2 65 9 88 41 1
67645321537: 92 3 2 715 36 71 4 4 9 6
897: 1 7 827 62
1191701596: 94 6 393 18 83 83 3 15
1273: 3 4 7 1
144149: 5 9 32 78 68
1256472: 63 7 3 2 1 539 71 277 6
30990621: 309 83 94 668 4
38536499222: 2 510 18 1 9 95 88 780
856374: 5 802 1 492 5 7 17
130842660: 3 6 58 8 1 3 793 9 4 9
69578132: 7 21 1 5 2 47 6 99 7 1 3 3
5276748016: 8 7 53 1 208 226 93
48947804: 5 910 9 3 8 1 330 773 2
194740286300: 5 8 3 275 5 5 2 67 5 89 9
22422998: 337 7 85 37 95 905
6918244: 6 8 497 29 1
45185615913: 97 710 90 9 1 9 1 810 3
316116: 27 527 2 312 54
11292: 929 9 4 5 201 64 9 384
143302570: 4 16 808 8 117 82 888
6574936: 810 8 94 844 91
19500766: 927 48 20 7 67
5496862: 4 4 2 5 86 8 399 28 3 3 7
4081: 4 74 6 281 7
107041551: 2 57 2 900 35 9 52
365716: 8 34 43 277 3 719
233199: 34 225 11 9
75781172: 315 75 3 8 2 9 1 6 4
6441: 3 601 327 1 3 6 45
72: 7 5 6
1847: 2 645 49 191 869 90 1
689524: 27 4 504 47 44
421965206413: 87 9 6 8 4 5 206 391 25
965613600002: 4 846 6 280 7 140 690
50559280: 8 1 6 4 2 4 567 26 534 4
365496049: 9 4 32 4 8 7 6 686 7 4 2 5
64994090: 2 9 4 1 21 74 3 73 79 7
1241: 1 3 4 2 7 1 927 298
7392027906: 8 350 66 4 2 7 909
72665135998: 6 6 743 1 3 4 3 68 727 8
42527813: 6 563 5 4 3 74 13
2085967: 414 4 499 14 7
10090710861: 386 49 70 80 95 41 21
188483597: 7 582 4 8 218 54 1 877
367380998: 2 2 2 6 96 3 900 5 998
68095186: 23 615 83 8 58 665 27
6509884572: 69 3 7 3 5 447 3 29 45
24930077: 28 690 986 2 4 3 8 70
886840: 24 5 86 770 45 5 883
42180751: 55 6 7 350 535 356 90
73846429: 761 303 97 4 36
118157648: 762 70 33 91 1 9 221
31303: 316 129 114 56
2340: 1 2 1 90 13
38925682: 993 392 77 2 5
132208396: 881 37 1 90 5 8 7 3
17362906539: 165 30 832 90 653 6
513060: 806 636 6 352 86
13556739: 451 47 42 13 3
87166290: 5 85 372 295 72 4
2085930558: 856 47 3 770 559
1271377657: 9 33 460 8 7 7 8 914 6 3
92480: 40 514 24 4 40
203612568029: 9 8 9 3 4 593 8 4 4 80 3 1
997367027585: 79 95 567 99 21 6 2
14986059: 5 53 1 4 2 4 3 8 9 2 2 338
16943: 7 4 20 353
192411245217: 1 4 16 3 411 243 2 214
3267945: 932 5 35 316 8 35 993
7584118814: 7 671 470 45 7 3 34
92005506: 773 3 57 87 6 1 761 8
83148275295: 3 339 4 451 3 44 80 9 7
2758387: 393 7 7 3 88
158229124: 29 55 19 2 19 6 28 3
19731329: 2 9 1 83 7 94 6 1 2 980 9
372969: 6 731 54 84 9
44398676936: 995 485 95 8 446
29: 4 8 2 5
28812: 917 31 113 6 27
3221058: 4 4 121 4 4 5 83 41 620
5012875154: 898 6 867 8 88 75 157
619: 81 324 57 159
2000875149: 877 559 36 5 57 387 8
538511: 4 7 544 52 863
37415205: 7 45 7 9 84 9 78 4 9 991
87187684: 567 6 8 2 951 2
723726: 7 146 73 188 2 12 9 62
5611: 15 2 2 547 8
161732: 8 19 1 4 8 39 32
77322232001: 8 26 104 9 591 9 93 4 1
7664: 9 8 5 45 7 2
43978994: 462 45 951
184200: 63 29 10 5 4
24754844735: 574 385 653 66 2
38841958460: 447 488 62 14 60
512307698: 78 476 8 7 92 35 2 978
978764208: 1 83 5 78 7 56 484 4 8 4
51510: 9 1 77 9 7 32 38 7 583
519848234: 89 192 64 9 659 7 8 4 3
279759946564: 694 6 76 839 58 1 6 8 2
27642337368: 30 7 9 658 999 7 368
1714046887054: 9 4 3 88 3 699 1 7 3 976
2096866: 762 7 4 2 9 7 4 7 1 2 27 2
829347: 57 9 11 283 50 19
5188: 9 98 18 397 4
8546580: 3 931 494 63 95
2569449: 4 318 202 3 8
1008685401: 3 24 22 9 26 3 511 2 8
38907: 341 1 41 3 61 4 64
47134149: 59 5 6 423 9 55 2 6 37
156: 4 5 48 80 8
13690: 373 8 21 967 3
152680: 5 4 62 3 9 75 1 7 6 2 5 4
22638959: 203 8 12 282 4 90
667766987: 6 184 969 39 93 7 5 3 2
491050285: 9 3 9 9 9 7 6 28 270 6 8 3
123681: 9 1 5 8 4 88 91 3 4 5 14 3
2442314: 2 5 7 9 947
66996296: 6 1 9 7 48 8 1 1 8 4 4 372
527: 6 5 6 4 2
18881838: 929 53 32 45 52 21 6
41565: 44 3 73 665 8 52 2
38558: 1 5 21 68 21
6715471: 839 434 8
6389: 91 7 6 9 5 7 178 974 5 4
2117591196: 3 5 748 679 614 9 3 94
28162196: 8 7 1 32 2 196
35808181: 2 2 8 746 180
9867444479: 73 352 40 6 9 1 2 48 1 4
78674: 7 501 25 659 66
45024: 4 4 3 3 18 18 57 276 7
19756: 4 99 3 942 7
799: 34 57 708
157466: 8 2 6 8 7 678 40 9 6 69
12013722: 53 771 14 3 7
305851750: 8 736 8 8 5 6 3 34 8 7 5 1
31627: 85 8 4 85 7
120636732: 750 274 14 587 7 7
239363098: 57 7 6 69 1 1 1 8 59 5 4 6
23142: 7 7 4 3 8 579 6 6 8 8 50
330: 3 42 4 9 8 5
610059: 3 3 2 541 80 888
15743730746: 31 237 561 6 84
1289162: 5 6 57 370 11 28 8 5 2
4912012: 49 120 12
21034792439: 47 1 58 1 7 2 7 915 9 39
10550: 2 3 9 970 45 8 514 1 5
27651: 2 9 1 8 1 5 8 7 8 4 4 35
53322: 8 87 4 8 2 66 63 96 759
138446470: 26 6 47 682 4 71
1648416: 9 278 7 657 3
6538688411: 30 351 741 838 668
1344480: 7 466 85 43 7 56 424
244514648942: 468 4 7 2 5 2 1 2 37 945
241060: 8 3 5 67 8 69 6 48 4
40133289211: 659 7 87 9 7 2 9 17 4 1
435126: 783 57 518 8
17711006228220: 76 834 259 998 890
5734080: 36 1 1 288 55
8979895786: 9 2 93 110 38 8 5 21
3330: 532 23 6
10241840: 102 34 7 8 38
13305407: 2 1 4 5 8 7 259 5 2 12 5 2
1433165: 3 9 1 891 73 367 65
177433659084: 44 3 58 41 477 10 4 2
222432: 311 919 67 3 4 6 71 56
85538: 1 4 7 2 910
32399920: 9 4 9 9 9 343 93 8 3 8 70
3157308169: 1 373 938 9 169
48314570: 8 329 1 58 9 3 470 5
2157760504767: 751 9 9 76 9 2 9 7 9 2 8 3
113124347: 1 9 87 43 2 9 95 347 1
234373743: 2 9 28 89 3 4 285
65134472: 65 133 910 5 559
5111: 5 42 2 513 9 53
280608943: 45 909 7 7 7 5 5 9 4 587
4944: 40 1 9 45
177101: 80 4 186 35 2
8123256299: 643 1 251 7 58 4 9 296
2610013: 28 55 24 2 655 487 6
3473695: 10 681 6 7 17 5
102288: 44 8 693 6 8 980 4 2
792006: 80 9 71 8 1 44 73 6 82
8393424: 656 4 6 4 3 8 4 9 8 87 3 4
3357448904: 9 2 514 71 901
11955840: 5 778 1 3 2 8 3 2 4 4 16
33523655: 1 1 3 1 1 294 8 68 4 5 8 3
40658: 1 477 43 78 20
419: 5 99 4
10692: 9 8 4 4 27
2316100872: 772 5 1 6 812 6
8456347: 98 587 147 25
45388: 6 755 4 4 18 59
98449258: 90 859 57 260 7
290537744: 880 4 3 514 8 11
1920630535: 5 7 1 57 4 6 4 84 1 771
41738341141: 8 3 103 9 3 4 6 5 962
267888: 53 5 71 5 36
457162268328: 14 3 754 7 71 9 6 318
9818370: 378 26 9 30 10 3 90
136158886: 8 1 7 95 325 2 1 5 3 8 7
407: 6 42 69 8 78
1012705468: 822 4 44 7 657 811
4180406340096: 466 981 98 12 6 36 9 4
10705064: 4 424 136 5 931 181
2217819683: 7 51 62 9 9 423 96 3 5 4
7508279323: 3 250 555 272 3 6 32 2
2658216: 558 18 25 4 66
59297: 60 97 2 747 351
7495229447: 8 328 9 266 28 50
2644059830523: 57 55 2 97 574 815 8
54008124608: 94 751 10 958 57
2207268: 50 592 72 49 50 7 9
9395936945: 83 33 540 34 9 806 4
65754981: 340 41 89 53
5424: 267 8 2 69
194627: 564 43 8 613 1
75167376: 75 166 1 972 404
237336645000: 628 915 45 700 590
522553: 7 58 4 91 7 2 7 9 148 49
4897: 29 13 6 95
13670996090: 500 614 6 73 31 610
16290039939: 74 7 6 1 7 882 87 2 438
2804002896239: 85 2 41 17 5 52 774 5
86506: 910 1 29 157 73 74
21660911180: 722 2 15 911 180
6815: 6 743 72
114802992537: 6 17 215 5 39 1 5 186 2
720907: 203 61 587 39 81 8
15904808: 28 3 80 96 5 5
200829237621: 999 710 37 3 744 27
95188135587: 835 3 68 49 755 579 8
61525: 81 49 4 75 3 4 5 8 28
13221210319: 3 486 9 6 6 4 20 5 5 6 2 8
3728996709124: 945 71 9 708 62 96 6 1
39283710: 7 46 6 3 64 51 9 717
24046652: 1 8 92 61 34 2 646 46 7
178492223: 4 1 18 61 81 5 7 2 8 194
1677144138: 6 123 83 227 39
105579656: 2 3 4 7 2 96 8 6 63 6 366
78276190303: 7 94 9 131 13 41 3 7 9
110367683: 778 9 8 5 5 3 4 9 394 9
7626312605: 4 502 5 552 1 72 598 5
56319236258: 9 5 39 82 6 8 9 548 258
5406139: 642 842 45 4 6
45342: 7 29 96 267 8 1 2 50
7525096: 1 820 330 35 97
80899207: 11 236 80 9 7
1022048029: 328 76 82 5 24 7
853304431680: 313 630 752 6 603
4608388638: 31 9 958 177 93
68959734: 7 8 33 5 44 732 6 2 6 4
4653: 845 319 4
2523796352: 2 51 789 2 4 8 98
185856: 885 21 6
19948509: 72 83 24 3 910 396
1680716: 236 37 35 71 3
Binary file not shown.
+125
View File
@@ -0,0 +1,125 @@
--- Day 8: Resonant Collinearity ---
You find yourselves on the roof of a top-secret Easter Bunny installation.
While The Historians do their thing, you take a look at the familiar huge antenna. Much to your surprise, it seems to have been reconfigured to emit a signal that makes people 0.1% more likely to buy Easter Bunny brand Imitation Mediocre Chocolate as a Christmas gift! Unthinkable!
Scanning across the city, you find that there are actually many such antennas. Each antenna is tuned to a specific frequency indicated by a single lowercase letter, uppercase letter, or digit. You create a map (your puzzle input) of these antennas. For example:
............
........0...
.....0......
.......0....
....0.......
......A.....
............
............
........A...
.........A..
............
............
The signal only applies its nefarious effect at specific antinodes based on the resonant frequencies of the antennas. In particular, an antinode occurs at any point that is perfectly in line with two antennas of the same frequency - but only when one of the antennas is twice as far away as the other. This means that for any pair of antennas with the same frequency, there are two antinodes, one on either side of them.
So, for these two antennas with frequency a, they create the two antinodes marked with #:
..........
...#......
..........
....a.....
..........
.....a....
..........
......#...
..........
..........
Adding a third antenna with the same frequency creates several more antinodes. It would ideally add four antinodes, but two are off the right side of the map, so instead it adds only two:
..........
...#......
#.........
....a.....
........a.
.....a....
..#.......
......#...
..........
..........
Antennas with different frequencies don't create antinodes; A and a count as different frequencies. However, antinodes can occur at locations that contain antennas. In this diagram, the lone antenna with frequency capital A creates no antinodes but has a lowercase-a-frequency antinode at its location:
..........
...#......
#.........
....a.....
........a.
.....a....
..#.......
......A...
..........
..........
The first example has antennas with two different frequencies, so the antinodes they create look like this, plus an antinode overlapping the topmost A-frequency antenna:
......#....#
...#....0...
....#0....#.
..#....0....
....0....#..
.#....A.....
...#........
#......#....
........A...
.........A..
..........#.
..........#.
Because the topmost A-frequency antenna overlaps with a 0-frequency antinode, there are 14 total unique locations that contain an antinode within the bounds of the map.
Calculate the impact of the signal. How many unique locations within the bounds of the map contain an antinode?
Your puzzle answer was 269.
--- Part Two ---
Watching over your shoulder as you work, one of The Historians asks if you took the effects of resonant harmonics into your calculations.
Whoops!
After updating your model, it turns out that an antinode occurs at any grid position exactly in line with at least two antennas of the same frequency, regardless of distance. This means that some of the new antinodes will occur at the position of each antenna (unless that antenna is the only one of its frequency).
So, these three T-frequency antennas now create many antinodes:
T....#....
...T......
.T....#...
.........#
..#.......
..........
...#......
..........
....#.....
..........
In fact, the three T-frequency antennas are all exactly in line with two antennas, so they are all also antinodes! This brings the total number of antinodes in the above example to 9.
The original example now has 34 antinodes, including the antinodes that appear on every antenna:
##....#....#
.#.#....0...
..#.#0....#.
..##...0....
....0....#..
.#...#A....#
...#..#.....
#....#.#....
..#.....A...
....#....A..
.#........#.
...#......##
Calculate the impact of the signal using this updated model. How many unique locations within the bounds of the map contain an antinode?
Your puzzle answer was 949.
Both parts of this puzzle are complete! They provide two gold stars: **
+44
View File
@@ -0,0 +1,44 @@
#!/usr/bin/env python3
import sys
from itertools import combinations
from copy import deepcopy
if __name__ == '__main__':
mp = [list(line.strip('\n')) for line in open(sys.argv[1])]
antinodes = deepcopy(mp)
ah = deepcopy(mp)
antennas = {}
for j, y in enumerate(mp):
for i, x in enumerate(y):
if x != '.':
if x in antennas: antennas[x].append((i,j))
else: antennas[x] = [(i,j)]
ah[j][i] = '#'
for freq, ants in antennas.items():
for a1, a2 in combinations(ants, 2):
dx, dy = a2[0] - a1[0], a2[1] - a1[1]
x1, y1 = a1[0] - dx, a1[1] - dy
x2, y2 = a2[0] + dx, a2[1] + dy
if (0 <= x1 < len(mp[0])) and (0 <= y1 < len(mp)):
antinodes[y1][x1] = '#'
if (0 <= x2 < len(mp[0])) and (0 <= y2 < len(mp)):
antinodes[y2][x2] = '#'
while (0 <= x1 < len(mp[0])) and (0 <= y1 < len(mp)):
ah[y1][x1] = '#'
x1, y1 = x1-dx, y1-dy
while (0 <= x2 < len(mp[0])) and (0 <= y2 < len(mp)):
ah[y2][x2] = '#'
x2, y2 = x2+dx, y2+dy
# challenge 1
res1 = sum([a.count('#') for a in antinodes])
print(f"challenge 1:\n{res1}\n")
# challenge 2
res2 = sum([a.count('#') for a in ah])
print(f"challenge 2:\n{res2}")
+12
View File
@@ -0,0 +1,12 @@
............
........0...
.....0......
.......0....
....0.......
......A.....
............
............
........A...
.........A..
............
............
+50
View File
@@ -0,0 +1,50 @@
...............................6.B..........P.....
n..............M..................................
....n.....sM7.............................6.....p.
......................Mr......................P...
.......n.......................................p.E
.......................6...................p......
r..............................C........B....P....
.....................d........6......B4....P......
.........................7....................4...
.n......................R..............4..........
.....N........S.................K.C..........4....
...........N..r.....................B....K........
..................................................
......N.......x.............7.......K.....2....E..
...................r..H........R..................
.....................s....p........C...........2..
....3.......................M.....................
........k....................H....5...............
.....x....N................d.5..y................J
m.....................d7...................J......
.......exk........................................
.......x.............5.......R....................
..........eY......................................
...S.3..............................O.E...J.......
.......8...H....k...............J.................
......S.e.........C.H.....................X.....y.
................j..........y.........2............
...........e.........k............................
......YS...3..............5..........K...XR.......
...m..............j.s..........c..................
.........................j........................
...............j..................................
.....m................................2...........
.........Y......................................b.
..................................................
.......................h...........b..............
............m......D..............d...............
........o......D..................................
...................................O..............
..................................................
......8...........................................
........D.Y..o...................1................
.....................................b..9.........
........................h..0......................
.....o......................h..0........b1........
.........8.............X..........................
..........o..........c..........1...........O.....
....8....................y0...c...................
..............D.......c..................9..0.....
............................1..........O..9.......
Binary file not shown.
+77
View File
@@ -0,0 +1,77 @@
--- Day 9: Disk Fragmenter ---
Another push of the button leaves you in the familiar hallways of some friendly amphipods! Good thing you each somehow got your own personal mini submarine. The Historians jet away in search of the Chief, mostly by driving directly into walls.
While The Historians quickly figure out how to pilot these things, you notice an amphipod in the corner struggling with his computer. He's trying to make more contiguous free space by compacting all of the files, but his program isn't working; you offer to help.
He shows you the disk map (your puzzle input) he's already generated. For example:
2333133121414131402
The disk map uses a dense format to represent the layout of files and free space on the disk. The digits alternate between indicating the length of a file and the length of free space.
So, a disk map like 12345 would represent a one-block file, two blocks of free space, a three-block file, four blocks of free space, and then a five-block file. A disk map like 90909 would represent three nine-block files in a row (with no free space between them).
Each file on disk also has an ID number based on the order of the files as they appear before they are rearranged, starting with ID 0. So, the disk map 12345 has three files: a one-block file with ID 0, a three-block file with ID 1, and a five-block file with ID 2. Using one character for each block where digits are the file ID and . is free space, the disk map 12345 represents these individual blocks:
0..111....22222
The first example above, 2333133121414131402, represents these individual blocks:
00...111...2...333.44.5555.6666.777.888899
The amphipod would like to move file blocks one at a time from the end of the disk to the leftmost free space block (until there are no gaps remaining between file blocks). For the disk map 12345, the process looks like this:
0..111....22222
02.111....2222.
022111....222..
0221112...22...
02211122..2....
022111222......
The first example requires a few more steps:
00...111...2...333.44.5555.6666.777.888899
009..111...2...333.44.5555.6666.777.88889.
0099.111...2...333.44.5555.6666.777.8888..
00998111...2...333.44.5555.6666.777.888...
009981118..2...333.44.5555.6666.777.88....
0099811188.2...333.44.5555.6666.777.8.....
009981118882...333.44.5555.6666.777.......
0099811188827..333.44.5555.6666.77........
00998111888277.333.44.5555.6666.7.........
009981118882777333.44.5555.6666...........
009981118882777333644.5555.666............
00998111888277733364465555.66.............
0099811188827773336446555566..............
The final step of this file-compacting process is to update the filesystem checksum. To calculate the checksum, add up the result of multiplying each of these blocks' position with the file ID number it contains. The leftmost block is in position 0. If a block contains free space, skip it instead.
Continuing the first example, the first few blocks' position multiplied by its file ID number are 0 * 0 = 0, 1 * 0 = 0, 2 * 9 = 18, 3 * 9 = 27, 4 * 8 = 32, and so on. In this example, the checksum is the sum of these, 1928.
Compact the amphipod's hard drive using the process he requested. What is the resulting filesystem checksum? (Be careful copy/pasting the input for this puzzle; it is a single, very long line.)
Your puzzle answer was 6288599492129.
--- Part Two ---
Upon completion, two things immediately become clear. First, the disk definitely has a lot more contiguous free space, just like the amphipod hoped. Second, the computer is running much more slowly! Maybe introducing all of that file system fragmentation was a bad idea?
The eager amphipod already has a new plan: rather than move individual blocks, he'd like to try compacting the files on his disk by moving whole files instead.
This time, attempt to move whole files to the leftmost span of free space blocks that could fit the file. Attempt to move each file exactly once in order of decreasing file ID number starting with the file with the highest file ID number. If there is no span of free space to the left of a file that is large enough to fit the file, the file does not move.
The first example from above now proceeds differently:
00...111...2...333.44.5555.6666.777.888899
0099.111...2...333.44.5555.6666.777.8888..
0099.1117772...333.44.5555.6666.....8888..
0099.111777244.333....5555.6666.....8888..
00992111777.44.333....5555.6666.....8888..
The process of updating the filesystem checksum is the same; now, this example's checksum would be 2858.
Start over, now compacting the amphipod's hard drive using this new method instead. What is the resulting filesystem checksum?
Your puzzle answer was 6321896265143.
Both parts of this puzzle are complete! They provide two gold stars: **
+69
View File
@@ -0,0 +1,69 @@
#!/usr/bin/env python3
import sys
from copy import deepcopy
def compress(mem):
blocks = deepcopy(mem)
r = len(blocks) - 1
for p, b in enumerate(blocks):
if b == None:
while blocks[r] == None: r -= 1
# if you check this before moving it obviously does not work
if p >= r: break
blocks[p] = blocks[r]
blocks[r] = None
return blocks
def block_compress(free, full, size):
memory = [None] * size
for id, pos in reversed(full.items()):
p, b = pos
for i in sorted(free.keys()):
if i >= p: break
if free[i] < b: continue
else: p = i
if p != pos[0]:
free[p+b] = free[p] - b
free.pop(p)
if (pos[0]+b) in free:
free[pos[0]] = b + free[pos[0]+b]
free.pop(pos[0]+b)
else: free[pos[0]] = b
for j in range (p, p+b): memory[j] = id
return memory
def checksum(blocks):
cs = 0
for p, b in enumerate(blocks):
if b == None: continue
cs += p * b
return cs
if __name__ == '__main__':
blocks = [int(n) for n in list(open(sys.argv[1]).read().strip('\n'))]
memory = [None] * sum(blocks)
p, id = 0, 0
free, full = {}, {}
for i, b in enumerate(blocks):
if i % 2 == 0 and b > 0:
for j in range (p, p+b): memory[j] = id
full[id] = (p, b)
id += 1
else: free[p] = b
p += b
# challenge 1
res1 = checksum(compress(memory))
print(f"challenge 1:\n{res1}\n")
# challenge 2
res2 = checksum(block_compress(free, full, sum(blocks)))
print(f"challenge 2:\n{res2}")
+1
View File
@@ -0,0 +1 @@
2333133121414131402
+1
View File
@@ -0,0 +1 @@
6337613674436833695582382518294574934721895775456926659050519789764499137091974516817593123529825470413735998773313821249746165140476827548333979879759812148140743921984858367387865689863575979767978384602135617653231357745451442716162787988827217792125086367824652239497919721686553336289590824034825884491882728622562067753798821229222238807634124749916752577072651378955553992845307918307276391238273773149858396433832536796653365434709657851887396187578778147166906832666361736921666530215593938020386798211757213535118020656880772626853567534823537521847840542462424239748076442664335159933397986757683414553370933017533841909225785682535581657913534751914590354573479543352482677664279490115563578845916997385280799060446627827972734570759842272566609483169585119611369745574079877574611920292074449221344989775049422092807055209772581092501625426515216037533372713253769756161167528724961425674338433856921993913658367042577497436930301681312780243028924226184437743980832960764956152123711024813868188023445957797073319557834842443457408060431584672765711965523592339064155945688420399677786021375036865224718236192794168244218132331879653238514185879711274422704721314129454939677194798258512282384257688549556871296166858544234847196990249480549228468620477732643536689838393877978653367792853453997762592631241338636138577555428914232648823466514071894652137678142034849239193626153640623580414314608933385485612012888459733812386760439427452815938894615323396842132211755866147610694370823973397748963732281746466628818129365432979699941761269528742324281144556379381879602911724569887421245076318843809377436853841020844590787517655729552955292366331147517060174571596182569363324916905792827650803161491453136021278077732064374448109498165846527088615498892332771430958179814356621939482129587840825717107138658080991769344985444860919820564023672497821693314755599976209047988027535412418173944146379780263754526214261017834795745288115763115420595437959121698079541886909440959071743761324933549055785895219883434371956470166162332913626974228698704867909040649016617460867032767038334727116689244913263370265020373034542849904912599647836283459162238825918961705866907222166252213569835943736588468231414457382040649035476988352594163315317533816572151422835818584798813953851735242330898787799654338389819473342688805893283467278648262129884651697935311570182570622882847035353690402079255041929980106820933987229229797544269317587273137530758375497634699083283818553718955173431710764611483099989260285267944525422740201440336499923419596970234642786695265316332262177054801980634357789526362333385795223688334671859856597460299593595342948524369087665258874015146296241079817536554214141611547952197222448591679959466790128097793753463968675487268040477815563380229164213672752215208397193598924987982747832046393487916058272183247276523097304784635757381389468220157974675179325452839698486360399879695439645913991513175369124373993030541020107278592224606843141533658010212677209043325490342134728924457069965191109858378318612965799852635497747794734595236056575848591924766220818282475324396727508923606980769458725299525452612238764560262657775582924569776483862349887068324449156297506644312010698479354773245797667563279586421294657685887842714452735721406358806171998745643329816772286796704744766044588635885245655459774311291948625491629489845688426449351717832871305285577753164547112747414863694575184763986239102380914887326641428026877699225992392096482370418830381415159027914953351339474421536726145911393866697198669419803537365630324763404171851150754014952414412764421984874654951033761733339938562539501446678133468715754993394758543046223523398728955356737781406931429746223633763241354625939226463718409470443784758784373146313839928768614814211356253038934558927790904988453344509018747586929116183883508082777047599959667039225085656443324675746726742070671570757088224324721174549372663665357073604929544480355015119614695352475587896476298629578751175152953418694340237315682094281425544939961496671928705760203087589687943595183450878840612944545990131498239234836114902680973922971833131647941447156647709468389679862137111593607085798425435736388659127388489737118418537272479942534595188821602597196231331570739573219060339186363023917360728735156330123729551057656522303564363389388580584548939620728350317592847949877699604391352991731027339689607733987355581433793686246693841298838454573798145112168184911056903380103939467378844737779330194582116721272190126779182733559651836358413812266428668253391218604697749045971951622863863588909757411613156843452329293637464367447412392465939681589644859070551682234527516285233194458768183747577595703213148321859615511124931012101096951580915748936348216536567577647345618573868040994546908948496431144262585963718473204983249712109511962363539684909657287652765145553168177329822059904713775018257475153084721036958345931122317816828966716917929036331813946978532772968156626894887060457595911112698Line truncated
+130
View File
@@ -0,0 +1,130 @@
--- Day 10: Hoof It ---
You all arrive at a Lava Production Facility on a floating island in the sky. As the others begin to search the massive industrial complex, you feel a small nose boop your leg and look down to discover a reindeer wearing a hard hat.
The reindeer is holding a book titled "Lava Island Hiking Guide". However, when you open the book, you discover that most of it seems to have been scorched by lava! As you're about to ask how you can help, the reindeer brings you a blank topographic map of the surrounding area (your puzzle input) and looks up at you excitedly.
Perhaps you can help fill in the missing hiking trails?
The topographic map indicates the height at each position using a scale from 0 (lowest) to 9 (highest). For example:
0123
1234
8765
9876
Based on un-scorched scraps of the book, you determine that a good hiking trail is as long as possible and has an even, gradual, uphill slope. For all practical purposes, this means that a hiking trail is any path that starts at height 0, ends at height 9, and always increases by a height of exactly 1 at each step. Hiking trails never include diagonal steps - only up, down, left, or right (from the perspective of the map).
You look up from the map and notice that the reindeer has helpfully begun to construct a small pile of pencils, markers, rulers, compasses, stickers, and other equipment you might need to update the map with hiking trails.
A trailhead is any position that starts one or more hiking trails - here, these positions will always have height 0. Assembling more fragments of pages, you establish that a trailhead's score is the number of 9-height positions reachable from that trailhead via a hiking trail. In the above example, the single trailhead in the top left corner has a score of 1 because it can reach a single 9 (the one in the bottom left).
This trailhead has a score of 2:
...0...
...1...
...2...
6543456
7.....7
8.....8
9.....9
(The positions marked . are impassable tiles to simplify these examples; they do not appear on your actual topographic map.)
This trailhead has a score of 4 because every 9 is reachable via a hiking trail except the one immediately to the left of the trailhead:
..90..9
...1.98
...2..7
6543456
765.987
876....
987....
This topographic map contains two trailheads; the trailhead at the top has a score of 1, while the trailhead at the bottom has a score of 2:
10..9..
2...8..
3...7..
4567654
...8..3
...9..2
.....01
Here's a larger example:
89010123
78121874
87430965
96549874
45678903
32019012
01329801
10456732
This larger example has 9 trailheads. Considering the trailheads in reading order, they have scores of 5, 6, 5, 3, 1, 3, 5, 3, and 5. Adding these scores together, the sum of the scores of all trailheads is 36.
The reindeer gleefully carries over a protractor and adds it to the pile. What is the sum of the scores of all trailheads on your topographic map?
Your puzzle answer was 629.
--- Part Two ---
The reindeer spends a few minutes reviewing your hiking trail map before realizing something, disappearing for a few minutes, and finally returning with yet another slightly-charred piece of paper.
The paper describes a second way to measure a trailhead called its rating. A trailhead's rating is the number of distinct hiking trails which begin at that trailhead. For example:
.....0.
..4321.
..5..2.
..6543.
..7..4.
..8765.
..9....
The above map has a single trailhead; its rating is 3 because there are exactly three distinct hiking trails which begin at that position:
.....0. .....0. .....0.
..4321. .....1. .....1.
..5.... .....2. .....2.
..6.... ..6543. .....3.
..7.... ..7.... .....4.
..8.... ..8.... ..8765.
..9.... ..9.... ..9....
Here is a map containing a single trailhead with rating 13:
..90..9
...1.98
...2..7
6543456
765.987
876....
987....
This map contains a single trailhead with rating 227 (because there are 121 distinct hiking trails that lead to the 9 on the right edge and 106 that lead to the 9 on the bottom edge):
012345
123456
234567
345678
4.6789
56789.
Here's the larger example from before:
89010123
78121874
87430965
96549874
45678903
32019012
01329801
10456732
Considering its trailheads in reading order, they have ratings of 20, 24, 10, 4, 1, 4, 5, 8, and 5. The sum of all trailhead ratings in this larger example topographic map is 81.
You're not sure how, but the reindeer seems to have crafted some tiny flags out of toothpicks and bits of paper and is using them to mark trailheads on your topographic map. What is the sum of the ratings of all trailheads?
Your puzzle answer was 1242.
Both parts of this puzzle are complete! They provide two gold stars: **
+50
View File
@@ -0,0 +1,50 @@
#!/usr/bin/env python3
import sys
def trailhead_score(tm, x, y):
height = tm[y][x]
end_positions = set([])
if height == 9: return set([(x,y)])
directions = [(0,1), (1,0), (0,-1), (-1,0)]
for d in directions:
nx, ny = x+d[0], y+d[1]
if nx < 0 or ny < 0: continue
try:
if tm[ny][nx] - height == 1:
end_positions = end_positions.union(trailhead_score(tm, nx, ny))
except IndexError: continue
return end_positions
def trailhead_ranking(tm, x, y):
height = tm[y][x]
score = 0
if height == 9: return 1
directions = [(0,1), (1,0), (0,-1), (-1,0)]
for d in directions:
nx, ny = x+d[0], y+d[1]
if nx < 0 or ny < 0: continue
try:
if tm[ny][nx] - height == 1:
score += trailhead_ranking(tm, nx, ny)
except IndexError: continue
return score
if __name__ == '__main__':
tm = [[int(l) for l in line.strip('\n')] for line in open(sys.argv[1])]
res1, res2 = 0, 0
for j, y in enumerate(tm):
for i, x in enumerate(y):
if x == 0:
res1 += len(trailhead_score(tm, i, j))
res2 += trailhead_ranking(tm, i, j)
# challenge 1
print(f"challenge 1:\n{res1}\n")
# challenge 2
print(f"challenge 2:\n{res2}")
+8
View File
@@ -0,0 +1,8 @@
89010123
78121874
87430965
96549874
45678903
32019012
01329801
10456732
+50
View File
@@ -0,0 +1,50 @@
56760198543405456770107687012987873265430701234123
47891087612514320889298596543236982176321878985054
30932912503423411978321436760145453089490965076567
21043803498598502565450345897896334569584324105498
43256754387687643445601231056787276578675013212389
50105620896014553238782322348996189432106522301210
60234211205423469109695210567345023456987101232569
71454301312345678100556501051269010787832198543478
82365985407856743291447892340178732696949037643323
99878876556989856782332309650065341054658743252110
12389565445845698943221218761234456565789650167087
03458890330532787892100321052442787074656782108996
12766721221621056521098478934321692183245891210105
00875437876521245430167569035630013290194300121234
21980356985430130101456122128754324389980215432101
32341245234561221212340033439961015671271326990123
41239832101676678703121542345872343760362347887654
50146701098787569254035671096112654854454558943210
69655410889693452164549389987003569943003967656787
78789324989582543076678432176124578752112876545490
49670123476451001289986581065437669801198743454321
34565404560302654345677893034458954321034652345210
21670313401212701238766732123361056700125601216787
10781223304343870349676678901272341811098700305891
87690433210154901234587565078980110925643212456730
98521049873269100448996652169765223434756965569821
83430656794378234567385543258894304589807874321034
12345690185123247855434789043210113676212981012125
04396783276030110982329872178901923494345891234596
65287654896543225671012763561032876587436780989687
70132108987652334430101654432945214306525891078765
89945345456701498521012346547876305211014342569854
67876276789876567677890107236521456523210213410743
56940189678930438988743298101430567894765104323212
45434328509821321089654340122334567765894101298701
50125613410030012127763019831021998568903210345692
23498701322147897898892123742340867478912653210789
10567654213456786721089054654356789302801743105678
01678123402110995437658766789210676211010892234109
67569016567021874378941043212101245432346781103201
58454323898134565632332456701234306011015490321232
49323454234012906701454327890965412102367305410147
31012365125643812898765410378876543233458216568758
21009876034756763019034101269989100146569325679669
21898745129829654323129654352123299656478012784578
30743231065018760563238765543034788798329983693056
45656189654323011056769894672145632347012674212147
01218088745896522349850123283034701456981065100238
14309893236787631438943210190129892123672578921109
25456782101896540127654301012010181034543465433212
Binary file not shown.
+67
View File
@@ -0,0 +1,67 @@
--- Day 11: Plutonian Pebbles ---
The ancient civilization on Pluto was known for its ability to manipulate spacetime, and while The Historians explore their infinite corridors, you've noticed a strange set of physics-defying stones.
At first glance, they seem like normal stones: they're arranged in a perfectly straight line, and each stone has a number engraved on it.
The strange part is that every time you blink, the stones change.
Sometimes, the number engraved on a stone changes. Other times, a stone might split in two, causing all the other stones to shift over a bit to make room in their perfectly straight line.
As you observe them for a while, you find that the stones have a consistent behavior. Every time you blink, the stones each simultaneously change according to the first applicable rule in this list:
If the stone is engraved with the number 0, it is replaced by a stone engraved with the number 1.
If the stone is engraved with a number that has an even number of digits, it is replaced by two stones. The left half of the digits are engraved on the new left stone, and the right half of the digits are engraved on the new right stone. (The new numbers don't keep extra leading zeroes: 1000 would become stones 10 and 0.)
If none of the other rules apply, the stone is replaced by a new stone; the old stone's number multiplied by 2024 is engraved on the new stone.
No matter how the stones change, their order is preserved, and they stay on their perfectly straight line.
How will the stones evolve if you keep blinking at them? You take a note of the number engraved on each stone in the line (your puzzle input).
If you have an arrangement of five stones engraved with the numbers 0 1 10 99 999 and you blink once, the stones transform as follows:
The first stone, 0, becomes a stone marked 1.
The second stone, 1, is multiplied by 2024 to become 2024.
The third stone, 10, is split into a stone marked 1 followed by a stone marked 0.
The fourth stone, 99, is split into two stones marked 9.
The fifth stone, 999, is replaced by a stone marked 2021976.
So, after blinking once, your five stones would become an arrangement of seven stones engraved with the numbers 1 2024 1 0 9 9 2021976.
Here is a longer example:
Initial arrangement:
125 17
After 1 blink:
253000 1 7
After 2 blinks:
253 0 2024 14168
After 3 blinks:
512072 1 20 24 28676032
After 4 blinks:
512 72 2024 2 0 2 4 2867 6032
After 5 blinks:
1036288 7 2 20 24 4048 1 4048 8096 28 67 60 32
After 6 blinks:
2097446912 14168 4048 2 0 2 4 40 48 2024 40 48 80 96 2 8 6 7 6 0 3 2
In this example, after blinking six times, you would have 22 stones. After blinking 25 times, you would have 55312 stones!
Consider the arrangement of stones in front of you. How many stones will you have after blinking 25 times?
Your puzzle answer was 224529.
--- Part Two ---
The Historians sure are taking a long time. To be fair, the infinite corridors are very large.
How many stones would you have after blinking a total of 75 times?
Your puzzle answer was 266820198587914.
Both parts of this puzzle are complete! They provide two gold stars: **
+40
View File
@@ -0,0 +1,40 @@
#!/usr/bin/env python3
import sys
from copy import deepcopy
import numpy as np
def memo(f):
memo = {}
def f2(x,y):
if (x,y) not in memo: memo[(x,y)] = f(x,y)
return memo[(x,y)]
return f2
@memo
def blink(stone, i):
if i == 0: return 1
else: i -= 1
if stone == 0: return blink(1,i)
elif len(str(stone)) % 2 == 0:
ds = int(len(str(int(stone)))/2)
return(blink(int(str(int(stone))[:ds]),i) + blink(int(str(int(stone))[ds:]),i))
else: return blink(stone*2024, i)
if __name__ == '__main__':
stones = [int(n) for n in open(sys.argv[1]).read().strip('\n').split(' ')]
res1, res2 = 0, 0
for s in stones:
res1 += blink(s, 25)
res2 += blink(s, 75)
# challenge 1
print(f"challenge 1:\n{res1}\n")
# challenge 2
print(f"challenge 2:\n{res2}")
+1
View File
@@ -0,0 +1 @@
0 1 10 99 999
+1
View File
@@ -0,0 +1 @@
125 17
+1
View File
@@ -0,0 +1 @@
1117 0 8 21078 2389032 142881 93 385
+148
View File
@@ -0,0 +1,148 @@
--- Day 12: Garden Groups ---
Why not search for the Chief Historian near the gardener and his massive farm? There's plenty of food, so The Historians grab something to eat while they search.
You're about to settle near a complex arrangement of garden plots when some Elves ask if you can lend a hand. They'd like to set up fences around each region of garden plots, but they can't figure out how much fence they need to order or how much it will cost. They hand you a map (your puzzle input) of the garden plots.
Each garden plot grows only a single type of plant and is indicated by a single letter on your map. When multiple garden plots are growing the same type of plant and are touching (horizontally or vertically), they form a region. For example:
AAAA
BBCD
BBCC
EEEC
This 4x4 arrangement includes garden plots growing five different types of plants (labeled A, B, C, D, and E), each grouped into their own region.
In order to accurately calculate the cost of the fence around a single region, you need to know that region's area and perimeter.
The area of a region is simply the number of garden plots the region contains. The above map's type A, B, and C plants are each in a region of area 4. The type E plants are in a region of area 3; the type D plants are in a region of area 1.
Each garden plot is a square and so has four sides. The perimeter of a region is the number of sides of garden plots in the region that do not touch another garden plot in the same region. The type A and C plants are each in a region with perimeter 10. The type B and E plants are each in a region with perimeter 8. The lone D plot forms its own region with perimeter 4.
Visually indicating the sides of plots in each region that contribute to the perimeter using - and |, the above map's regions' perimeters are measured as follows:
+-+-+-+-+
|A A A A|
+-+-+-+-+ +-+
|D|
+-+-+ +-+ +-+
|B B| |C|
+ + + +-+
|B B| |C C|
+-+-+ +-+ +
|C|
+-+-+-+ +-+
|E E E|
+-+-+-+
Plants of the same type can appear in multiple separate regions, and regions can even appear within other regions. For example:
OOOOO
OXOXO
OOOOO
OXOXO
OOOOO
The above map contains five regions, one containing all of the O garden plots, and the other four each containing a single X plot.
The four X regions each have area 1 and perimeter 4. The region containing 21 type O plants is more complicated; in addition to its outer edge contributing a perimeter of 20, its boundary with each X region contributes an additional 4 to its perimeter, for a total perimeter of 36.
Due to "modern" business practices, the price of fence required for a region is found by multiplying that region's area by its perimeter. The total price of fencing all regions on a map is found by adding together the price of fence for every region on the map.
In the first example, region A has price 4 * 10 = 40, region B has price 4 * 8 = 32, region C has price 4 * 10 = 40, region D has price 1 * 4 = 4, and region E has price 3 * 8 = 24. So, the total price for the first example is 140.
In the second example, the region with all of the O plants has price 21 * 36 = 756, and each of the four smaller X regions has price 1 * 4 = 4, for a total price of 772 (756 + 4 + 4 + 4 + 4).
Here's a larger example:
RRRRIICCFF
RRRRIICCCF
VVRRRCCFFF
VVRCCCJFFF
VVVVCJJCFE
VVIVCCJJEE
VVIIICJJEE
MIIIIIJJEE
MIIISIJEEE
MMMISSJEEE
It contains:
A region of R plants with price 12 * 18 = 216.
A region of I plants with price 4 * 8 = 32.
A region of C plants with price 14 * 28 = 392.
A region of F plants with price 10 * 18 = 180.
A region of V plants with price 13 * 20 = 260.
A region of J plants with price 11 * 20 = 220.
A region of C plants with price 1 * 4 = 4.
A region of E plants with price 13 * 18 = 234.
A region of I plants with price 14 * 22 = 308.
A region of M plants with price 5 * 12 = 60.
A region of S plants with price 3 * 8 = 24.
So, it has a total price of 1930.
What is the total price of fencing all regions on your map?
Your puzzle answer was 1415378.
--- Part Two ---
Fortunately, the Elves are trying to order so much fence that they qualify for a bulk discount!
Under the bulk discount, instead of using the perimeter to calculate the price, you need to use the number of sides each region has. Each straight section of fence counts as a side, regardless of how long it is.
Consider this example again:
AAAA
BBCD
BBCC
EEEC
The region containing type A plants has 4 sides, as does each of the regions containing plants of type B, D, and E. However, the more complex region containing the plants of type C has 8 sides!
Using the new method of calculating the per-region price by multiplying the region's area by its number of sides, regions A through E have prices 16, 16, 32, 4, and 12, respectively, for a total price of 80.
The second example above (full of type X and O plants) would have a total price of 436.
Here's a map that includes an E-shaped region full of type E plants:
EEEEE
EXXXX
EEEEE
EXXXX
EEEEE
The E-shaped region has an area of 17 and 12 sides for a price of 204. Including the two regions full of type X plants, this map has a total price of 236.
This map has a total price of 368:
AAAAAA
AAABBA
AAABBA
ABBAAA
ABBAAA
AAAAAA
It includes two regions full of type B plants (each with 4 sides) and a single region full of type A plants (with 4 sides on the outside and 8 more sides on the inside, a total of 12 sides). Be especially careful when counting the fence around regions like the one full of type A plants; in particular, each section of fence has an in-side and an out-side, so the fence does not connect across the middle of the region (where the two B regions touch diagonally). (The Elves would have used the Möbius Fencing Company instead, but their contract terms were too one-sided.)
The larger example from before now has the following updated prices:
A region of R plants with price 12 * 10 = 120.
A region of I plants with price 4 * 4 = 16.
A region of C plants with price 14 * 22 = 308.
A region of F plants with price 10 * 12 = 120.
A region of V plants with price 13 * 10 = 130.
A region of J plants with price 11 * 12 = 132.
A region of C plants with price 1 * 4 = 4.
A region of E plants with price 13 * 8 = 104.
A region of I plants with price 14 * 16 = 224.
A region of M plants with price 5 * 6 = 30.
A region of S plants with price 3 * 6 = 18.
Adding these together produces its new total price of 1206.
What is the new total price of fencing all regions on your map?
Your puzzle answer was 862714.
Both parts of this puzzle are complete! They provide two gold stars: **
+120
View File
@@ -0,0 +1,120 @@
#!/usr/bin/env python3
import sys
def adjacent(x,y,pos):
dirs = [(0,1), (1,0), (0,-1), (-1,0)]
for p in pos:
for d in dirs:
if p[0] == d[0] + x and p[1] == d[1] + y:
return True
return False
def join(rs):
if len(rs) == 1: return rs
removable = []
for i in range(len(rs)):
if i in removable:
continue
r1 = rs[i]
for j, r2 in enumerate(rs[i+1:]):
if j+i+1 in removable: continue
for r in r1:
if adjacent(*r,r2):
r1 += r2
r2 = []
removable.append(i+1+j)
break
for i in sorted(removable, reverse=True):
rs.remove(rs[i])
if __name__ == '__main__':
plots = [list(line.strip('\n')) for line in open(sys.argv[1])]
def fence(p):
x,y = p
dirs = [(0,1), (1,0), (0,-1), (-1,0)]
fences = 0
for d in dirs:
nx = d[0] + x
ny = d[1] + y
if 0 <= nx < len(plots[0]) and 0 <= ny < len(plots):
if plots[y][x] != plots[ny][nx]: fences += 1
else: fences += 1
return fences
def disc_fence(region):
fences = 0
horizontal = {}
vertical = {}
for (x,y) in region:
v = [(1,0), (-1,0)]
h = [(0,1), (0,-1)]
for d in v:
nx = d[0] + x
if 0 <= nx < len(plots[0]):
if plots[y][x] != plots[y][nx]:
if (x, nx) in vertical: vertical[(x,nx)].append(y)
else: vertical[(x, nx)] = [y]
else:
if (x, nx) in vertical: vertical[(x,nx)].append(y)
else: vertical[(x, nx)] = [y]
for d in h:
ny = d[1] + y
if 0 <= ny < len(plots):
if plots[y][x] != plots[ny][x]:
if (y,ny) in horizontal: horizontal[(y, ny)].append(x)
else: horizontal[(y, ny)] = [x]
else:
if (y,ny) in horizontal: horizontal[(y, ny)].append(x)
else: horizontal[(y, ny)] = [x]
for ys in vertical.values():
prev = -2
for y in sorted(ys):
if y - prev > 1: fences += 1
prev = y
for xs in horizontal.values():
prev = -2
for x in sorted(xs):
if x - prev > 1: fences += 1
prev = x
return fences
# 'A': [[(x,y), (x,y),..],...]
regions = {}
for y, pls in enumerate(plots):
for x, p in enumerate(pls):
if p not in regions:
regions[p] = [[]]
regions[p][0].append((x,y))
else:
t = False
for l in regions[p]:
if adjacent(x,y,l):
l.append((x,y))
t = True
break
if not t: regions[p].append([(x,y)])
res1, res2 = 0, 0
for p, rs in regions.items():
join(rs)
join(rs)
for r in rs:
res1 += sum(map(fence,r)) * len(r)
res2 += disc_fence(r) * len(r)
# challenge 1
# 1400060 is too low! -> double join.. not very nice xD
print(f"challenge 1:\n{res1}\n")
# challenge 2
print(f"challenge 2:\n{res2}")
+10
View File
@@ -0,0 +1,10 @@
RRRRIICCFF
RRRRIICCCF
VVRRRCCFFF
VVRCCCJFFF
VVVVCJJCFE
VVIVCCJJEE
VVIIICJJEE
MIIIIIJJEE
MIIISIJEEE
MMMISSJEEE
+4
View File
@@ -0,0 +1,4 @@
AAAA
BBCD
BBCC
EEEC
+5
View File
@@ -0,0 +1,5 @@
OOOOO
OXOXO
OOOOO
OXOXO
OOOOO
+5
View File
@@ -0,0 +1,5 @@
EEEEE
EXXXX
EEEEE
EXXXX
EEEEE
+140
View File
@@ -0,0 +1,140 @@
IIIIIIIXXXXXXXXXXXXXCCCCCCCCCCCCCCCCCCXXXXXXXQQYYYYYYYYYFFFFFFFFFFFSSSSSUUUOOUUUUUUUUMJJJJMMMGGGGGGGGGGQQQQYYYYYYYYYYYYYYYNQQQQNNNNNNNNNNNNN
IIIKIIXXXXXXXXXXXXXXCCCCCCCCCCCCCCCCCXXXXXXXXXXYYYYYYYYYYYFFFFFFFFFSSSUUUUUOOUUUUUUUUMJJJJJMMGGGGGGGGGGGGQQQQYYYYYYYYYXYYYNNNNNNNNNNNNZNZZNN
IIKKIIXXXXXXXXXXXXXXKKCCCCCCCCCCCCCXXXXXXXXXXXXYYYYYYYYYYYKKFFFKFFFSSUUUUUUUOUUUUUUUUUJJJJJJMGGGGGGGGGGGGQQQQQYYYYYYYYYYYYNNNNNNNNNNZZZZZZZZ
IIKKIIIIXXXXXXXXXXXKKKCCCCCCCCCCCCCCXXXXXXXXXXXXYYYYYYYYYYKKKKKKKKFFSUUUUUUUOUCUUUUUUUJJJJJJGGGGGGGGGGGQGGQQQYYYYYYYYYYYYNNNNNNNNNZZZZZZZZZZ
KKKKKKIIXXXXXIXXKXXKKKCCCCCCCCCCCCCXXXXXXXXXXXXXXYYYYYYKKKKKKKKKFKFFFFUUUUUUUUCUUUUUUUJJJJJJBBGGGGGGGGGQQQQQYYYYYYYYYYYYYYNNNNNNVNZZZZZZZZZZ
KKKKKKKKKXXXXXXXXXKKKKCCCBCCCCCCXXXXXXXXXXXXXXXXYYYYYYYKKKKKKKKKFFFFFUUUUUUUUUCUUUUUUUJJJJJJBHGGGGGGGGGGQQQQYYYYYYYYYYYYYNNNNNNZZZZZZZZZZZZZ
KKKKKKKKKKKXXXXXXKKKKKCCCBBBCCCCCCXXXXXXXXXXXXXYYYYYYYYYYOKKKKKKFFFFUUUUUUUUUCCCCCCNNUJJOJHTHHHGGGGGGGGQQQQQYQYYYYYYYYYWYYYYNNNNZZZZZZZZZZZZ
KKKKKKKKKKKQQXXXKKKKKKCCBBBBCCCCCCXXXCXXXXXXXXXYYYYYYYYYYKKKKKKKFKKFFUUUUUCCCCCCCCCNNNJOOHHHHHHHGGGGGGGAAQQQQQQQYYYYAYYWWYNNNNNNNDDZZZZZZZZZ
KKKKKKKKKKKQXXXXKKKKKBBBBBBBBBBCCCCXXCXXXXXXXXXYYYYYYYYYYKKKKKKKKKKFFFUUUUCCCCCCCCCNNNHHHHHHHHHGGGGGGGGGAQQQAAQQYHHLYYHWWYDNNNNDDDDZZZZZZZZZ
KKKKKKKKKQQQQQXXKKKKKBBBBBBBBBBCCCCXCCCXXXXXCXXCYYYYYYYYYKKKKKKKKKKFKKQQUCCCCCCCCCCNNNHHHHHHHHHHGGGGGGGAAAAAAAAAYHHHHHHHWWDDNNNNDDZZZZZZZZZZ
KKKKKKKKKKSQQQKKKKKKBBBBBBBBBBBCCCCCCXXXXXXCCCCCCCYYYYYYYKKKKKKKKKKKKKQQQCCCCCCCCCCWWNNHHHHHHHYHGGJJGGGAAAAAAAAMMMHHHHHHWDDDDDDDDDDZZZZZZZZZ
KKKKKKJKKKSSKKKKKKKKBBBBBBBBBBBCCCCCXXXXXXXCCCCCCYYYCYYKKKKKKKKKKKKKKKQCCCCCCCCCCCWWWWHHHHHHHHHHHJJJAGAAAAAAAAAMMMMHHHHHHDDDDDDDDDDDZZZZZZZZ
KKKKKKJKKSSSEEKKKKKKKBBBBBBBBBCCCCCCCXXXCCXCCCCCCCCYCCYBKKKKKKKKKKKKKKKLLCLLEECCCWWWWWWHHHHHHHHHHHHHAAAAAAAAAAAAAHHHHHHHHHDPDDDDDDDZZZZZZZZZ
KKKKKKJJKSSEEKKKKKKBBBBBBBBBBBCCCCCCCCCXCCCCCCCCCCCCCCCCKUUKKKKKKKKKKKKLLLLLEECCEWWWWWWHHHHHHHHHHHHAAAAAAAAAAAAAAAHHHHHHHHHPPDDDDDDZZZZZZZBB
KKKKKJJJJSSSJJNKKBBBBBBIBBBUUUUUCCCCCCCCCCCCCCCCCCCCCCCUUUKKNNNKKKKRFKKLLLLEEEECEWWWWWWHHHHHHHHHHAAAAAAAAAAAAAAAAHHHHHHHHHHHDDDPDDDDZZZBBBBB
KKKKJJJJJSSSJJNNKKKBBBIIIIXXXUUYUUCCCCCCCCCCCACCCCCPCCCUUUUNNNNNKKKRRRLLEEEEEEEEEEWWWWWWHHHHHHHHAAAAMAAAAAAAAAAAAAAHHHHHHHHSDDPPDDDDZZZBBBBB
KKKJJJJJJSSSJJJNNKMBBBBBJXXXXUUYUUCCCCCCCCCCCCCCMCCCYYYYUUNNNNNNRRRRLLLLLEEEEEEEEWWWWWWWWWHHHHHAAAAMMMMMAAAMAAAAAAAHHHHHPPHSPPPPDDDDZZBBBBBB
KKBBBBJJJSSSJJJJJKBBBBBKJUUUUUUUUUUUCCUCCCCCCHHHHZZZYYYYYUNNNNNNNRRRLLLLEEEEEEEEEEWWWWWWWWHHHHRRAAAMMMMMMMMMMMAAAAAHHHHHPPPSSPPPDPDDZZBBBBBB
BBBBBBJJJJSSJJJJJQBQBCJKJUUUUUUUUUUUUUUUCCCCCHCHHHHYYYYYYUNYYNLRRRRLLLEEEEEEEEEEEEWWWWWWWWWWWHHRRAAMMMMMMMMMMMQQQQAHHHHPPPPPPPPPPPDBVVBBBBBB
BBBBBBJJJJSSJJJJJQQQJJJJJJUUUUUUUUUUUUUUCCCHHHHHHHHHHYYYYYNYYLLLRRLLLKKKKEEEEEEEEWWWWWWWWWWWWWWRRAMMMMMMMMMMMMQQQQQQHHPPPPPPPPPPPUBBBBBBBBBB
BBBBBJJJJJJJJJJJJQJJJJJJJJJJUUUUUUUUUCCCCCCCHHHHHHHHYYYYYYYYLLLLLLLLLKKKKKKKEEEEEEEEEEWWWWWWWWWRRRMMMMMMMMMMMMQQQQQQKRPPPPPPPPPUUUBBBBBBBBBB
BBBBJJJJJJJJJJJJJJAJJJJJJJJJUUUUUUUUUUCCCCHCCHHHHHYYYYYYYYYYLLLLLLLLKKKKKKKKEEEEEEEEEEWWWWWWWTMRRMMMMMMMMMMMMGOOQQQKKKPPPPPPPPPUUUBBBBBBBBBB
YYBBBJJJJJJJJJJJJAAJJJJJJJUUUUUUUUUUUCCCCHHHHHHHHHYYYYYYYYYYYLLLLLLLKKKKKKKKKKKEEEEEEEWWWWWWWTMMMMMMMMMMMMMMMOOOQQKKKPPPPPPPPPPUUUBBBBBBBBBB
YYYYJJJJJJJJJJJJFLAAJJJJJJUUUUUUUUUUUUCCHHLHHHHHYYYYYYYYYYYYLLLLLLLLKOJJJKKKKKEEEEEEEEWWWWWWWTMMMMMEMMMMMMMMMOOOQKKKKKPPPPPPPPPPPBBBUBBBBBBB
YYYJJJJJJJJJJJJJJLLAJJJJJJJUUUUUUUUUUUUUHHLHHHHHCYYYYYVVVGGGGLLLLLLLKJJJJKKKKKEEEEEEYWWWWWWWWMMMMEEEMMMMMMMOOOOOOWKKKKPOPKKPPPPPPUUUUBBBBBBB
YYYYYJJJJJJJJJLLLLLLPPJJJJUUUWWWWWUUUUHHHHHHHHHHCYYYYXVVVGGGGLLLLLLLLJJJKKKKKSEEEEEEEWLLLWWWWMMMEEEEMMMMMMMOOOOOOWKKKKKPPKKKPPPPPUUUBBBBBBBB
YYYYYYJJJJJJJLLLLLLLLPJJUUUUUUWVWWUUUEEHHHHHHHHHHYHYXXXVVVVVLLLLLLLLLLJJKKKKKKEEEEEELLLLWWWAMMMEEEMEMMMMMMMOOOOOOWKKKKKKKKKKPPJJJUUUBBBBBBBA
YYYYYYLLAJJJJJLLLLLLLLJJJUJJJJWWWWWBUHHHHHHHHHHHHHHHXVVVVVVVVLQQLQQQLJJJKKKKKKEEEEEELLLLLXXAXMMMEKMMMMMMMMMMMOOOKKKKKKKKKKKKKPJJJJJJBBBBBBBB
YYYYYLLLLJLLLLLLLLLLLLJJJJJJJWWWWWWBBHHHHHHHHHHHHHHHHPVVVVVVVQQQQQQQQQEEEEKKEEEEEOLLLLLLLLXXXXXMKKCCMMMMMMMOOOOOKKKKKKKKKKKKKKKKJJJBBBBBBBBB
YYYYYLLLLJLLLLLLLLLLLLJJJJJJJWWWWWWWBBHHHHHHHHHHHHHHDDGVVVVVVVQQQQQQQQEEEEEEEEEEEOOLLLLLLLXXXXXMMKKCCMMMMOOOOOOKKKKKKKKKKKKKKKLKBJBBBBBBBBBB
YYYLLLLLLJLLLLLLLLLLLLLJJJJWWWWWWWWWWBBHHHHHHHHHHHDHDGGVVVVVVVQQQQQQEEEEEEEEEEOOOOOLLLLLLLXMMMMMKKKCCCCMMOOOOOOOOFKKKKKKKKKKKKKKBBBBBBBBBBBF
YYYLLLLLLLLLLLLLLLLLLJJJJJJJWWWWWWWBBBBBHHHHHHHUUHDDDGGGVVVVVQQQQQQQQEEEEEEEEOOOOOOLLLLLLLXXXXZKKKKCCCEEMOOOOOOFFFQKFKKKKKKKKKKKJBBBBBBBBBBF
YYYYLLLLLLLLLLLOLOOOLJJOJJJJJXWWWWWBBBBBHHHHHHHHUHDDDGVVVVVVVVQQQQQQQEEEEEEOOOOOOOOOLOLLLKKKKKKKKKCCCEEEOOOOOOOFFFQFFFKKKKKKKKKJJBBBBBBBBBBF
YYYYYLLLLLLLLLLOOOOOLOOOOJJJXXWWWWBBBBQQHGHHHHHHUHDDDGVVVVVVVVQQQQQQEEEEEEEEXXOOOOOOOOLLGKKKKKKKKKKEEEEEEOEOOFOFFQQFFFFKKKKKKKOZZBBBZBBBBBFF
YYYYYLLLLGLLLGGGGGOOOOOOOOJXXXWOWWBBBQQQQHHHHHHHHHDVVVVVVVVVVVDQQQQQLEEEEEEOOOOOOOOOOLLKKKKKKKKKKKPPPEEEEEEOOFFFFFFFFFFFFFKKKKOOZUZZZZBBBBBB
YYYLLLLGGGGLGGGGGOOOOOOOPXJXXXXXBBBBBBQQQQQHHHHHHHDDVDDDVVDDDDDQQLLQLLLYEEEYOOOOOOOOOUKKKKKKKKKKKKKPPPEEEEOOOFFFFFFFFFFFFMMKMKKOZZZGZBBJJJJJ
YYYLGGLGGGGGGGGGOOOOOOOOOXXXXXXXBBBBBQQQQQQQHHQQDDDDDDDDDDDDDDDLLLLLLLLYYVYYQOOOOOOOOKKKKKKKKKKKLKPPPEEEEEOOOOFTFFFFFFFFFMMMMFKOZZZZZJJJJJJJ
YYYGGGGGGGGGGGGOOOOOOOOXXXXXXXXXXBIIIIIQQQQQHHQQQQQQQDDDDDDDDDDLLLLLLLLYYYYQQOOOOOOOOOOKKKKKKKKKKPPPEEEEEOOOOOOTFFFFFFFFFFMFFFZZZZZZZZJJJJJN
YYYQGGGGGGGGGGOOOOOOOOOXXXXXXXXBBBIIIIQQIIIQQQQQQYQQKKKDDDDDDDDLLLLLLLLYYYYQQOOOOOOOOOOKKKKKKKKKKPPPEEEEEEOOOOFFFFFFFFFFFFFFFZZZZZZZZZJJNJJN
YYYYTTTGGGGGGGOOOOOOOOOOXXXXXXXBBBBIIIIIIIIQQQQQQQQQKKKKKDDDDDDLLLLLLLLYYYYYOOOOOOOOOOOPPPPPPKKKKPPPPEEEEEEEOFFFFFFFFFFFFFFFFFZZZZZZZJJJNNNN
TTYTTTTTGGGGGGOOOOOOOXXXXXXXXXXXXBIIIIIIIIIQQQQQQQQQKKKDDDDDDDDDLLLLLYYYYYYYOOOOOOOOOOOPPPPPPPPPPPPEEEEEEEEEFFFFFFFFFFFFFFFFFFFFFZZOZZJNNNNN
TTTTTTTGGDDGGOOOOOOOOXXXXXXXXXXIIIIIIIIIIIIQQQIQQQQQKKKDDDDDDDDLLLLYYYYYYYYYOOOOOOOOOOPPPPPPNNPPPPPPEEEEEEEEEQFFFFFFFFFFFFFFFFFFFZZDDZDDNNNN
TTTTTTTTGGOOOOOOOOOOOXXXXXXXXXXRIIIIIIIIIIIIIIIQQQKKDDDDDDDDDDDLLLLLYYYYYYYYOOOOOOOOOOOPPPPPNNPPPPPPPEEEEEEEEQEFSRFFFFFFFFFFFFFFFZDDDDDDNNNN
TTTTTTTTTTOOOOOOOOOOOOOXXXXXXXXXXIIIIIIIIIIIIIQQQQQMMMMMMMDDDDDMMMMMMMHHYYYYOOOOOOOOOOOPPPNNNNPPNPPOPEEEEEEEEEERRRFFFFFFFFGZFZFDDDDDDDDNNNNN
TTTTTTTTTTTOOOOOOOONONNNNXXXXXXXXIIIIIIIIIIIIIIQQQQMMMMMMMMMMMMMMMMMMMHYYYOOOOOOOOOOOOOPPPNNNNNNNPOOPOOEEEEEEFFRRRZZFFFFFZZZZZZDDDDDDDDTNNRN
TTTTTTTTTTTQOOOOOOONNNNNXXXXXXXXIIIGIIIIIIIIIIIPPQMMMMMMMMMMMMMMMMMMMMHYYYOOOOOOOOOOOOOPPNNNNNNNNPOOOOOOEEORRRRRRRRZZZZLZZZZZZDDDDDDDDDDDDRR
TTTTTTQQQTTQOOOOOOODNNNNXNXXXXXXXXXGIIIIIIWIINIMMMMMMMMMMMMMMMMMMMMMMMHYYYYYOOOOOOOOOOONNNNNNNNNNPOOOOOOOOOORRRRRRRZZZZZZZZZZDDDDDDDDDDDDDDD
TTTTTTQZQQQQQOOOFOOONNNNNNXXXGGXXXXGIIIWWWWWWWIMMMAMMMMMMMMMMMMMMMMMMMHYYYYOOOOOOOOOOOOONNNNNNNNNPOOOOOOOOOORRRRRRRZZZZZZZZZZDDDDDDDDDDDDQQD
TTTTTQQQQQQQQOEOOONFNNNNNNXGXGGXXXGGGWWWWWWWNWNNMMMMMMMMMMMMMMMMMMMMMMHYYYYOOOOOOOOOOMOMMNNNNNNMMOOOOOOOOOORRRRRRRRRZZZZZZZZZDAADDDDDDDDDQQQ
TTTTTQQQQQQQQOQQQONNNNNNNNGGXGIGGGGGGWWWWWWWWWNNFAAMMMMMMMMMMMMMMMMMMMYYYTTHHOOOOOOOMMMMMNNNNNNMOOOOOOOOOOOORRRRRRRZZZZZZZZZZZAPDPPPPDDDDQQQ
TATTTQQQQQQQQQQQQQQQQNNNNNGGGIIIIGGGGGWWWWWWWWWNFAAMMMMMMMMMMMMMMMMMMMYTTTTHHHOOOOOOMMMMMNMMNNMMOOOOOOOOOOOORRRRRRZZZZZZZZZZPPAPPPPPPDDDQQQQ
AAATTQQQQQQQQQQQQQQQGNNGGGGGIIIIIGIGZZZWWWWWWWWFFAAAAAAAPMMMMMMMMMMMMMTTTTTHHHOOOOOOMMMMMNMMMNMMOOOOOOOOOOOOVRZZRRZZZZZZZZZZPPPPPPPPPPDPQQQQ
AAAATQQQQQQQQQQQQQQQGGGGGGGIIIIIIIIGZZZWWWWWWWFFFFAFFAAAPMMMMMMMMMMTTTTTTTTHHHOUUUUOMMBBMMMMMMRRRRRRRROOOOOOOOZRRZZZZZZZZZZZPPPPPPPPPPPPQQQQ
AAAAAQGQQQQQQQQQQQQGGAAAAIIIIIIIIIIIZZZWWWWWFFFFFFFGFAAAPPPPPPPPPPDTTTTTTTTTTTOUUUUUBBLBMMMMMMRRRRRRRROOOOOOOOZZZZZZZZZZZZZZPPPPPPPPPPPPQQQQ
AAAAAAQQQQQQQQQQQQQAGGAAAIIIIIIIIIIWZZZWWWFFFFFFFFFFFAFAFPPPPPPPTTTTTTTTTTTTTTUUUUUUBBBBBBBBMMRRRRRRRROOOOOOODZDDDZZZZZTTZZPPPPPPPPPPPPPPQQQ
AAAAAAAAQQQAAAQQQQQAAAAAAAIIIIIIIIIWZZZWWFFFFFFFFFFFFFFFFPPPPPPPPTTTTTTTTTTTTTTTUUUUUBBBBBBMMMRRRRRRRROOOOOODDDFFDDZZZTTTTZPPPPPPPPPPPPPPPQQ
KAAAAAAAAQAAAAAWWWAAOAAAAAIIIIIIIIIIZZZWWWFFFFFFFFFFFFFFFFPPPPPPPTTTTTTTTTTTRRRRZUZZUBBBBBBMMMRRRRRRRROOOOOOVDDFDDDZZTTTTTTTPPPPPPPPPPPPPQQQ
KAAAAAAAAAAAAAAAAANNAAAABBIIIIIIIIIIZZZWWWWFFFFFFFFFFFFFFFPPPPPPPTTTTTTTTTTTRRRRZUZZUUBBBBBBMMRRRRRRRROOOOORRRRRRRRDZTTTTTTTPPPPPPPPPPPPPQQQ
AAAAAAAAAAAAAAAAANNNNBBBBBBIBIBIIIIIZZZWFFWFFFFFFFFFFFFFFPPPPPPPPOOTTTTTTTTTTTTZZZZRRRRRRRRRRRRRRRRRRROOOVVRRRRRRRRDDTTTTTTTPPPPPPPPPPPPPPQQ
AAAAASAAAAAAAAWWWBBBBBBBBBBBBMBBRIIWZZZWFFFFFFFFFFFFFKFFBPPPPPPOOOOXXTTTTTTTTTTZZZZRRRRRRRRRRRRRRRRRRRVVVVVRRRRRRRRDDTTTTTTTPPPPPPPQPPPQQQQQ
AAAAASAAAAAAAAWWWBBBBBBBBBBBBBBBWWZZZZZWFTFFFFFFFFKKKKFKPPPPPPPOOOOOXXTTTTTZZZZZZZZRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRDDTTTTTTTTPPPPPPRUPPQQQQQ
AAASSSAAAAAAAWWWWWBBBBBBBBBBBBBBWWZZZWWWFTTFFFFBKKKKKKKKPPPPPJOOOOOOOOTTTTTZZZZZZZZRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRSTTTTTTTTPPRRRRRRQQQQQQQQ
SAASSSSSAAAWWWWWBBBBBBBBBBBBBBBVVAZZZWWWMTTFFFFFKKKKKKKKPPPPPJJOOOOOOOTTTTOZZZZZZZZRRRRRRRRRRRRVVVVRRRRRRRRRRRRRRDDSSTTTTTTTTTEERRRRRRQQQQQQ
SSSSSSSWWWWWWWWWWWBBBBBBBBBBBBBBAAZZZXWMMMTMFFMMMKKKKKKKKPPPPPJOOOOOOOOOTTOZZZZZZZZRRRRRRRRRRRRVVVVRRRRRRRRRRRRRRDSSSTTTTTTTTTERRRRRRRRQQQQQ
SSSSSSSWWWWWWWWWWWWBBBBBBBBBBBBXXAZZZXMHMMMMMMMMMMKKKKKKKKKKPPPPOOOOOIOOOOODZZZZZZZZZZZRRRRRRRRVVKVRRRRRRRRRRRRRRSSSTTTTTTTTEEERRRRRRRQQQQQQ
SSSSSSSSWWWWWWWWWWBBBBBBBBBBTBBXXXZZZMMMMMMMMMMMMMKKKKKKKKKKPHOOOOOOOIOOOOODZDDZZZZZZZZRRRRRRRRVVKVRRRRRRRRRRRRRRSSSSSSSTEETEEEERRRRQQQQQQQQ
SSSSSSSSWWWWOOWWWWWBBBBBBBBBTTBXXXZZZMXMMMMMMMMMMMMKKKKKKKKKOOOOOOOIIIOOODDDDDDZZDZZZZZRRRRRRRRVVVVRRRRRRRRRRRRRRSSSSSSSTEEEEEEELLBRQQQQQQQQ
SSSSSSSSWWWOOWWWWWBBWVNBBBNBBBBXXXXMMMMMMMMMMMMMMMMMKKKKKKHKHOOOIIIIIIIOODDDDDDDZDZZZZZRRRRRRRRVVIVRRRRRRRRRRRRRRSSSSSSSTEEEEEEELLLRQLQQQQQT
SSSSSSSWWOOOOWWWWWWWWVBBBBNBBBBXBBBGGGMMMMMMMMMMMMKKKKKKKKHHHHOOIIIIIIIDDDDDDDDDDDZZZZZQQQQQQQQQIIVRRRRRRRRRRRRRRSSSSSSSEEEEEEEEELLLLLTTTTTT
SSSSSSWWOOOOOWWWVVVVVVVEBBDDBSBBBBBBBBBMMMMMMMMMMMKKKKKKKKHHHHIIIIIIIIIDDDDDDDDDDDDZZQQQQQQQQQQIIIIIUUURRRRRRRRRRSSSSSSREEEEEEEEELLLLLLLTTTT
SSSSSSWOOOOOOOWWWVVVVVVVDDDDBSBBBBBBBBBBMMMMMMMMMKKKKKKKHHHHHHIIIIIIIIIEDDDDDDDDDDXDQQQQQQQQQQQIIIIIUUUUUUUIISSSSSSSSSSRRERRRREEEELLLLLLTTTT
SSSSSSWWOOOOOOOOOVVVVVVVDDDDBBBBBBBBBBBBMMMMMMMMMKKKKKKKHHHHHHHIIIHIIIFDDDDDDDDDDDDDQQQQQQQQQQIIIIIIIUUUUUUIISISSSSSSSSRRERRRREEEELLLLLLTTTT
SSSSSSWWOOOOOOOOOOOVVVVVDDDDBBBBBBBBBBEEEMMMMMMMMKKKKKKPKHHHHHHIHHHHHHDDDDDDDDDDDDDDDDQQQQQQIIIIIIIIIUUUUUUIIIIISSSRRSXRRRRRRRRRBEELLLLLTTTT
SSSSSWWWOOOOOOOOOOOVVVVVDDDDBBBBBBBBCBBEEMMMMOOOKKKKKKKKKKKKKHHHHHHHDDDDDDDDDDDDDDDDDDQQQQQQMIIIIIIIUUUUUUIIIIIIIRRRRSSRRRRRRRRBBBBBLLLTTTTT
SSSSSSOOOOOOOOOOOOOVVVVVDDDDDBBBBBBBBEEEEMEMMOOKKKKKKKKKKKKKKHHHHHHHDDDDDDDDDDDDDDDMODQQQQQMMIIIOOOIIUUUOUIIIIIIIIRROOOOOOOOOORBVBBBLLLLLTTG
SSSSSSSOOOOOOOOOOBOVVVVVDDDDDEEBBBBBBEEEEEEOOOOOKKKKKKFKKKKKKHHHHHHHHDDDDDDDDDDDMDDMMMQQQQMMMMMIOIIIIIUUUUUIIIIIIIRROOOOOOOOOORYBBBBLBBLLLLG
KSSSSSOOOOOOOOOOOBOFVVDDDDDDDDEBEEBEEEEEEEEEOEOOKLKKKKKKKKKKKHHHHHHDDDDDDDDDDDDDMMMMMMMMQZMMMMMMOOOIIIIUUUIIIIIIIIRROOOOOOOOOOYYBBBBBBBLLLGG
KSSKKKXXXOOOOOOOOOFFVVDDDDDDDEEEEEEEEEEEEEEEEEEOOKKKKKKKKKKKKKHHHHHDFDDDDDDDDDDDMMMMMMMMZZMMMDDMOOOIIIIUUIIIIIIIIIIROOOOOOOOOOYYBBBBBBQIIIIG
KSKKKKXXXOOOOOOOHMFFVVDDDDDDDDEEEEEEEEEEEEEEEEEOOKKKKKKKKKKKKKHHHHHDFDDDDDDDDDDEEMMMMMMZZZMMMMMOOOOOOIIUIIIIIIIIIIIROOOOOOOOOOYYBBILBQQIIIII
KKKKKKKKKQOOOOOOOMFFVVVDDDDDEEEEEEEEEEEEEEEEEEEEOSSSSKKKKKKKKKHHHHHMMUDDDDDDDDTEEEMMMMMMZMMMMMOOOOOOOIIIIIIIIIIIIIRNOOOOOOOOOOYBBBIBBBBIIIII
KKKKKKKBBGGUOOOOOMMFMGDDDDDDEEEEEEEEEEEEEEEUEEEEOSSSSKKKKKKKQKKHHHHMMUUDDDDDDDTTTTTMMMMZZZZMMMMOOOOOOOOIIIIIIIIIIIRRRRRROOOOPYYIBIIIBIIIIIII
KKKKKKKBYYGGCCCODMMMMDDDDDDDEEEEEEEEEEEEEEEEEEEEOSSSSKSSSKSKKHHHHMMMMMUUTDDDTQTTTTMMMMMMZZZMMMOOOOOOOBOIIIIIIIIIIIIIRRRROOOOYYYIIIIIIIIIIIII
KKKKKKKYYYGGCCCTTTTTTPPDDDDDEEEEEEEEEEEEEEEEEEEEOSSSSSSSSSSSSHHHHHMMMMMMTTTTTTTTTXMYMGMMMMZZOOOOOOOOOOIIIIIXIIXXIIIIIIIIMPPPPYIIIIIIIIIIIIII
KKKKKKEEYYGGCCCTTTTTTTTDDDDDOCCEECCEEEEEEEEEEEEOOSSSSSSSSSSSSHHHHHMQYMMMTTTTTTTTTTTTLGGGOOOOOOOOOOIOOAIIIIIXXXXXXIIIIIMMMMPPPPIIIIIIIIIIIIII
KKKKKKEEYYYGCCCTTTTTTTTDDDUDCCCVVCCEYYEEEEEEEEEEOOSSSSSSSSSSSYYYYYYYYYPPPPTTTTTTTTSSGGGGGGGOOOOOOIIIOIIIIIIXXXXXXXIIIMMHMMMPMPMIIIIIIIIIIIII
KKKKKFYYYYYYCCCTTTTTTTTQDDDDCCCCCCCCYYYYEEEEEEEWOWSSSSSSSSSSYYYYYYYYYYYPPPPTTTTTTTKKBBGGGGGGGOOOOIIIIIIIIAAXXXXXXXIMMMMMMMMMMMMMIYIIIIIIIIII
KKKDFFYYCUCCCCCCTTTTTTTTWWWCCCCCCCCCCCYYYEEEEESWOWWWSSSSSSSSYYYYYYYYYYYYPPPTTTTPPPKKKBBGGGGGGOOOOIIIIIIIIAIXXXXXMIIIIMMMMMMMFFFFFIIIIIIIIIJJ
DDDDFFFFUUUUCCCCTTTTTTTTWWWCCCCCCCYYYYYYYEEEEEEWWWWWWWWSSSSVVYYYYYYTYYPPPPPPPPPPKPKKKBBKGQGGGOOIIIIIIIIDDDDDDDDDDMMMMMMMMMMHHFFFFIIFIIIIIJJJ
DDDDDFFUYUUUUTTTTTTTTTTTWWWCCCCCCCYYYYYYYYEEEEKWWWWWWWWWSSSVVYYYYYYYYPPPPPPPPPPPKKKKKKKKQQIGGOIIIIIIIIIDDDDDDDDDDMMMMMMMMMMHHHFFFFFFIIIIIIIJ
DDDDDFFUUUUUWTTTTTTTTTTTTTWWCCCCCCCYYYYVVEEVEEKWWWWWWWWWWWSVVYYYYYYYPPPPPPOPOPOOKKKKKKKKKQIIIIIIIIIIIIIDDDDDDDDDDMMMMMMMMMMMHFFFFFFFFFFIIFIP
DDDDDDDCCUUTTTTTTTTTTTTTTTWWCKCCCYYYYVVVDEVVEEKVWQQQQQQWWWSVVVYYYYPPPPPPPPOPOOOKKKKKKKKKKQIIIIIIIIIIIIIDDDDDDDDDDMMMMMMMMMMHHHFFFFFFFFFFFFPP
DDDDDDDCUUUTTTTTTTTTTTTTTTTWWMMYYYYYYVVVVVVVVVVVVQQQQQQWWWNNNNYYYYYPPPPPOOOOOOKKKKKKKKKRRIIIIIIIIIIIIIHDDDDDDDDDDMMMMMMMMMMMMFFFFFFFFFFFFFFP
DDDDDDDDUUUTTJTTTTBTTTTTTTTMMQMMMYYYYVVVVVQQQQQQQQQQQQQNBNNNNNNNNNPPPPPPOOOOOOOOKKKKKKKRRRIIIIIIIIIIIAHDDDDDDDDDDMMMMMMMMMMQRFFFFFFFFFFFFPPP
DDDDDDDDJUUJJJTTBBBBTTTTTTSMMMMMMYYYYVVVVVQQQQQQQQQQQQQNNNNNNNNNNNNPPPPPPOOOOOOOOOOJKKKGGIIIIIIIIIIIAAADDDDDDDDDDFMZMMMMMMMRRRRFFFFFFFFFPPPP
DDDDDDJJJJUJJBQBBBBBTTTTTTSMMMMMMYYYQQQQQQQQQQQQQQQQQQQGGNNNNNNNNNNNPPPPOOOOOOOOOOOOGGGGGIIIIIIIIIIAAAADDDDDDDDDDFFZMMMMWMMMRRRFFFFFFFFFPPPP
NDDKDDKJJJJJBBBBBBBTTTTHBTTMMMMMMYYYQQQQQQQQQQQQQQQQQQQGNNNNNNNNNNNNPPPOOOOOOOOOOOYOGGGGGIIIIIIIIIAAAAADDDDDDDDDDFFFFMMMMMMMRRFFFFFFFFFFPPPP
KDDKKDKWWWJJJBBBBBBBBBBBBMTMMMMMMYYVQQQQQQQQQQQQQQQUGGGGGNNNNNNNNNMNNPOOOOOOOOOOOOYGGGGGGYIGIIIIIAAAAAAAAAAAFFFFFFFFFFFSRRRRRRRPRFFFFFFFPPPP
KKKKKKKWWWJJJBBBBBBBBBBBBBBMMMMMMYMOVVVVVQQQQQQQQQUUGGNGNNNNNNNZZPZNZZNNOOOOOOOOOOOGGGGGGGGGGIIIAAAAAAAAAAAAAFFFFFFFFFFRRRRRRPPPPFFFPPPPPPPP
KKKKKKKWWWWJJBBBBBBBBBBBBBBBMMOOMMMOOVVVVQQQQQQUTUUUUUNNNNNNNNZZZZZZZNNNNOCOOOOOOOGGGGGGGGGGGJIAAAAAAAAAAAAAAFFFFFFFFFFFFRRPPPPPPPFPPPPTPTTT
KKKKKKKWWWWJJBBBBBBBBBBBBBBBBBBOOMOOOOIVGQQQQQQJZUUMMMNNNNNFNNZZZZZFZZNNNOCOOOOOOOGGGGGGGGGGGJJAAAAAAAAAAAAAAAAFFFFFFFFVVRPPPPPPPPPPPPTTTTTT
KKCKKKKWWWMMJBBBBBBBBBBBBBBBBBBOOOOOOGGGGQQQQQQZZZZZZMMNNNNFNNZZZZZZZZZNNNCOOWOVOGGGLLGGGGGJGJJAAPAAAAAAAAAAAZSSFFFFFFVVVVPPPPPPPPPPPPTTTTTT
KKCKMKKWWWMMMMBBLBBBBBBBBBBBBBBOOOOOOGGGGQQQQQQZZZZCCNNNFNNFFFFFZZZZZZZNNNCOOOLLLGGGLLLLLLJJJJFFFFAAAAAAAAAAASSSSFFFFVVVVVVPPPPPPPPPPTTTTTTT
CCCMMPMMMZMMMMBBVBBVVVBBBBBBBBBOOOOOOGGGGQQQQQQHZZZZZNNNFNFFFFFEZZZZZZZZNNCOCCCLLLLLLLLLLLLLJFFFFFDAABAKAKKKBKSSSSFFVVVVVOOPPPPPPPPPPTTTTTTT
CCCMMMMMMMMMMVVVVVVVVVVBBVBBBBOOOOOOOGGGGQQQQQQGZZZZANNGFFFFFFFFZZZZZZZZCCCCCCCLLLLLLLLLLLLLJJFFFFFKQKKKKKKKKKSSSSSSVVVOOOZPPPPPPPPPPTTTTTTT
CCCMMMMMMMMMMAAVVVVVVVVVVVOOOOOOOOOGGGGGGQQQQQQRZZZFAAAFFFFFFFFFFZZZZZZZCCCCCCCCLLLLLLLLLLLLLFFFFFFKKKKKKKKKKKKKSSSSSVVOOOZPPPPPPPPITTTTTTTT
KCMMMMMMMMAAMAAVVTVVVTVVOOOOOOOOOOOGXGGGGQQQQQQZZRZFFFFFFFFFFFFFFFZZZZZZCCCCCCCCLLLLLLLLLLLLLLFFFFFXKKKKKKKKKKKKKKSVVVVVOSPPPPPPPPIIITTTTTTT
KCKMMMMMMAAAAAAATTTVTTTOOOOOOOGOOGGGGGGGGGGGGGRRRRRFFFFFFFFFFFFFFIFZZZZZCSSCCCCCLLLLLLLLLLLYLFFFFFFFQKKKKKKKKKKKKKKKVVVVOOVVUPPPPIIIITTTTTTT
KKKKMMKMMAAAAAAAATTTTTTTTTTOOOGOGGGGGGEEGGGGGGGRRFFFFFFFFFFFFFFFFFFZZZZZCSCCCCCCLLLLLLLLLLLLLOOFFFFFQKKKKKKKKKKKKKKKKVVOOVVVPPPPPIIITTTTTTTT
KKKKKKKKMAAAAAATTTTTTTTTTTTTOOGGGGGGGGGGGGGGGGGRFFFFFFFFFFFFFFFFFFFZZZZVCCCCCCCCCLLLJJJJJJJJJOQFQQQQQQKKKKKKKKKKKKKQVVVOOVVVVPVVIIIIFTTTTTTT
KKKKKKKKKKKAAAATYRTTTTTTTTTTYYYGGGGGGGGGGGGGGGRRRRFFFFFFFFFFFFFFFFFZZZZVCCCCCCCCCCLLJJJJJJJJJQQQQQQQQKKKKKKKKKKKKKKKKKVVVVVVVPPVIIIIFFTTNTTD
KKKKKKKKKKKAAAARRRTTTTTTTTYYYYYUGGGGGGGGGGGGGGRVRVZAFFFAAAFFFNFTFFFKKSSCCCCCCCCCCCCCJJJJJJJJJOQQQQQQQKKKKXXXXKKKKKKKKKVVVVVVVVVVIFFFFFFFNFFF
KKKKKKKKKKKAAAARRRRTTTTRRRRLYYGGGGGGGGGGGGGGGRRVVVAAFFAAAAAFFNNSSSFFSSSSCCCCCCCCCCHHJJJJJJJJJOQQQQQNQKKKKKXXXKKKKKKKKKKVVVSVVVVFFFFFFFFFFFFF
KKKKKKKKKKKAAAARRRRRTRRRRRRRYYYGGGGGGGGGGGGGGRRVVVAAAAAAAAAFFNSSSSSSSSSSSCCCCCCCCCHZJJJJJJJJJJJJJNNNNKKKKKXXXXKKKWWDDKVVVVSVVVVSSSSFFFFFFFFF
HKKKKKKKKAAAAARRRRRRRRRRRYYAYYYYGGGGGGGGGGGGRRVUVVPAAAAAAAAWSSSSSSSSSSSSSCCCCCCCHHHHJJJJJJJJJJJJJJJNNNNKKXXXFFFKWWDDDKVVVVSSVVVSSFSSFFFFFFFF
HKKPKKKKAAAAAARHRRRRRRRRRRYYYYYYYGGGGGGGGGVVVVVVVVPAAAAAAAAAAAASSSSSSSSLLCCCCCCCHHHHJJJJJJJJJJJJJJJNNNNNNNNXNFFDWWDDDDVMVVSSSUVSSFFFFFFFFFFF
HCCCKKKAAAAGAARRRRRRRRRRRLYAYYYYYYGGGGGGGGVVVVVVVVVAAAAAAAAAASSSSSSSSSSLCCCCCCCCCCHIIIJJJJJJJJJJJJJNNNNNNNNNNAADDDDDDUMMMXXSSUUFFFFFFFFFFFFF
HCCCCKAAAAGGGGRRRRRRRRRRRLYYYYYYYYYRGGGGGZVVVVVVVVVAAAAAAAAAAASCCCCCCCCCWCCCCCCCYCHYYYJJJJJJJJJJJJJNNNNNNNNNNAWDDDDDDDDMMMMSSUMMFFFFFFFFFFFF
HCCHHKGGGGGGGGGRRRRRRRRRRRPYYYYYYYRRRRRVVVVVVVVVVVVAAAAAAAAAAASCCCCCCCCCHCHCCCZCYCYYYYJJJJJJJJJJJJJNNNNNNNNNNAWDDDDDDDDDMMMMMMMMFFFFFFFFFFFF
HHHHHHHGGGGGGGGRRRRRRRRRRRPPYYYYYRRRRRRRRRVVVVVVAAVAAAAAAAAAAAACCCCCCCCCHHHHHHZYYYYYYYJJJJJJJJJJJJJNNNNNNNNNNAAOOOODDDDMMMMMMMMMMMFFFFFFFFFF
HHHHHHHGGGGGJGGRRRRRRRRRPPPPYYKYYRRRRRRRRRVVVVVVAAAAAAAAAAAEASSCCCCCCCCCHHHHHYYYYYYYYYYYYYYYYPPPJJJNNNNNNNNAAAAOOOODDDMMMMMMMMMMMFFFFFFFFFFF
HHHHHHHGGGGGGGGRRRRRRRRRRPPFYYKFYFFFRRRRRVVVVVVVAAAAAAAAAAAESSSCCCCCCCCCHHHWHHHYYYYYYYYYYYYPPPPPJJJPPPPNNNAAAAAAAAODHMMMMMMMMMVBFFFFFFFFFFFF
HHHHHHGGGGGGTTTRYRRRRRTTFTPFFFKFFFFFRRRRRRXVVVVAAAAAAAAAAADSSSSCCCCCCCCCHHHHHHHYYYYYYYYYYYYYYPPPJJJPPPPPPPAAAAAAAAADHHMMMMMMMMMBFFFFFFFKKKKK
HHHHTGGGGGGGTTTTRRRRRRTTTTTFFFFFFFFFRRRRRXXVXXVVVAAAAAAAAADDDDHHHHHCCCCHHHHHHHHHYYYYYYYYYYYYYPPPPPPPPPPPPFAAAAAAAAAAHHHHHMMMMDBBFFBBBKKKKKKK
HHHHTTTGTTTTTTTTRRPRRRPPOTTFFFFFFFFFRRRRXXXXXXVVVVVAAAAAAADVDDDHHHHCCCCHHHHHHHHHYYYYYYYYYYHYPPPPPPPPPPPPPAAAAAAAUADAHHHHHHMHHDBBBFBBBBUUKKKY
HHHHTTTTTTTTTTTTPRPRGGPOOOFFFFFFFFFFFRRRXXXXVVVVVVVAAAVAAAVVDDVHHHHCCCCCCCCCCEYYYYYYYYYYYYYYPPPPPPPPPPPPPAAAAAAAAAAHHHHHHHHHDDDDBBBBBBUUKKKK
HHHTTTTTTTTTTTTTPPPPPPPOOFFFFFFFFFFFFFFXXXXXVVVVVVVAAVVVVVVVVVVHHHHCCCCCCCCCCTYEYYYYYYYYYYYPPPPPPPPPPRPYPAAAAAAAAAAAHHHHHHHDDDDBBBBBBUUUKKKK
HHHHYYTTTTTTTTTPPPPPPPPPOOFFFFFFFFFFFFFMMXXXXXVVVVVVVVVVVVGVVWWWHHHCCCCCCCCCCTEEEEEYYYYYYXYPPPPPPPPPBPPPPPAAAAAAAAAHHHHHBBBDYDBBBBBBUUKKKKKK
HHHHYYYTTTTTTTTPPPPPPPPOOOFFFFFFFFFFFFFMMXXXXXXVVVVVVVVVVVVVVWWWHHHHCCCCCCCCCTEEEEEYYYYQQQQDPPPPPVVPPPPPPPAAAAAAWAHHHHHHBBBYYYBBBBBBBUKKKKKK
HYYYYYYYYYTTPPPPPPPPPPPPPPFFFFFFFFFFFFMMMXXXXXVVVVVCCCCVVVRRRHHHHHHHCCCCCCCCCTTTTTTYQQYYQQQDDDDPPPVMPMMPPPDAAAAAAAHHHHHBBBBBYYBBBBBBUUUUKKKK
HHYYYYYYYYYPPPPPPPPPPPRPPPFFRFFVVFFFFVMMXXXXCVVVCCVCXVVVVVRRRHRRHHHSCCCCCCCCCTTTTTTYQQQQQQQDDDDDPVVMMMMMPMAAAAAAAAHHBBBBBBBYYBBBBBUUUUUUKKKK
HYYYYYYYYYYPPPPPPNNNAPRRRRRRRVVVVVFAVVVMMMXCCCVVCCCCCVVVVVRERRRRRHSSCCCCCCCCCTTTTTTTQQQQQQQQDDDDPVVMMMMMMMMAWAAOOSSSSBBBBBYYBBBBBBUUUUUUUKTK
YYYYYYYYYYYEEPPPPPNAAPPRRRRRVVVVVVFVVVVVCCXCCCCDCCMMMMMMVVVERRRRRSSSCCCCCCCCCTTTTTQQQQQQQQQQQDDDPZVVMMMMMMMMMMASSSSSVVBBBBBBBBBBBUUUUUUEETTE
MYYYYYYYYYYYEPPPPPPAAAAARRRRVVVVVVVVVVVVVCCCCCCDCCCCCMMMVDDEEEERRSSSCCCSNTTTTTTTTQQQQQQQQQQQQDDDDZZMMMMMMMMMMMSSSSSSSVBXBBBBBBBBBEEUUUUETTEE
MYYYYYYYYYYEEPDDAPAAAAAEAAAAVVVVVVVVVVVVVCCCCCCCCCCCCMCCVDDEEEERRSSSCCCSSTTTTTTTYQQQQQQQQQQQQQDDDZZMMMMMMMMMMMMSSSSSSSXXBBBBBBBBBYEEUEEEEEEE
MYYYYYYYYYYYEAAAAAAAAAAAAAAAVVVVVVVVVVVVVCCCCCCCCCCCCCCCCDEEEEERESSSCCCTTTTTTTTTTQQQQFQQQQQQQQDZZZZZZMZMMMMMMSSSSSSSXXXXXBBBBBBBLEEEEEEEEEEE
MYYYYYYYYYYYAAAAAAAAAAAAAAAAVVVVVVVVVVVVCCCCCCCCCCCCCCDDDDDDEEEEEESSCCCSTTTTTTTTTQQQQFFQQQQQQQZZZZZZZZZZMMMMMMMYSSSSXXXXXXGBBBBEEEEEEEEEEEEE
MYYYYYYYYYYMMAAAAAAAAAAAAAAAVVVVVVVVVVVCCCCCCCCCCCCCDDDDDDEEEEEEEESSSSSTTTTTTTTTTTFFFFFQQQQQQQZZZZZZZZZMMMMMMMWSSWWXXXXXXXGGMBBEEEEEEEEEEEEE
MYYYYYYYYMMMMMAAAAAAAAAAAAAAVVVVVVVVVVCCCCCCCCCCCCCCCDDDDDEEEEEEEESSSSSTTTTTTTTTTFFFFFFFFQQQQQQQZZZZZZJMMMMMMMWSSWXXXXXXXXGMMMMEUEEEEEEEEEEE
MYYYYYYMMMMMMMAAAAAAAAAUAAVVVVVVVVVVVVCCCCCCCCCCCCCCDDDDDDDEEEEEEEESRSEEETTTTYTFFFFFFFFFFQQQQQQQZZZZZZJMMMMMWWWWWWWXXGXGGGGGMMMEEEEEEEEEEEEE
YYYXXYYMMMMMMMAAAAAAAAAAAIVVVVVVVVVVVVVCCCCCCCCCCCCCDDDDDDDEEEEEEEEEEEEEETTTTYTFFFFFFFFFFQQQZZZZZZZZZJJJMMMMMMWWWWWXGGGGGGGMMMMEEEEEEEEEEEEE
+80
View File
@@ -0,0 +1,80 @@
--- Day 13: Claw Contraption ---
Next up: the lobby of a resort on a tropical island. The Historians take a moment to admire the hexagonal floor tiles before spreading out.
Fortunately, it looks like the resort has a new arcade! Maybe you can win some prizes from the claw machines?
The claw machines here are a little unusual. Instead of a joystick or directional buttons to control the claw, these machines have two buttons labeled A and B. Worse, you can't just put in a token and play; it costs 3 tokens to push the A button and 1 token to push the B button.
With a little experimentation, you figure out that each machine's buttons are configured to move the claw a specific amount to the right (along the X axis) and a specific amount forward (along the Y axis) each time that button is pressed.
Each machine contains one prize; to win the prize, the claw must be positioned exactly above the prize on both the X and Y axes.
You wonder: what is the smallest number of tokens you would have to spend to win as many prizes as possible? You assemble a list of every machine's button behavior and prize location (your puzzle input). For example:
Button A: X+94, Y+34
Button B: X+22, Y+67
Prize: X=8400, Y=5400
Button A: X+26, Y+66
Button B: X+67, Y+21
Prize: X=12748, Y=12176
Button A: X+17, Y+86
Button B: X+84, Y+37
Prize: X=7870, Y=6450
Button A: X+69, Y+23
Button B: X+27, Y+71
Prize: X=18641, Y=10279
This list describes the button configuration and prize location of four different claw machines.
For now, consider just the first claw machine in the list:
Pushing the machine's A button would move the claw 94 units along the X axis and 34 units along the Y axis.
Pushing the B button would move the claw 22 units along the X axis and 67 units along the Y axis.
The prize is located at X=8400, Y=5400; this means that from the claw's initial position, it would need to move exactly 8400 units along the X axis and exactly 5400 units along the Y axis to be perfectly aligned with the prize in this machine.
The cheapest way to win the prize is by pushing the A button 80 times and the B button 40 times. This would line up the claw along the X axis (because 80*94 + 40*22 = 8400) and along the Y axis (because 80*34 + 40*67 = 5400). Doing this would cost 80*3 tokens for the A presses and 40*1 for the B presses, a total of 280 tokens.
For the second and fourth claw machines, there is no combination of A and B presses that will ever win a prize.
For the third claw machine, the cheapest way to win the prize is by pushing the A button 38 times and the B button 86 times. Doing this would cost a total of 200 tokens.
So, the most prizes you could possibly win is two; the minimum tokens you would have to spend to win all (two) prizes is 480.
You estimate that each button would need to be pressed no more than 100 times to win a prize. How else would someone be expected to play?
Figure out how to win as many prizes as possible. What is the fewest tokens you would have to spend to win all possible prizes?
Your puzzle answer was 37128.
--- Part Two ---
As you go to win the first prize, you discover that the claw is nowhere near where you expected it would be. Due to a unit conversion error in your measurements, the position of every prize is actually 10000000000000 higher on both the X and Y axis!
Add 10000000000000 to the X and Y position of every prize. After making this change, the example above would now look like this:
Button A: X+94, Y+34
Button B: X+22, Y+67
Prize: X=10000000008400, Y=10000000005400
Button A: X+26, Y+66
Button B: X+67, Y+21
Prize: X=10000000012748, Y=10000000012176
Button A: X+17, Y+86
Button B: X+84, Y+37
Prize: X=10000000007870, Y=10000000006450
Button A: X+69, Y+23
Button B: X+27, Y+71
Prize: X=10000000018641, Y=10000000010279
Now, it is only possible to win a prize on the second and fourth claw machines. Unfortunately, it will take many more than 100 presses to do so.
Using the corrected prize coordinates, figure out how to win as many prizes as possible. What is the fewest tokens you would have to spend to win all possible prizes?
Your puzzle answer was 74914228471331.
Both parts of this puzzle are complete! They provide two gold stars: **
+32
View File
@@ -0,0 +1,32 @@
#!/usr/bin/env python3
import sys, re
from sympy import solve
from sympy.abc import x, y
def prizes(a, b, prize):
sols = solve([a[0] * x + b[0] * y - prize[0], a[1] * x + b[1] * y - prize[1]], x, y, dict=True)
if len(sols) > 1: print('help!', sols)
if int(sols[0][x]) != sols[0][x] or int(sols[0][y]) != sols[0][y]: return 0
else: return 3*sols[0][x]+sols[0][y]
if __name__ == '__main__':
cms = open(sys.argv[1]).read().split('\n\n')
res1, res2 = 0, 0
for cm in cms:
g = re.search(r'Button A: X\+(?P<xa>\d+), Y\+(?P<ya>\d+)\nButton B: X\+(?P<xb>\d+), Y\+(?P<yb>\d+)\nPrize: X=(?P<px>\d+), Y=(?P<py>\d+)', cm)
button_a = (int(g['xa']), int(g['ya']))
button_b = (int(g['xb']), int(g['yb']))
prize = (int(g['px']), int(g['py']))
res1 += prizes(button_a, button_b, prize)
prize = (prize[0]+10000000000000, prize[1]+10000000000000)
res2 += prizes(button_a, button_b, prize)
# challenge 1
print(f"challenge 1:\n{res1}\n")
# challenge 2
print(f"challenge 2:\n{res2}")
+15
View File
@@ -0,0 +1,15 @@
Button A: X+94, Y+34
Button B: X+22, Y+67
Prize: X=8400, Y=5400
Button A: X+26, Y+66
Button B: X+67, Y+21
Prize: X=12748, Y=12176
Button A: X+17, Y+86
Button B: X+84, Y+37
Prize: X=7870, Y=6450
Button A: X+69, Y+23
Button B: X+27, Y+71
Prize: X=18641, Y=10279
+1279
View File
File diff suppressed because it is too large. Load diff
+131
View File
@@ -0,0 +1,131 @@
--- Day 14: Restroom Redoubt ---
One of The Historians needs to use the bathroom; fortunately, you know there's a bathroom near an unvisited location on their list, and so you're all quickly teleported directly to the lobby of Easter Bunny Headquarters.
Unfortunately, EBHQ seems to have "improved" bathroom security again after your last visit. The area outside the bathroom is swarming with robots!
To get The Historian safely to the bathroom, you'll need a way to predict where the robots will be in the future. Fortunately, they all seem to be moving on the tile floor in predictable straight lines.
You make a list (your puzzle input) of all of the robots' current positions (p) and velocities (v), one robot per line. For example:
p=0,4 v=3,-3
p=6,3 v=-1,-3
p=10,3 v=-1,2
p=2,0 v=2,-1
p=0,0 v=1,3
p=3,0 v=-2,-2
p=7,6 v=-1,-3
p=3,0 v=-1,-2
p=9,3 v=2,3
p=7,3 v=-1,2
p=2,4 v=2,-3
p=9,5 v=-3,-3
Each robot's position is given as p=x,y where x represents the number of tiles the robot is from the left wall and y represents the number of tiles from the top wall (when viewed from above). So, a position of p=0,0 means the robot is all the way in the top-left corner.
Each robot's velocity is given as v=x,y where x and y are given in tiles per second. Positive x means the robot is moving to the right, and positive y means the robot is moving down. So, a velocity of v=1,-2 means that each second, the robot moves 1 tile to the right and 2 tiles up.
The robots outside the actual bathroom are in a space which is 101 tiles wide and 103 tiles tall (when viewed from above). However, in this example, the robots are in a space which is only 11 tiles wide and 7 tiles tall.
The robots are good at navigating over/under each other (due to a combination of springs, extendable legs, and quadcopters), so they can share the same tile and don't interact with each other. Visually, the number of robots on each tile in this example looks like this:
1.12.......
...........
...........
......11.11
1.1........
.........1.
.......1...
These robots have a unique feature for maximum bathroom security: they can teleport. When a robot would run into an edge of the space they're in, they instead teleport to the other side, effectively wrapping around the edges. Here is what robot p=2,4 v=2,-3 does for the first few seconds:
Initial state:
...........
...........
...........
...........
..1........
...........
...........
After 1 second:
...........
....1......
...........
...........
...........
...........
...........
After 2 seconds:
...........
...........
...........
...........
...........
......1....
...........
After 3 seconds:
...........
...........
........1..
...........
...........
...........
...........
After 4 seconds:
...........
...........
...........
...........
...........
...........
..........1
After 5 seconds:
...........
...........
...........
.1.........
...........
...........
...........
The Historian can't wait much longer, so you don't have to simulate the robots for very long. Where will the robots be after 100 seconds?
In the above example, the number of robots on each tile after 100 seconds has elapsed looks like this:
......2..1.
...........
1..........
.11........
.....1.....
...12......
.1....1....
To determine the safest area, count the number of robots in each quadrant after 100 seconds. Robots that are exactly in the middle (horizontally or vertically) don't count as being in any quadrant, so the only relevant robots are:
..... 2..1.
..... .....
1.... .....
..... .....
...12 .....
.1... 1....
In this example, the quadrants contain 1, 3, 4, and 1 robot. Multiplying these together gives a total safety factor of 12.
Predict the motion of the robots in your list within a space which is 101 tiles wide and 103 tiles tall. What will the safety factor be after exactly 100 seconds have elapsed?
Your puzzle answer was 209409792.
--- Part Two ---
During the bathroom break, someone notices that these robots seem awfully similar to ones built and used at the North Pole. If they're the same type of robots, they should have a hard-coded Easter egg: very rarely, most of the robots should arrange themselves into a picture of a Christmas tree.
What is the fewest number of seconds that must elapse for the robots to display the Easter egg?
Your puzzle answer was 8006.
Both parts of this puzzle are complete! They provide two gold stars: **
+50
View File
@@ -0,0 +1,50 @@
#!/usr/bin/env python3
import sys, re
def show(mp):
for line in mp:
print(''.join(line))
def easter_egg(robots, w, h):
for steps in range(7000, 10000):
print('Steps: ', steps)
m = [['.'] * w for _ in range(h)]
for r in robots:
px, py, vx, vy = map(int, r)
nx = (px + steps*vx)%w
ny = (py + steps*vy)%h
m[ny][nx] = 'X'
show(m)
if __name__ == '__main__':
robot = re.compile(r'p=(?P<px>-?\d+),(?P<py>-?\d+) v=(?P<vx>-?\d+),(?P<vy>-?\d+)')
robots = [robot.search(line.strip('\n')).groups() for line in open(sys.argv[1])]
# space: 11 x 7 for example and 101 x 103 for real input
w, h = 101, 103
steps = 100
q1, q2, q3, q4 = 0,0,0,0
for r in robots:
px, py, vx, vy = map(int,r)
nx = (px + 100*vx)%w
ny = (py+100*vy)%h
if nx in range(0, w//2):
if ny in range(0,h//2): q1 += 1
if ny in range(h//2+1,h): q2 += 1
if nx in range(w//2+1,w):
if ny in range(0,h//2): q3 += 1
if ny in range(h//2+1,h): q4 += 1
# challenge 1
res1 = q1 * q2 * q3 * q4
print(f"challenge 1:\n{res1}\n")
# challenge 2
easter_egg( robots, w, h)
res2 = "8006" # empirical solution
print(f"challenge 2:\n{res2}")
+12
View File
@@ -0,0 +1,12 @@
p=0,4 v=3,-3
p=6,3 v=-1,-3
p=10,3 v=-1,2
p=2,0 v=2,-1
p=0,0 v=1,3
p=3,0 v=-2,-2
p=7,6 v=-1,-3
p=3,0 v=-1,-2
p=9,3 v=2,3
p=7,3 v=-1,2
p=2,4 v=2,-3
p=9,5 v=-3,-3
+500
View File
@@ -0,0 +1,500 @@
p=24,25 v=-48,-26
p=7,8 v=-96,-2
p=7,80 v=-66,22
p=5,18 v=25,-98
p=45,67 v=26,90
p=54,71 v=3,67
p=62,66 v=-5,81
p=5,82 v=-7,-45
p=66,89 v=93,-43
p=70,51 v=33,-7
p=75,59 v=-20,-77
p=66,40 v=93,55
p=32,79 v=79,45
p=99,13 v=-18,50
p=13,68 v=-43,-53
p=84,85 v=-69,-65
p=37,84 v=11,-57
p=28,10 v=19,-93
p=78,82 v=-56,36
p=20,69 v=-3,-62
p=39,78 v=27,-1
p=51,87 v=-32,-17
p=90,26 v=20,66
p=35,89 v=-11,20
p=71,2 v=-80,92
p=41,40 v=-64,-30
p=38,8 v=-71,54
p=72,58 v=36,-80
p=62,97 v=52,83
p=96,74 v=90,-23
p=76,75 v=-43,-9
p=35,95 v=74,13
p=90,17 v=99,6
p=61,26 v=17,81
p=43,71 v=-43,-51
p=6,18 v=-62,-9
p=37,62 v=-23,-11
p=60,97 v=36,-64
p=54,63 v=-23,-95
p=76,85 v=24,-4
p=38,54 v=-38,-95
p=48,18 v=52,-49
p=45,36 v=-75,-4
p=31,87 v=64,50
p=4,87 v=68,9
p=25,40 v=99,53
p=74,18 v=-73,-71
p=5,22 v=76,65
p=66,12 v=96,-64
p=20,71 v=68,-3
p=3,20 v=4,-77
p=27,43 v=49,55
p=25,70 v=-52,-84
p=90,64 v=39,52
p=32,69 v=82,88
p=2,97 v=-78,76
p=56,6 v=-71,-27
p=91,31 v=84,-41
p=25,12 v=-91,-51
p=7,43 v=-11,59
p=3,55 v=-6,-44
p=83,102 v=9,-76
p=54,40 v=-94,5
p=3,77 v=80,45
p=32,6 v=3,-35
p=14,34 v=-74,-41
p=16,30 v=-21,-86
p=34,71 v=-75,-62
p=79,11 v=67,-10
p=80,11 v=61,9
p=14,84 v=-59,-83
p=73,66 v=-56,3
p=26,61 v=41,-70
p=45,35 v=-97,40
p=84,39 v=-99,55
p=95,50 v=-66,-56
p=17,35 v=-33,-74
p=33,51 v=4,-22
p=6,77 v=-49,-45
p=9,61 v=28,85
p=14,91 v=-70,-12
p=88,73 v=49,-14
p=73,39 v=-16,73
p=68,83 v=25,60
p=3,31 v=83,62
p=31,102 v=30,-49
p=29,29 v=45,-23
p=47,37 v=97,26
p=35,46 v=87,39
p=13,36 v=-74,-37
p=81,33 v=81,-17
p=6,20 v=-14,43
p=94,41 v=89,-72
p=55,44 v=-91,95
p=92,87 v=-17,64
p=54,79 v=-57,-58
p=53,49 v=-19,-84
p=25,21 v=56,-82
p=82,53 v=51,-85
p=75,27 v=69,-4
p=21,87 v=61,-6
p=6,63 v=-74,-77
p=20,4 v=89,-33
p=21,25 v=-78,62
p=24,0 v=-74,43
p=34,86 v=-43,74
p=72,83 v=-35,85
p=47,17 v=41,87
p=3,73 v=-77,-36
p=98,96 v=-73,75
p=66,93 v=-26,20
p=48,79 v=56,-69
p=91,89 v=-47,9
p=49,11 v=96,-47
p=33,4 v=-86,-16
p=76,45 v=-46,3
p=12,28 v=-40,36
p=64,99 v=-79,-83
p=19,83 v=-10,-3
p=87,57 v=84,-33
p=47,69 v=-64,-58
p=56,9 v=33,-60
p=98,94 v=-14,-25
p=60,59 v=-1,-41
p=18,91 v=-93,-85
p=24,21 v=98,-85
p=51,83 v=-23,45
p=12,41 v=-41,-34
p=8,86 v=-55,-50
p=23,48 v=-11,73
p=46,24 v=-4,-75
p=12,82 v=-6,-47
p=78,37 v=-16,-55
p=13,59 v=68,-66
p=63,100 v=44,83
p=99,66 v=31,-65
p=21,97 v=17,-7
p=1,101 v=91,-90
p=16,74 v=90,8
p=15,102 v=98,-9
p=31,34 v=12,91
p=49,65 v=-8,96
p=48,62 v=-41,-58
p=57,13 v=-72,61
p=82,30 v=-69,47
p=31,21 v=41,-44
p=25,93 v=-30,-69
p=33,45 v=4,-96
p=57,15 v=59,10
p=6,74 v=61,-43
p=9,43 v=-64,51
p=69,67 v=10,-51
p=44,93 v=60,93
p=39,77 v=94,-39
p=38,86 v=86,12
p=43,98 v=26,75
p=64,49 v=-87,-84
p=13,64 v=42,30
p=69,91 v=-39,-91
p=83,100 v=-12,61
p=28,66 v=-62,-27
p=15,90 v=-3,-46
p=0,42 v=27,18
p=56,99 v=-24,-67
p=70,68 v=-61,74
p=7,8 v=-70,35
p=5,100 v=16,-13
p=83,49 v=-22,73
p=63,18 v=64,-56
p=78,84 v=28,-57
p=89,39 v=36,26
p=72,31 v=-80,51
p=72,88 v=8,70
p=29,8 v=34,65
p=36,11 v=-86,39
p=16,27 v=12,-52
p=63,63 v=59,63
p=1,4 v=-21,-79
p=95,86 v=-81,-79
p=30,27 v=90,21
p=17,40 v=81,-5
p=47,24 v=47,93
p=4,23 v=31,-49
p=61,34 v=-42,-78
p=34,61 v=-62,44
p=48,18 v=-12,-97
p=32,81 v=-74,-75
p=61,15 v=96,-98
p=8,86 v=87,-54
p=26,95 v=-63,71
p=94,61 v=13,48
p=26,101 v=94,-57
p=24,102 v=4,2
p=83,56 v=-56,44
p=96,37 v=91,-8
p=60,43 v=-18,5
p=93,68 v=92,1
p=79,57 v=-9,77
p=65,68 v=-16,-51
p=26,28 v=-44,-80
p=39,22 v=-75,-23
p=90,0 v=-73,83
p=66,88 v=10,75
p=61,55 v=-87,52
p=43,2 v=45,68
p=85,25 v=-91,-12
p=14,79 v=-50,-20
p=32,98 v=22,21
p=85,59 v=74,-5
p=4,50 v=-14,8
p=99,85 v=35,-28
p=76,80 v=-2,64
p=49,36 v=-8,14
p=60,65 v=-12,67
p=4,84 v=-98,-82
p=0,92 v=-74,-50
p=88,94 v=26,36
p=20,37 v=-7,-8
p=81,28 v=21,-59
p=95,33 v=-39,36
p=26,45 v=-86,23
p=82,19 v=2,-12
p=85,60 v=32,-44
p=5,60 v=79,10
p=53,33 v=-12,62
p=40,79 v=-71,-47
p=75,31 v=-95,95
p=43,2 v=41,-86
p=17,86 v=-81,82
p=10,15 v=-31,46
p=7,74 v=-25,89
p=69,8 v=-61,32
p=82,65 v=-39,74
p=73,101 v=-12,-79
p=51,9 v=93,-16
p=95,56 v=13,15
p=96,67 v=34,29
p=19,91 v=-31,89
p=2,43 v=-96,-55
p=68,60 v=17,-91
p=17,86 v=8,-43
p=5,95 v=16,71
p=49,20 v=37,21
p=6,67 v=-40,96
p=47,95 v=-32,-76
p=45,71 v=-81,2
p=46,31 v=-34,-89
p=49,17 v=-79,-97
p=66,82 v=18,-95
p=69,86 v=81,-21
p=5,87 v=-10,-21
p=84,81 v=47,97
p=89,9 v=13,-60
p=34,15 v=-67,-38
p=51,46 v=-28,-91
p=94,99 v=-21,-35
p=15,20 v=3,48
p=26,72 v=-32,13
p=80,5 v=-43,-20
p=64,82 v=-49,-75
p=56,58 v=-94,81
p=29,86 v=79,16
p=98,60 v=-36,4
p=23,47 v=-37,77
p=48,66 v=63,78
p=48,92 v=-97,74
p=58,86 v=85,27
p=99,85 v=57,97
p=98,53 v=-28,-25
p=72,44 v=-48,31
p=35,67 v=75,30
p=22,11 v=38,13
p=95,41 v=-85,36
p=3,55 v=-85,-66
p=50,57 v=-94,11
p=58,2 v=-42,-64
p=45,3 v=-97,10
p=1,30 v=97,-31
p=75,68 v=13,-58
p=79,101 v=62,-98
p=20,26 v=83,25
p=49,4 v=25,-16
p=46,54 v=89,7
p=86,42 v=-43,-81
p=6,3 v=-99,-5
p=74,50 v=-61,22
p=40,13 v=-38,-57
p=5,54 v=-5,-65
p=55,66 v=10,-25
p=52,82 v=-55,-28
p=70,18 v=-68,-49
p=54,10 v=-38,-16
p=79,35 v=54,-45
p=95,64 v=80,6
p=88,62 v=-56,78
p=65,28 v=-39,43
p=69,29 v=-35,-78
p=68,99 v=-5,79
p=37,22 v=30,-49
p=98,55 v=-92,-84
p=3,1 v=-10,-64
p=56,60 v=49,26
p=38,25 v=-56,91
p=93,22 v=46,87
p=97,11 v=13,-86
p=16,15 v=23,76
p=34,58 v=45,15
p=20,59 v=-12,72
p=30,78 v=-25,50
p=61,59 v=-53,37
p=33,2 v=75,-24
p=36,5 v=81,43
p=90,93 v=-10,50
p=60,74 v=14,96
p=56,40 v=-56,96
p=79,6 v=77,-71
p=87,64 v=-2,-62
p=25,66 v=64,-47
p=4,13 v=-66,54
p=47,57 v=67,59
p=39,64 v=90,-88
p=81,68 v=-73,52
p=59,36 v=-42,-89
p=0,4 v=14,83
p=20,5 v=-67,-9
p=100,45 v=20,-44
p=85,27 v=54,-48
p=58,54 v=-16,-11
p=71,4 v=-54,42
p=22,98 v=83,-46
p=32,7 v=-26,32
p=33,52 v=37,-62
p=82,33 v=-28,14
p=90,11 v=-88,-97
p=39,79 v=52,45
p=60,15 v=70,-79
p=3,38 v=-70,-29
p=10,80 v=27,-10
p=22,22 v=-89,7
p=23,29 v=-74,49
p=45,34 v=26,51
p=59,63 v=-3,41
p=9,28 v=-82,89
p=18,42 v=-10,-67
p=2,80 v=-3,-80
p=94,73 v=13,89
p=89,73 v=-50,-40
p=22,85 v=71,-38
p=20,99 v=52,-10
p=40,89 v=52,27
p=47,99 v=-18,59
p=71,55 v=25,-47
p=69,102 v=-31,-64
p=67,43 v=-91,44
p=79,27 v=69,-72
p=43,53 v=89,22
p=59,30 v=26,-46
p=53,54 v=37,-33
p=72,11 v=-80,-27
p=56,63 v=33,-14
p=53,61 v=24,86
p=40,77 v=-17,-66
p=88,88 v=53,33
p=40,82 v=56,-76
p=16,2 v=60,-94
p=17,83 v=-78,-3
p=16,99 v=-44,13
p=88,19 v=-73,40
p=61,16 v=36,-30
p=1,90 v=-21,-80
p=65,92 v=-95,-30
p=100,98 v=24,31
p=45,54 v=-42,30
p=87,60 v=56,-57
p=97,43 v=75,-96
p=54,64 v=3,69
p=73,29 v=-5,84
p=69,5 v=-99,-27
p=18,8 v=98,94
p=9,4 v=92,61
p=69,50 v=38,34
p=9,52 v=-85,74
p=33,16 v=34,-86
p=38,68 v=15,45
p=93,82 v=25,17
p=22,34 v=6,-51
p=40,81 v=79,-6
p=62,20 v=23,86
p=2,21 v=43,-60
p=19,79 v=-74,38
p=70,3 v=-20,-81
p=57,66 v=-4,-22
p=54,36 v=65,-30
p=48,83 v=-60,-43
p=71,41 v=92,-56
p=90,66 v=-77,-62
p=65,15 v=-24,-79
p=49,48 v=-53,81
p=41,15 v=71,-49
p=59,58 v=83,18
p=27,84 v=-38,64
p=94,34 v=2,36
p=12,34 v=-55,-30
p=64,40 v=-27,29
p=74,28 v=-91,-63
p=81,86 v=-77,-10
p=83,26 v=32,47
p=20,44 v=-63,-96
p=1,48 v=-51,-11
p=69,18 v=-5,-82
p=63,18 v=16,-28
p=88,1 v=-2,46
p=80,44 v=2,33
p=10,35 v=72,10
p=79,35 v=45,-72
p=6,13 v=-18,3
p=40,43 v=41,-4
p=100,18 v=-51,-93
p=71,54 v=94,37
p=4,93 v=50,97
p=9,56 v=76,-77
p=89,38 v=-50,92
p=96,31 v=35,58
p=73,11 v=96,-86
p=36,67 v=-60,27
p=44,77 v=-82,71
p=67,53 v=96,61
p=14,82 v=72,42
p=96,14 v=65,98
p=91,8 v=78,-72
p=44,80 v=-22,-67
p=47,59 v=-75,48
p=90,52 v=-65,-3
p=10,41 v=-29,-70
p=57,90 v=-75,13
p=42,43 v=67,-85
p=51,72 v=33,79
p=33,87 v=60,56
p=93,55 v=-77,-44
p=31,29 v=64,-19
p=91,81 v=21,86
p=100,99 v=-66,-24
p=68,90 v=29,23
p=43,25 v=-6,-49
p=62,37 v=-98,-74
p=57,11 v=97,-83
p=89,85 v=74,14
p=29,18 v=48,-13
p=84,92 v=-43,-93
p=33,5 v=19,94
p=2,85 v=-58,12
p=18,95 v=-41,42
p=75,59 v=34,91
p=0,56 v=-51,-58
p=85,10 v=-91,-37
p=64,20 v=-42,-23
p=28,30 v=-27,7
p=18,46 v=-96,73
p=33,93 v=-93,-53
p=29,64 v=30,-29
p=65,53 v=-42,15
p=26,92 v=11,62
p=69,34 v=-99,-4
p=44,15 v=-94,-64
p=24,42 v=-22,88
p=37,8 v=41,87
p=22,77 v=-54,-54
p=9,13 v=-18,85
p=90,97 v=46,36
p=37,61 v=64,93
p=96,78 v=80,-47
p=92,62 v=6,74
p=19,20 v=-44,-23
p=63,43 v=-16,-4
p=85,0 v=-73,-64
p=37,53 v=-11,-81
p=28,55 v=11,-40
p=77,22 v=-72,-67
p=88,86 v=47,60
p=43,50 v=-19,-95
p=46,28 v=11,3
p=16,5 v=28,66
p=85,85 v=-36,-98
p=95,15 v=9,17
p=46,70 v=-64,82
p=24,49 v=38,-84
p=94,5 v=-24,-83
p=59,73 v=-98,49
p=13,75 v=72,12
p=68,27 v=-57,-5
p=13,71 v=-55,-84
p=57,12 v=-68,28
p=21,90 v=-45,16
p=38,4 v=-93,21
p=66,96 v=-72,-13
p=34,95 v=-41,-90
p=85,39 v=-18,-30
p=3,94 v=9,97
p=89,12 v=5,-67
p=44,58 v=-4,-62
+1040020
View File
File diff suppressed because it is too large. Load diff
+419
View File
@@ -0,0 +1,419 @@
--- Day 15: Warehouse Woes ---
You appear back inside your own mini submarine! Each Historian drives their mini submarine in a different direction; maybe the Chief has his own submarine down here somewhere as well?
You look up to see a vast school of lanternfish swimming past you. On closer inspection, they seem quite anxious, so you drive your mini submarine over to see if you can help.
Because lanternfish populations grow rapidly, they need a lot of food, and that food needs to be stored somewhere. That's why these lanternfish have built elaborate warehouse complexes operated by robots!
These lanternfish seem so anxious because they have lost control of the robot that operates one of their most important warehouses! It is currently running amok, pushing around boxes in the warehouse with no regard for lanternfish logistics or lanternfish inventory management strategies.
Right now, none of the lanternfish are brave enough to swim up to an unpredictable robot so they could shut it off. However, if you could anticipate the robot's movements, maybe they could find a safe option.
The lanternfish already have a map of the warehouse and a list of movements the robot will attempt to make (your puzzle input). The problem is that the movements will sometimes fail as boxes are shifted around, making the actual movements of the robot difficult to predict.
For example:
##########
#..O..O.O#
#......O.#
#.OO..O.O#
#..O@..O.#
#O#..O...#
#O..O..O.#
#.OO.O.OO#
#....O...#
##########
<vv>^<v^>v>^vv^v>v<>v^v<v<^vv<<<^><<><>>v<vvv<>^v^>^<<<><<v<<<v^vv^v>^
vvv<<^>^v^^><<>>><>^<<><^vv^^<>vvv<>><^^v>^>vv<>v<<<<v<^v>^<^^>>>^<v<v
><>vv>v^v^<>><>>>><^^>vv>v<^^^>>v^v^<^^>v^^>v^<^v>v<>>v^v^<v>v^^<^^vv<
<<v<^>>^^^^>>>v^<>vvv^><v<<<>^^^vv^<vvv>^>v<^^^^v<>^>vvvv><>>v^<<^^^^^
^><^><>>><>^^<<^^v>>><^<v>^<vv>>v>>>^v><>^v><<<<v>>v<v<v>vvv>^<><<>^><
^>><>^v<><^vvv<^^<><v<<<<<><^v<<<><<<^^<v<^^^><^>>^<v^><<<^>>^v<v^v<v^
>^>>^v>vv>^<<^v<>><<><<v<<v><>v<^vv<<<>^^v^>^^>>><<^v>>v^v><^^>>^<>vv^
<><^^>^^^<><vvvvv^v<v<<>^v<v>v<<^><<><<><<<^^<<<^<<>><<><^^^>^^<>^>v<>
^^>vv<^v^v<vv>^<><v<^v>^^^>>>^^vvv^>vvv<>>>^<^>>>>>^<<^v>^vvv<>^<><<v>
v^^>>><<^^<>>^v^<v^vv<>v^<<>^<^v^v><^<<<><<^<v><v<>vv>>v><v^<vv<>v^<<^
As the robot (@) attempts to move, if there are any boxes (O) in the way, the robot will also attempt to push those boxes. However, if this action would cause the robot or a box to move into a wall (#), nothing moves instead, including the robot. The initial positions of these are shown on the map at the top of the document the lanternfish gave you.
The rest of the document describes the moves (^ for up, v for down, < for left, > for right) that the robot will attempt to make, in order. (The moves form a single giant sequence; they are broken into multiple lines just to make copy-pasting easier. Newlines within the move sequence should be ignored.)
Here is a smaller example to get started:
########
#..O.O.#
##@.O..#
#...O..#
#.#.O..#
#...O..#
#......#
########
<^^>>>vv<v>>v<<
Were the robot to attempt the given sequence of moves, it would push around the boxes as follows:
Initial state:
########
#..O.O.#
##@.O..#
#...O..#
#.#.O..#
#...O..#
#......#
########
Move <:
########
#..O.O.#
##@.O..#
#...O..#
#.#.O..#
#...O..#
#......#
########
Move ^:
########
#.@O.O.#
##..O..#
#...O..#
#.#.O..#
#...O..#
#......#
########
Move ^:
########
#.@O.O.#
##..O..#
#...O..#
#.#.O..#
#...O..#
#......#
########
Move >:
########
#..@OO.#
##..O..#
#...O..#
#.#.O..#
#...O..#
#......#
########
Move >:
########
#...@OO#
##..O..#
#...O..#
#.#.O..#
#...O..#
#......#
########
Move >:
########
#...@OO#
##..O..#
#...O..#
#.#.O..#
#...O..#
#......#
########
Move v:
########
#....OO#
##..@..#
#...O..#
#.#.O..#
#...O..#
#...O..#
########
Move v:
########
#....OO#
##..@..#
#...O..#
#.#.O..#
#...O..#
#...O..#
########
Move <:
########
#....OO#
##.@...#
#...O..#
#.#.O..#
#...O..#
#...O..#
########
Move v:
########
#....OO#
##.....#
#..@O..#
#.#.O..#
#...O..#
#...O..#
########
Move >:
########
#....OO#
##.....#
#...@O.#
#.#.O..#
#...O..#
#...O..#
########
Move >:
########
#....OO#
##.....#
#....@O#
#.#.O..#
#...O..#
#...O..#
########
Move v:
########
#....OO#
##.....#
#.....O#
#.#.O@.#
#...O..#
#...O..#
########
Move <:
########
#....OO#
##.....#
#.....O#
#.#O@..#
#...O..#
#...O..#
########
Move <:
########
#....OO#
##.....#
#.....O#
#.#O@..#
#...O..#
#...O..#
########
The larger example has many more moves; after the robot has finished those moves, the warehouse would look like this:
##########
#.O.O.OOO#
#........#
#OO......#
#OO@.....#
#O#.....O#
#O.....OO#
#O.....OO#
#OO....OO#
##########
The lanternfish use their own custom Goods Positioning System (GPS for short) to track the locations of the boxes. The GPS coordinate of a box is equal to 100 times its distance from the top edge of the map plus its distance from the left edge of the map. (This process does not stop at wall tiles; measure all the way to the edges of the map.)
So, the box shown below has a distance of 1 from the top edge of the map and 4 from the left edge of the map, resulting in a GPS coordinate of 100 * 1 + 4 = 104.
#######
#...O..
#......
The lanternfish would like to know the sum of all boxes' GPS coordinates after the robot finishes moving. In the larger example, the sum of all boxes' GPS coordinates is 10092. In the smaller example, the sum is 2028.
Predict the motion of the robot and boxes in the warehouse. After the robot is finished moving, what is the sum of all boxes' GPS coordinates?
Your puzzle answer was 1563092.
--- Part Two ---
The lanternfish use your information to find a safe moment to swim in and turn off the malfunctioning robot! Just as they start preparing a festival in your honor, reports start coming in that a second warehouse's robot is also malfunctioning.
This warehouse's layout is surprisingly similar to the one you just helped. There is one key difference: everything except the robot is twice as wide! The robot's list of movements doesn't change.
To get the wider warehouse's map, start with your original map and, for each tile, make the following changes:
If the tile is #, the new map contains ## instead.
If the tile is O, the new map contains [] instead.
If the tile is ., the new map contains .. instead.
If the tile is @, the new map contains @. instead.
This will produce a new warehouse map which is twice as wide and with wide boxes that are represented by []. (The robot does not change size.)
The larger example from before would now look like this:
####################
##....[]....[]..[]##
##............[]..##
##..[][]....[]..[]##
##....[]@.....[]..##
##[]##....[]......##
##[]....[]....[]..##
##..[][]..[]..[][]##
##........[]......##
####################
Because boxes are now twice as wide but the robot is still the same size and speed, boxes can be aligned such that they directly push two other boxes at once. For example, consider this situation:
#######
#...#.#
#.....#
#..OO@#
#..O..#
#.....#
#######
<vv<<^^<<^^
After appropriately resizing this map, the robot would push around these boxes as follows:
Initial state:
##############
##......##..##
##..........##
##....[][]@.##
##....[]....##
##..........##
##############
Move <:
##############
##......##..##
##..........##
##...[][]@..##
##....[]....##
##..........##
##############
Move v:
##############
##......##..##
##..........##
##...[][]...##
##....[].@..##
##..........##
##############
Move v:
##############
##......##..##
##..........##
##...[][]...##
##....[]....##
##.......@..##
##############
Move <:
##############
##......##..##
##..........##
##...[][]...##
##....[]....##
##......@...##
##############
Move <:
##############
##......##..##
##..........##
##...[][]...##
##....[]....##
##.....@....##
##############
Move ^:
##############
##......##..##
##...[][]...##
##....[]....##
##.....@....##
##..........##
##############
Move ^:
##############
##......##..##
##...[][]...##
##....[]....##
##.....@....##
##..........##
##############
Move <:
##############
##......##..##
##...[][]...##
##....[]....##
##....@.....##
##..........##
##############
Move <:
##############
##......##..##
##...[][]...##
##....[]....##
##...@......##
##..........##
##############
Move ^:
##############
##......##..##
##...[][]...##
##...@[]....##
##..........##
##..........##
##############
Move ^:
##############
##...[].##..##
##...@.[]...##
##....[]....##
##..........##
##..........##
##############
This warehouse also uses GPS to locate the boxes. For these larger boxes, distances are measured from the edge of the map to the closest edge of the box in question. So, the box shown below has a distance of 1 from the top edge of the map and 5 from the left edge of the map, resulting in a GPS coordinate of 100 * 1 + 5 = 105.
##########
##...[]...
##........
In the scaled-up version of the larger example from above, after the robot has finished all of its moves, the warehouse would look like this:
####################
##[].......[].[][]##
##[]...........[].##
##[]........[][][]##
##[]......[]....[]##
##..##......[]....##
##..[]............##
##..@......[].[][]##
##......[][]..[]..##
####################
The sum of these boxes' GPS coordinates is 9021.
Predict the motion of the robot and boxes in this new, scaled-up warehouse. What is the sum of all boxes' final GPS coordinates?
Your puzzle answer was 1582688.
Both parts of this puzzle are complete! They provide two gold stars: **
+112
View File
@@ -0,0 +1,112 @@
#!/usr/bin/env python3
import sys, os, time
from copy import deepcopy
def show(m):
for line in m:
sys.stdout.write("\r"+''.join(line)+'\n')
sys.stdout.flush()
time.sleep(0.2)
def gps(x, y):
return 100*y + x
def move_stone(m, x, y, move):
dir = {'^': (0,-1), '>': (1,0), 'v': (0,1), '<': (-1,0)}
nx, ny = x+dir[move][0], y+dir[move][1]
if m[ny][nx] == '#': return
if m[ny][nx] == 'O': move_stone(m, nx, ny, move)
if m[ny][nx] == '.':
m[ny][nx] = 'O'
m[y][x] = '.'
return
def move_box_h(m, x, y, move):
dir = {'^': (0,-1), '>': (1,0), 'v': (0,1), '<': (-1,0)}
nx, ny = x+dir[move][0], y
sym = m[y][x]
if m[ny][nx] == '#': return
if m[ny][nx] in ['[', ']']: move_box_h(m, nx, ny, move)
if m[ny][nx] == '.':
m[ny][nx] = sym
m[y][x] = '.'
return
def move_box_v(m, x, y, move):
dir = {'^': (0,-1), '>': (1,0), 'v': (0,1), '<': (-1,0)}
if m[y][x] == '[': x1, x2 = x, x+1
else: x1, x2 = x-1, x
nx1, nx2, ny = x1+dir[move][0], x2+dir[move][0], y+dir[move][1]
if m[ny][nx1] == '#' or m[ny][nx2] == '#': return m
if m[ny][nx1] == ']' and m[ny][nx2] == '[':
mp = deepcopy(m)
mp = move_box_v(mp, nx1, ny, move)
mp = move_box_v(mp, nx2, ny, move)
if mp[ny][nx1] == '.' and mp[ny][nx2] == '.': m = deepcopy(mp)
elif m[ny][nx1] in ['[', ']']: m = move_box_v(m, nx1, ny, move)
elif m[ny][nx2] in ['[', ']']: m = move_box_v(m, nx2, ny, move)
if m[ny][nx1] == '.' and m[ny][nx2] == '.':
m[ny][nx1] = '['
m[ny][nx2] = ']'
m[y][x1] = '.'
m[y][x2] = '.'
return m
return m
def move(m, x, y, move):
dir = {'^': (0,-1), '>': (1,0), 'v': (0,1), '<': (-1,0)}
nx, ny = x+dir[move][0], y+dir[move][1]
if m[ny][nx] == '#': return m, x, y
if m[ny][nx] == 'O': move_stone(m, nx, ny, move)
if m[ny][nx] in ['[',']'] and move in ['v', '^']:
m = move_box_v(m, nx, ny, move)
elif m[ny][nx] in ['[',']'] and move in ['<', '>']:
move_box_h(m, nx, ny, move)
if m[ny][nx] == '.':
m[ny][nx] = '@'
m[y][x] = '.'
return m, nx, ny
else: return m, x, y
if __name__ == '__main__':
mp, moves = open(sys.argv[1]).read().split('\n\n')
mp = [list(y.strip('\n')) for y in mp.split('\n')]
moves = list(''.join([m.strip('\n') for m in moves]))
wm = []
for y, l in enumerate(mp):
line = []
for x, r in enumerate(l):
if r == '#': line += ['#', '#']
elif r == '.': line += ['.', '.']
elif r == 'O': line += ['[', ']']
elif r == '@':
wrx, wry = len(line), y
line += ['@', '.']
rx, ry = x, y
wm.append(line)
for mov in moves:
mp, rx, ry = move(mp, rx, ry, mov)
wm, wrx, wry = move(wm, wrx, wry, mov)
# challenge 1
res1 = 0
for y, m in enumerate(mp):
for x, t in enumerate(m):
if t == 'O': res1 += gps(x, y)
print(f"challenge 1:\n{res1}\n")
# challenge 2
res2 = 0
for y, m in enumerate(wm):
for x, t in enumerate(m):
if t == '[': res2 += gps(x, y)
print(f"challenge 2:\n{res2}")
+21
View File
@@ -0,0 +1,21 @@
##########
#..O..O.O#
#......O.#
#.OO..O.O#
#..O@..O.#
#O#..O...#
#O..O..O.#
#.OO.O.OO#
#....O...#
##########
<vv>^<v^>v>^vv^v>v<>v^v<v<^vv<<<^><<><>>v<vvv<>^v^>^<<<><<v<<<v^vv^v>^
vvv<<^>^v^^><<>>><>^<<><^vv^^<>vvv<>><^^v>^>vv<>v<<<<v<^v>^<^^>>>^<v<v
><>vv>v^v^<>><>>>><^^>vv>v<^^^>>v^v^<^^>v^^>v^<^v>v<>>v^v^<v>v^^<^^vv<
<<v<^>>^^^^>>>v^<>vvv^><v<<<>^^^vv^<vvv>^>v<^^^^v<>^>vvvv><>>v^<<^^^^^
^><^><>>><>^^<<^^v>>><^<v>^<vv>>v>>>^v><>^v><<<<v>>v<v<v>vvv>^<><<>^><
^>><>^v<><^vvv<^^<><v<<<<<><^v<<<><<<^^<v<^^^><^>>^<v^><<<^>>^v<v^v<v^
>^>>^v>vv>^<<^v<>><<><<v<<v><>v<^vv<<<>^^v^>^^>>><<^v>>v^v><^^>>^<>vv^
<><^^>^^^<><vvvvv^v<v<<>^v<v>v<<^><<><<><<<^^<<<^<<>><<><^^^>^^<>^>v<>
^^>vv<^v^v<vv>^<><v<^v>^^^>>>^^vvv^>vvv<>>>^<^>>>>>^<<^v>^vvv<>^<><<v>
v^^>>><<^^<>>^v^<v^vv<>v^<<>^<^v^v><^<<<><<^<v><v<>vv>>v><v^<vv<>v^<<
+10
View File
@@ -0,0 +1,10 @@
########
#..O.O.#
##@.O..#
#...O..#
#.#.O..#
#...O..#
#......#
########
<^^>>>vv<v>>v<<
+9
View File
@@ -0,0 +1,9 @@
#######
#...#.#
#.....#
#..OO@#
#..O..#
#.....#
#######
<vv<<^^<<^^
+71
View File
@@ -0,0 +1,71 @@
##################################################
#..OO..O.O....O...O..O...O.......O...OO##....O.OO#
#O.#..#OOO#..O..OO...O.O.....OO..O#O#.OOO.....#..#
#.....O.......OO.#OO....#O.OO.O..OO.O.O.O..##....#
#.O....O...O#...#...OO..#..O........#O..#..O..O..#
#O....O...O.O..OO..OO..#OO.#OO.O......##..O..O...#
#..O.##..#O...O...#.#.O.O..O.#......O..#.#...O...#
#O.O.........O..O........OO....OO......O.....O#..#
#...O....#..O..O........O......O.#.....O..O#..O..#
#.....#OOOOOOO.O.....O.OOO.#.#.........O#O....O..#
#.........OO#...O.O.#.O..O.....O..#.O..OO.O.#..O.#
#OOO...............#O.OOO..O#....O.....O...#....O#
#....O...O.O.#....O.O.O.OO..#......OO..O.OO.O...O#
#O.O..OO..#...........#O...O.O#...O...O..O..O.O..#
#OOO...O...#O.O.O...OO..#OO.OO#..O...O..OO...O...#
#..#........#...O..O...#.O..OO..#O.OO.#O......O..#
#O.........O.#O.......O.#.O.O....O#...OO...O...OO#
#.#...O.O....O.O....#...#.O...............O..#.OO#
#...O.....O..OOO...O..#O..#.......#OO..O..#...O..#
#OO.O#..O.#..O.#.........OO...O.OO..O....OO.O....#
#.O..O...O.......OOO....OO....O.OOO........O..O..#
#O..O..#..O.O.O..O.O.O..#O.......O..OO..O..O.....#
##O#.....#.O.....O#......O.........OOO.O...#.OOO.#
#O.#OO...O..#.O#.O..O.##OO......#..#OO.......O.#O#
#..O...#..O....OOO..#...@....OO.#.O#..OO......O..#
#.O#.....O...O..O#..O.OOO.OO.#O.O.O..O....O..OO.##
#..#.#.O#....#..O.O.OOO.......OO......O.OOO......#
#.....O....O...#.OO.OOO..#...O..O...O..#..O#OO.O.#
#OO.O.......O#...O.O......OO....#.O...OO.O..O.O..#
##O..O..O##..O..OOOO...O..#O..O.OO.O....O....#.#.#
##..OO#O.##...#O.OOO.......O.....O..O..OO.O...OOO#
#...#..OO.......O.O..OO..........O...OO....OO.O#.#
#..O.O..#OO.....O.........O#O.#..#..O...O.OO..O..#
#..O.#O...O............#O.O.O...O..O.O...#...OOO##
#...#OO.O#.OO.......#.......O..O.##....OO....OOOO#
#.O.....O..O...O.....#..O.....O...OO.O.O.......OO#
#...#O...O.O.#O..O..#..OOO#....O##....#OO.#.#OOOO#
#.O.#OOO......O...O..O.#O.OO..O.......O...O..O..##
#O.....O.#....O.OOO..O...#O#O....OOOO........#...#
#O...#.O...O.OO..O.O.O.............OO.O.#...#.O###
#O....OO.O.OOO#...#..#.....O#O..O..O.O..O#.O...O.#
#.........O#.##.OO..O..O..##..O........O..OOO....#
#.#....O.....O.O......O.O.O...OO.O....O..#O..O...#
#....O##O.O..#....O.OO.O...O..O..OOO..O...#..O...#
#O#....#.......O..O..#..OO.......O.OO.....OO.O...#
#O...O#OOO.O......O......OO..O.#.O.....O.O....OOO#
##....O##...#O.....O.#........OOOOO#..O....#.O.O.#
#O...O.....OO.....#O...O......O..OO.O..OOO.O#.O.O#
#O.O..#.O.O.O.O#.O#....OO.O....O.OO......O#OO...##
##################################################
>><^v><>^v<<vv<>vv><v><<^^>>>>^^><>^<^^vvv>>><><>v^^^^<<^<^><>>>v><><vv^v^<>>>^>><>v>v>^v>>v>>>v^<<^>v^<v<v<v^^>>v<^v>vv^><vvv<<^<><>^<>vv>^>^^^v<^^>v^>v>v<<^>>>^^vvv<>v>><^^<><<>v>>>^<v>vvv^^v>^^v<>^^<^^v^><>>><<<v^>v^>v^><v<^<<>^v^><v<^><^<>>>>v^<><^^>>>^^v^^<v^^>^v^v>>v<><<<vv^<<>^>^v>>v^v^<^<<><^>>^vv>>vvv^<v>v^<vv><^<<<vv>vv>^<^^>v>>^^^<^^^^<<^<<<<<<v>^v>^^v>>>^<>vvvv>>><<><>^v>>vvvvv^<<^<>^>v>>^>>>v<v><>^v^v><<^v<vv<v^<v^v>><^v<^>>^>>v<^v>>v>>v^v^v<<>v>><<><^<v<^<<v<<v>>^vv^vv<>v<v^<^^>^^^vv^<<>^>^^vv>^^<>>v^<v>>>><v<vv<v<^><^v<^vvvv><v>><<><>v<^<^vv<<<>><^<>^<^<>^<vv^>>><v<^^>vv<>v^>^<<^<^>^<^vvv>>v^>>>^<^>vv^<<^^<<>>>v><>v>^>^v>><><^<<>v^>>^<<>^v^<^<><^^^v<>^<v^v^v^<<^^<<<^>v>v<>^^^^^>>v>^v^v>><>^<<>^<v>>v^><v><<<>v^<<^^><>v<<v><vv^^<>v<<v<>>>v>v<<^v<vv><v<v>>^<<>vvv<<^>vv<<vvv>v>^>>^^^^^^^vv^v>>>vvvvv>^>^v<>v>><^v^^v^^v><>vv>><v<^<^>^v>^^^<<^><v>v^<^v<>><<^v^<^><v^v^^><<^v><><^^v<v><v>^><<^<<<^v<^>><>^^vv<^<<^^^^^v<vv^<v<^<<>>>^><^^>^v^v>v^<v^v^v^^>^v>^^><>v^v>vv>^>v^><v<>v<v<
>>v<v^<vv<v<><<>><^<^<^>><^<>>^>^^<^v^^^<v<^^vv^^^>>^>v>>v<<v^<>vv^<<>^v><v^v>v<>v<<^^^^<^v^<><vv^^v>v<<>>^>>^<^>><<v^^^>vvv>><>>^<^>v><v<<^<<v<<>v<^vv^v<>^>^v^><<<><^v>><v><<^v<<^<^<>>>>v><v>>v<>>><v>v>v<vv<>^>v<^>^^>v^^vvv>v>v<vv>>v<<vv^^v>><>><<<v^vv<<v^^v<<><v>^^>^^vv>v><>v<>>>>vvvvv<>v><<<<>vv>vv><^v^<^<v^<><<^^vv><^<vv^v>>^<>v>><>vv^>v<vv^<^><^v>^>v>^v<v<>^v^<>v><v<>>vv>>vv<^>^<>v><<vv^<><^<>vv><<<<v<<^v>>>^<>>^v^><>v^>^<<^>v^^^vv>>^vv^<<v><>vv^^v><vv><v<vv^<^>>v<><^<^v><^<<<^^<>>vv>>^^<^<<v>><>^^^<vv^<v<vvv><^^>^<<<^>v>^^v<<<vvv<^v<<vv>vvv<^<<v>v^><^^><>^<vv<>^<v<>v><<<v>>v^v<>>^><v><<^v>><v<^<vv^<^>>>>v>^>^<><v^v^v<v^<vvv<<<^<vv^>>v^^<^><^v><^^>v>v^>^>v>>^>>>>^<<v><v<<vv<<<^^<><v<^^<>v>>^^>v><><><<><v><v<>v>>^>^<v<^>^^<^><^^^v>v>>^^<<>>>vvv^v>v^v^<>^^<^><^vv^>^^^>>^><^><>>^<^^<<>>>v<<><v><>vv>^>v>^<^>^^>v<>>vv>^<^^^><vvvv^^vvv<v<<^<v^<<v<^>v><^<>v<<^>v><>>>><>>><^><^><^<<v^^^>^<v><v<>v>v<<^<>^vvv<>v>>>>^v>v^>v<^>^vv<<^<v<>v>vv^^<<vv<^^>v^<><<<v>v>vv^^>v<^^v><<>v>^>>^^v>>^>vvv>^
^^<v><<>^vvv<^v^>><^<^<>^<<v^v<vv>>vv^<^^<vv>><vv^v<<>^<^><^v>^>v^<v>>>>vv>vv<^>^<>^>>^><^>^<>^<>^^v>^vv<^^v>^>v>v>v<><<<>>^vv^<>vv^^^^^<<v>^^^^<<v<<v<v>v<<<^v^><<^>vvv>><v^^<<^>vv>^<<>>vv><<>^v>v^<vv>^vv<<^<v>>>>>>>>><>><^><^^^^><><<>^^^<<<v^^<<>^>v<^>^^<<><>^<<<>v^<>^v^<>v<^<<v^vv>v><^<^v<><<<>>>v><<<^<^>>^<^^><v<v^>vv^^><v>vvv^><^>^^>v><<v^>^v>^><vvv^<^<^^<^^>>>v^>^>v<v^<<^><<^<v<<>>^>^v<v>v^^vv><vv^>v<<v>^>v^v>>v>vv<<<<<^><^^<^<^^>><vv>^<<<vv^^v^vv^^^>v>vv^v^^>><v>^v<^v^>>>^>>^>>vv^v^<>^<>^><^>>^>^><<><^v^v<vv<<vv^<v^v^><<>v<^><>v>^v^<^>v><^><v<>>^v^vv>>^v<vvvv>><><>^v^vvv^<v^v<v<>^<v^<<v>v<<<>^<<>>v>v>><<^>><^<<<<<<<<^^>^>^^>><<>>^<v>v^^>v>>>><^^v^<>vv>^^vv<^<>v^v<<^^vv>>v^>>v><v^^^^<^v<<vv>vv<>^>v<v>v<><<<v<^v<^v^^^<<^vvv^>>vvv^>>^><v^^><>v<vv><>v>v^<<v><v<^><<v<^<v>vv<<><<v><<^^v>^><<<v<<v>^v>vv^><<<^>>v><><<<vv^>>^^<<^>^v^<>^v>v^>v><>v>>^v>^<^^>>>vv>>v^<>vv^^v>>v<^<>>^<^^>^>vvvv<>vv>>v<><v>>v<>v><^^^<<v<>v>v>>^v<<^<>><>^^<^<v<^^>><^^v<<<^>^>v^<>^><><<^^>>>>^<v<v^>>>>>><<<>^v<v>
>^>v^^<^<^<<^<vvv^>v^<v^^v>^<v><><^<^>><^v<^^^vv<v>v><^>^><<^^<^^v^>>><<v>vv>><><<<^^>>^^>>^^v<^>v^>><>v^v^>^^<^v><v^>^^<>>>v<<v^v<^>v^<vv^><>><^>v>v<^>>^>>>v^>v<^>^<v>>^<<^<v<vv>^<v<<v>^<v^<^<^v<><v>^vvvv<>>^^^<<<vv<>>v>v><vvv>vv^<^^^^^>v<^^<^>>v^^<>>v^vv^^v^><v^^^^>^^vvv^<^^<>vv^v<>><^^>v^>^v>>>^^>>>^<^v<v>^>vvv^^<><>><^vv>>^><<<<<^>>>^<vv><<v>>>v><><>>><vv>v^<^>>><^v>vv<<^<>v<><>vv><^^<^v^<<^v>^>v^vv<>^v^>v<v<>^<vv^v<^>^<<^<>><^^^<><^vv^v^^v^<vv>>^^>^<<^>>>><>^^<^^<v<<<<v>>>^<>^^>v^^^<v^>>^^v>><v>v^vv<v>^<^<<><v^<^<^^vv^v>><v<<^v<<^^^<<^v<v^>vv^^v>^>^v><^>><<^<v^<vv>v^^v><<^v><^v><>^^>^v><>vv^v><<v^<>^^>v^><><><^v>v^v>vv>^v><><<v<><>^<>vv<^<>^<<v^>vv>^v^^^v<vv^v<<<^<><<<<<v>>^v<v<<<v^v<vv<>^v>^<^<vvv>^>v><v<>v><>vvvv>^^v^^<>>>v>>>^^>vv^v<<^>v^<v><vv<^<>v<<^<<<vv^^>^vv>^<><<>^>>v^v>^<^v^<v<^<<>^<>^^<>^<^><vv<>^<<v<<><^>v><^<><vv<<v^<^>^<>>vvvv>^vv^vvv^^v><<^v<><<<^vv>><<^>^<^>v>v<>>^<^>^^v<^v<<^v>>>><>vv<^<v<^^v<>^<<>v^v><<v<v<>>^>^^<<v>^^<vv>vv<>>^>v>v>>^^v>^^>><v><^><v>>v<><^v<^v<^
<>v<v<^<>v^>><^<^<v<>>v^>v<vvvv<>^^><^>^>>^^>^v<^<v^<v><>v^<vv<^<v<^><v<v^>v^<<>>^^>^v<>^v<vv^<<v<>><vv^<^^vvv<><^vvv^><^<<v^^<<v^^><v><^v>^<^v^>v<>>^vv><<^v<<v<<vv<vv^>>>vv>vv^><v<<<^vv><>^v>^><<^v<<>>><^>><>vv^<vv<><><^<>^<v>v>^>>>>vv>vvv>v<>vvv^v^v<^<^v>><<>><><>vvvv<>vv<vv>>v^>><>^v<vv^v^>><^vvv^^<v^><v<^vvv<><><^^^v^<<v<>v^>^v<<>^>>^v^>^>^v>^<^^<>^<^^><>>v>^^><v^<v>^>v<v<<<<<<^v><vv<<^vvv>^>><>^><><v^v^^<vvv<^^<v^^>v<v<>v>^>><<^vv><<>><<v<><v<>^v^^<>v^v<v>v^>vv^<<>^>vvv^v<v^^><>v<<>><<v^<><^^vv<<<^><<><^>vv>v<<<^><vv^>>v<<><>>v^v^v<><<>^v>>v<v<vvvv<^^>><^><<>v^^><<v^v<>v<<v<^<^^<>v^>>^v^<<<>>^v^>^<^<v<v><^<>^v^<<><>v>^^^<<^<v^v^>vvv<v><^v^^>v^>>v^<<><<^^^<^><v<v^v^>><^^>>^<vv^>>>>^>><^v^v<^<v^v<><vv>v^v><>^<v^><v^v><>>^^>v<<<<>v<>v>v^v<><<>^>><><<^><<><^vvv<><<^^<v<v>^v^^>>v<vv<^<<^><<<<>><^v^>v>^v^<^<<v><vv>^^v<<><^^><<^v<>v<<<v^vv^^^>>v<><><>><>vvvvv<>>>vvv<<<^v>^^^>v>>v>vv<vv^vvv^<>>^<<v<>>>>^<<<^v<<^^^<vv<<v>>^v^<>^<><>v>v<^<<<v>^><v<^>^v^v^<vv><>v^>^<^^<vvv><<^>v<^^<^vv^^<v^v
^<>v>><<v^>^v^<>^^^>^>>vvv<>v<v>^<^vv<v^><vv^><>^v<<vv<>v><^^v^^v^^^^<^^v<<^^vv<<<<>vv<v^^v<^v<^>>v<^^>><vvvv^<v^<v<<^<>^^^<<>>v><^><^<v>v>^^>v><>^^vvv>^<^^v<v^v<<<^<>^<v<<<<v><^>^^<>vv<><^><>v<>v><^vvv>>>^>>v^<vv><v<>>>><v<^<^^<>^v><>^^^>^>v><^<v^<^v<>v>>v>v^<>^v<><>>><v>^<<<<vv>>><v>>v>^^v>><><^<<>><<<^<<^v^v^>^^><^<<<<>^><<<^v<<>v<<v>>^vv<^v><<<v><^^^><v^^<^vv>>vv<v^<<>^<^>vv<><>^v><>v^>v><^^<^v^v<^>vv>v><^>^>vv<v>^<^><^^^<>^>>vv<<vv^<v>>vv>vv<v<v<^<<<<<^<^^<<><^^<vvvv^<v^>><<<v>v<>><>><^vv<v<<v>^^<^^><^^<><^>><^>>^vv<^^v^<^v^v^<v>v>^><><<^>v^<>^>><^vvvv^><<<v<v<>>^vvv^vvv<><><>v><>v<vv>v>>>^<><^v>>^>v<><<v<>><>>>v^v>v><vv>^<v<^^^><v<<v<v>>><^<^^v^^><v><>><>><^<>>^<v^<<<v^>v^^v>>>^v>v^vvvvv>^<^^>><v^v^>><vvvv^^>vvv<^v^<^>v<^v^<>><>v^>>v<^<v<v>^>v><v>>><^v>^><v<v<vv^^<<>><<<v>^v^^v>v<><>v><<v>vv<^^v>>^>>^v^<^><^><v>^vv^v<^^v>v>v><^^^<><vv<<^v^<v<v>v>vv^>v^>>^vv^vv^^>v>>><<>^<vv>^>^>>^>^<>vvv^>^^<^^><>^vv><>v>><vv<^vv<^<<v>v^>^<>^^<^^>>v^<>>>>v^>v^^><>><v><^v^>>vv>>v>^^v^>^<^>>v<>v^>v
>^<<<^>><v<<^^><<v^v>^<>^^<>>^v<<<^vv<>><<^<><>^<^v<v^^<>v^<v<<vv^<><<v>^<<>>><vvv^>^>v><^v>^<v<v^<<<>>><^><v<<<>^^<<v>^<<v<vv><v^vv>>^<<v><>>v<vv^^<^^<><v^>^v^<<<v>v^^vv<v^>>^^^v><<^><v^^>vv^^>v<^>v>v><><vv<<><>^<<>>v^^<>vvv>v<<<^^<>^^<vv>^^>><>v>v>^vv>v><>^^><<^v^^vvv<v^^^v<^^<<<v^<v>vv^<^^v<><^>vv>>vv>^<>>^v^>v<^v<<v^>^vvv<v^>>>v^^>>^^v<v^^<>v<v<>^<<^>>v<<<>>v^<<<<v><<v^^<v^>>^^<^>^<<><^^>v<vv>v>v<^<v>><>v<^<v>>>v<vv<<<>^<>^^v^><^<>vv^^>>>^>v^<<>v><<v<<^>^>^<>vvv<vv>><<><>^vv<v><^<<vv>>v>>^<<v^>^^<v>>^>^>v^>><>>v<v<^<<<<><v<>^v^^<^v^^v>v>^v<><>>>^^><<<>v^^^<^v<v><^^v<>v<v><v>^^<<>^^v<>>^vvv>><<<<^vv^v>^v<>^>vv^^vvv>vv^><^<<>>v>^vv^v^>><<v^^>^<>>>vvv>^vv^^<>^vv^>^<><^<v^<<><v<>>>>v><>v>^vv>>vv<^^<^^>^>v><^><v^^<>vv>>><>>^^>>^v^v<^<>^vv^>v<><<^^v<><<v^^<<v><>v^v<>^<>v^^<<^^^^^><>v^v><^^v^<^><vvv<^>^<<^^v><^^>v><v>>^<vvvv><^<v>><<<>v>>>>^<>^<^v><>^<v<v<<>^<<^<^v^>v<<>^>^<v<^v^<>^v<>vv>v^<vv<^v>vv>v<<<>^v<>^><v><<<>^^<^^<v^><><<><^^>vv^^<^<^v>v>vv^>^>><^<v<><^><<>>>>^vv>^<v<><<<v<v>>v^^
vv<v>>>^<<vvv^>>v^^v<v^<><^^v<v>^v^<>><>>vv^>>v<<>v^^<<<>vv>^v^>v<>>^>v<^v><<>>^<>^^<<v>^^>>^v><>^^<>vv>><v>vv<><^^v^^<v^>>>^v^^<v><<<>^^vv><>v<><>>^^<v^v^<vv<><vvv><<vv^>^<><><<v^^><^v>v<^^^>>^v^>^><vv<<<>v>^v><v>^>v<v>^vvv<>v>><vv^v><<vv<^^>>v<>^<>v^v^^>^^<vv^><^<^v>v<vvv^><v^<^<v<><>v^^v>v>vvvv^vv^^^>v>vv<>>^<v>^vv^>v^<<v^v><>>v^>vv>vv^>^v^>>^<><^><v>v^^<v<>^><<>v<^>^^<v><>>><vv><^><v<^><<>^<vv^vv>^>^<^^<<^>v^v>^<^<v<v<^<vv^>>vv^^<<^^vv>>><^>vv^><^<><v^<^^v<><^<v<^v^^^v>>vvv>>^^^^><^>>>vv<>>v>>^^>^^>^v^vv^>>^>>v^v^^^v>>><>^<>>><^<v<<<><<>>^^vv<vvvvv^vv><^v^<^<<v^^<>><<>^<^<<<^^>v>v<<<<^v^v<>v^<<>>v<vvv>^vv><>^^^<>v<vv><v<<><vv<^v<>>^v<<<>v^^^^^>v^^<><<<vv^<>v<^v>v<vvv^<^^>^<<<vv<>^>^<v^<><^><^<^<^v><v^^v>^v^><^^<<^><^^>^>>^v>^<>v>>vv>v<<<^^v<^v<v>^>><v><<^^<<^v><<v<^^^^v>>^v>>>v>^^^^v>^<<<><<v<>v^>v^^>^v>v<vvv>^<>v^^v>^>^v><v<^<><^<^^v>>^<<vv<vv>>v^<vv<v><<^>>><<^>^>v<<^><^v^v^>^>^vv^vv>>vv<<<<v><^v><^>>^>>>v>>^>^>><<>><>v^><^^v<<^^v<>^><^v<<<vv><^^^<>^^v^<>>v^<>^^^^<v>>v><<<><>^v>v
v<v>v<>^>v^<^^<>^^>vvv<>><>>v><><<<>><^^>^<<<v^<vvvvvv<^v>v^>^>^>vv>>^v^v^<><><^><vv<>><<v>^v^vv><<>><vv><>v^<^<>v^<<v>^vv><<v>>vv><^>^>vv^vv<<^v<<v<><vvv<^>vvv><>>v^<^^^v^^<^>^^^>vv>^^<<v<^^>vv^v^<>^<<vvv>v<<>v^vv<v>>v<v<vvv<>>^>>v>vv>^v^^<<v>^vv<>v^>>><^<<>^^v^vv^v><vvv<<>>^^v<^<^<>vv><^>>^<<>v<^v<>^<>v^^vv<>><><^^<^v^<v>>^^<<^^v><^^v^^vvv>v<><^>><^<^<>v>>vv^>>^vv<>>vvv^><v<><>^v<><<>><>^^<<>>v<<^<><<^^v<<^^>><<^<vv<<<v^^<^<>>vv^^>><>>v><^<v^^v<>^>>^v<v^><v><^><<^<v<<vvv<<^>^^><>^<<><<><<^>>vv>>^vv<>^^>>v<>><vvv<<^^v^^<>>vv<><<vv><^^v^><v>^<>^^><^v^>v^v><v<^v^<>^<<>>vv<v<^^vv<v^v^vv<><vvv><vvv^^<vv><<<^v><^vvv<>>^v<>^^<^^<vvv^<v^<<^^>v^<^>v<>>^vv<<>^><>>v^^v>v^<v^^^<>^v^v>>><>^>v<>^^<><^><<<<v<<<vv^>>>v^vv^><>>>v<<<>v<<<v^^>v<^>^v^v<^vv<<<^>v>v^>^^><^>v>v><v><^^v>^vv>>vv^>^<^v>><>vv<vv^<^<v>^v^v>^<>>v^<^^^><v^v^><<<^^>>>^^>><v>^>^^><^^v>v<>vvv><^vv^^^^v^^<^><>>^>>^>^<v^><>^^<v>><vv><vv^>>>^<<v^v<<>>vv^>^>v>v^><v^^^^^^<^>vv<>>^>^>>^>><v>v><><vvvvv<^v^>v^>>v<v<v<^<vv^>>>>^<>^<<v<><^^><
><<>^>>^<^^v^^><<v>v>v^>v>>^^<><^^<^vvv<><<^^<^^><vv<^^v<>^^v^^>^vv><v^^^<>^<<<v><>^<<>vvv^v<v>^^<><>>><<>><^<>>^>^<^v>v>>v^>^^v^^^>^vv><v<<v>vv^v<>v^^^v<v<v>><^<>><>>vv<^>v^>^v<>^^^vv<<>v<<v>^^v><>^<<^>^>>^<<>^^^<<^vv^<<<^^^^<v^^^>>^>v<^<<^^>>^vv^><vv<^^^^<v><v<^v<<vv>v>v>^>>^^^v<<vv><^vv^^>>>^>^^^^<>>>>><^>>^^<><v>^<<v^>v^^vv<v^>^><>>><>>^v<^><>v^>^>>^>^^^>vv>v>^^^^vv<>>>v<<^^>>>v^v<^<^v<v><<>>^^^<>^v>>^<><v<>^><^>>^>>v><><vv^^vvv^<<^^v<vv^<<>>>v>><^<<<><v^>v>><>^>>>v^vv<>vvvv>v>>vvv>>vv^><>^^>v^>v<v<v>>^>v^vvv^^>>v^>><vv><v^<v<>>^>v<v<v>>^<><v<<v<<^<v<><<<>^^>v^v>>vv>^^<vv^v^<>>^<>>^v<^<<><<^><v><>^^vv>^<^^v>>^><^<^^><^v<v>>>^vv>><v>^v>^<v^>><v>^><^vv><v>^^>>v^>^^<^v^<<<v<^<<^v>^<<v>vv<v<<>vv^vv>^>><>v^><<vv>><><v^<^vv^<<>v<<>vv^^^<^vv>v^v><>^>>^v>><^<^^v>v^>vv^^>>^<><><^v<><<^><<><><vvv<<v<<vv^<<<<^<^v<v<v<<v<^>>^v>v<<<v^vvvvv<<^><vvv^<<>><v<><<^<>><^<^<>>^<v>v>><<^><>v>^>^v><>>^>>><<v>v<vvv>>>>>><<<v><>v>>v^^vv<^^<<<>vv^>vv<^^>^<><vv<^^<><v<^>v<v<^>^^<><^^>v^^>^>>v>vvv<<<v^>>>^<^v
v<>^^^>^<^>^<<<<v^>^vv^>><>v<<>>^<v<^v>v^^^>><>>v^^<<><^^^^>>^<^^<v<>v^v>v<<v>^>>v>^>^v<>^>v<<>>^<>^^<^<>>>^v>^<vv>>^><^^>><<^^><>^><<>^>^<v<><^^<vv>>v^v>v>v><^>>>>v<>^<vvv^^>^v<^^v>><<v<<>>>v<<v^>>^<>v<v>v<^>>^>><>>v>^v<>^^<^><>><>v<v><vv<>>^>vv^>^^<v>>v>>v>>^v<v<^^><<<<<^vv><<v>vv^>>v><>><vv^<^v^v^v>><v<^^>vv<>>^^<^<v<^vv^^<<<^<v<^>v^v<vv>v<<><>^v<^<<<vv^<>vv^v<>v>v<>^^^>^^>>v>vvvv><vv^v^v^v><<>v>v>>^<vv<<<v><^>><^v<^v><v>^>v<<<<vv^<^v><<>v^<<<^^^^<>vv>vvv^>^v>v>v><><<<^^vv^^^><v><v>><v^v^^<>v^^>vv>v<>>v><^v>><<><>v<^<>^^vv^^><>v^^^<vv>^>^^^<<>^<v><<<>^<^<<v^vv<<<vv^>>v<>>vvvvv<v>v><^vv>>v>><<><><^^>^>^>^<v><<<vvvvv>^<v<v^v>^^v><<<^v<>>^>>^v>^^v^^^^v>^>>v>vvvv<vv<^v<vv><^>v>^>^<>vv^^>><^^>>v^v<^>vv^<vv^>v^>v>>>>v>v^v^>>v><>v^v^<^>v<^^^^^v<<^>v>>^<v<v<>v>v^v>v^>vvv>vvv^vv^^v>^>v^v<v>^^>v<^vvv><>^v>^vvv>v<><vv<^><^^>v^^>><^<v^>^<^>vv>><<^^<>^<>>^><^^v^<<>>^^v<v^>>v^>v>^v^>v>>>>^>>>^>^><>^v^v^>vv^^<^^^>>^vv^^^>v^>>^<<v^^^v^vv><<^^<<v<v>^>^v^^^>><<v^<>><v>><>^<><<v<v<<>><<^>vv>vv<v<v<<<^
v>vv<<v<^v<v<^v>^v<>>>^>>><^^^><v^<><<<>^v>>^><<v>>^v>>^<>>v^>^^vv<<^^><<>v<vv^v^^^>^<>>^<<<<^^^><^<><^vv><>>v<^^>v>^v^^v><v>^v^>>^<^>vvv>^v<>v<>v>^^^><>^vv^<^<^>v<v<v<v<>^v^<vv<<v<^vv<v<v^^<vvv<<^^v<><>>><^v<v^v<^<<vv>^<>^^^<^><<v>>>v^v<^>v<^>^<vvv<^^^vv<^v<<<<v><<^<vv<v<>>^^^^<<<><v<<><><^>v>><v<>><^<v<^^>^>v^><v^<^<^<<>v^vvv<<^^^><^><^>>><<<<^<^^v<^<^v^<^><<^>>v<^>v<>><^v><v<<v><<<>>vv^<>^^^><^<vv^<^<^<v<<^><>^^><v^vv><^<^>v>>>^<><v<v>><>v<>vv<^^<^<^^<><v^<>v<><<vvv^vv>v^vvvvv<>v>>v><^^<<v>><<>v^>^v^><^<>>vv<>^^<<^<<v<<<v<^^^^><<>v^^<^>^v><><^>>v<>^vv^v>^v>>vv<^<^>vv<^<^<^^^<>v^vv><^^>v><<<<>>v^vv<^<v><>v><v<<<vvv<^<<v^><<<><><^vv<>v<vv<<<<^^v^v<<v><^v^<><<>^<^^vvvv<<>^^vv<>>><v<^<v^^vv^v^<v<><v>><>^v^^^>v>>^>v^>^<<>v>>^v^^<<^^v><>^v^>vv>>v<v<^vv>>^<^v<>>vvvv>>>^^<v<><vvv^<><>^><>>v>><<^<>^>^>v>>>^^<^><^v>><^><><<v<^v<v>>^v^^>v^v>>^v^v<<<^^^<^<^<<^v>^<><vv^vv><>>>v>^<<><>v<v>v>>>^>v<><>vvv^v>^v^vvvv>^<v^^^^>v><v<v>>^<^>v>^>>><<v>>vv<>^^<<>^v^v<<>vv<>^v>v<>^^<<>><<^vv^>><v<v><vv<<>v^
^^><v^^^<v>vv><v>^<<v<^>>vvv<^<vv<>^v>v>v>v<v^vvv<>>v>^v><vv>>^^><>v>v><<v<<vv><v^^><vv>><^>><^v>v^vv^^<<><^>v<vv<^><v>v^>>^><<v^<^v<<>v>^><<<^<<>^vv<>>v<<<<><>v>^^<v>><^><<vv>>>v^>v<^vv>v>^^<^>>v>^^<v<<<<>><v<^<v>>v^vvv^v>v^<^v<v<^^^<^v>>><<>>>v<<<><>^<>^>^>vvv^^^>>v<^<v<v^^<^<^><^^^<^>v^>^<^v><><^vv^^><><^>^<<^>>v^>^v^<<^>v^>^<^>v>vvv<<v^<><<>v>>>>^>>v^><^vv><v^v><<vvv^^>>><<>vvv<^<<><vv>>>^<^v^^>^>v^<^><><<vv^vv<vv^>v^vvv^^^<>^v>^>><^<<>>>>>>v<^>vvv>v^^^<<^>v<^><>>v>vvv<^^><^<^vv>^v<><v<v><>><vv>^<vv>>>^>^<^><^>vv<v>><v^v><><^><<<<v^<vv>>>^>^v><>>v^v>^v<^^^><vv^<><><^^>^^>v>^^^<^v><<<>>v<>>^>^^v>^^><>v<^^<<v><>>v<v<><v><v^^><^^>>><<^>>^^vv><<>><>^<<vvv^>vv<<v<v^<^<vv^<><>>v^<vv<^^<v^^v>^v^v^^<><<<>v<>>^>>^<^<<<<vvv>v<vv^v^>^>>^<^<<>vvv<><v><>vvv>>>>^^>^v<v>v>><v^<^^v<v>^^v>>v<>^^^><^^^><>>^<v^<v^>^^<<>>>v<^v^>^^<vvv<^^^<v^<>^vvv><^<><>>>^v<><><v>^>>vv>^^vv^^<^<>vv<^<^<vv><<>^>><<>><vv^>>^v><^v^^v^<^>v<<><v<^<>>^v^^<^^>^>><>>^><>^><v<>v^>>^^^^^^<^>^^><vv^>vv>>>>>^>v>^><v>^>>^v>>^><<>
>v><>^v^^>><<<<^^><>^><v^vv^v>v<<<>vv^^^v^^<<<>v<<^^<>v<><^v<<^^v<>^v>^v<^v^<vvv^><<v><<>>^<vvvvv<^>v^<><<<>>v><>v><vv>^v<v<<>^<v<v^<^>^vv^^><><v>v>v^>v>><v^^^<<vv><v^<^<^^^<><^>^<><>vvv>v^^<>vvv^^v>v><^>^>^<<<v>^v<^><^<v>vvv<vv<^><^>^>v>>^>^^vvv<>v<<<^>vv^>v>v^v<v>>v><<>vvvv>^>^v<^v<>>v<vvv>v><>v^>>^<^^>v<^^>>>><vvv<^><><v><^v>>^>^^>^^^>^>><^<vv<>^<><vv>^^>v^<<^<^<v<v^v<v<<v^v^^v<<v^^<<v^><vv>^<>vvv><>>v^^>^<^v<^^<vv^<^^<>^^v>>>^>^^v<<<<>>vv>vvv<^>vvvv<^<vv^vv^v^^<>^^>^>v<>>>^<><^>><^>v<<<^><>>^<v<v>>v><<<<^>v^^<v>>^^vv<^<<v^vv<^<><v<>>>v<v<>>^>>^<^<<^v>^>>><^^vv<<vvv<><v<<v<v>>^>v^><^>^vv^<>><<^>^>><v>^>^>v><<>^<<v>v>>^>v^>^^v<>v>^v>v<>>^^>>>>>^><>>^>><<v^<^^>vv<>v>^>>^<v<v<<<<^<^>^<vvv<><<vv^vv<v>>>>^>v<v<v^^>>^>>>>vv><<^v<^<<>^<^>vv>^v<v^^vv>>^^^>>><<<>v^^^<^<^><v><^<^>v<><>><><^v^^>>^<<v><^^><v>>>^<><^><<^v^<>>^v>^^<>^^^^^^v<^<^v<<<<<>>>>vv><v^^v^<^<<<>>^<^v<^>>^>><v^<<>^v<^^v>v^v><v^vv^^<<<^v><^<^v><<<>v>v<>^>^>v>v>^vv<<>^v<<vv><^<vv<>>>^<<<v^^v<^v^><<<<^v^v<v<><><>^^v^<><^v^^<><
^>v^<^><<<vv<vv>v<>>v<<vv>v>v<<<<<<^vv^<<<v^^v<v>>v^vv<vv^<<v<^v>v<^vv^<>^>^v><^>>^vv<<<^^^v>^<^><>vv<<v^>v<v^<<^><^<^>>^<^v<>^^<^v<^><v>><^v>^^<vv<v>v<>>><v>v^<>>v<<<^>^>v<<>>>^<v<>>><><^v<>vvvv^<v^<>v><v^>^^>^^^>^v^v<>^v>^^v<^>vvv<>><^^^<^^<>v>^>>v^<>^^vv<^vv<>v<><^<>^^><<<^^>v>v^^>>v>vv^>vvv>v<<^<v>><<<<>v<vv<><>^<v^>^>v^><>^>vv<><<^^><v^v>vv<v<^<v<<^>^<<<><^>^<>>^<^vv<>v>^<v<<<>vv<^>v<><^v><<<vv><<<v><^v<v<<vv<^v^<v^^<>v><^<vv^>><><^<v<v^<<>>^v>v>^v^<v<<v><v<>><><>>>^>^>>>v><>>^^<<<<<v^vvv<^v^<>^vv<>>v^>^<<vv^>>^^^<>v^v^vv><^vv>><^<>^>v>^<vv><v^^^v^<^^^<<^>^<>>>>^<^v<v<><>>^^<v<>^^v^v<>^>v<^^><^<<v><^>v>^vv<^vv<>>>>><v<^^vv<v<^>vv<^v^v^^v<v<<vv>^><<<<^>vv^><v<<v^>>^>v<v><^<^>^^>v><<^<>v<<v>v<><v^<<^>v>^<><v^<<v<v^v>^>vv^^<<^^v><>>vvv<>>^vv>><<^^<vv<>>>^<^^^><>^vv<v<^^v^^^^^<<v^<<v<>v>^^^v<^<^>v><v^v^v>><<>v><vv>>^vvvv<^^<<<v><<<vvv^>><v>v<^^^><vvv^^<<^vv>v^v^>v^^<>^v<v^>v^v><<<^v>^v>^<v^<v<v<^>^<^v>>v^><v^^^<>^>v>v>^^vvv>v^^>>^v<>>^v^<v>^^>^^<^><><v<><>^v<v<><^<v>>^>>><v><^v<>vvv^>
<>><>>v>vv^<^^<^vvv^v><^><<>vvvv^><<<>v<<<>^><^v><vv><^<v<v><v<^v<vv^^<<^v>>v^>^>vv><vv^vv^<v^vv^^>^<<>v>>>>^^vv<v^^v<>>v>^vv^>^v>v><vv<^v<v<<^v>>v>><v<<v>^^^><>v>>^v>>v^><^vv^^vv<v<<^^v<>^<>v<>><^^v^>v^v>v>vv<<<v^^^^<^^v>vvvvvv^v^^^><<>vv>^v^><>^^v>>><^>v>>><vv<><v^>>v^vv>^<vvvv^vv>v<v>^><<>^v<>vv>vvv^v^vv^v^^<<vv<<^v>>^<>v^v<>>^<v>><^>^<>^^v^v^v>>vv><vv<>v>v>v^>>>>>^><<>^v<>^<^^^v><>v>^^^<>v^>^vv>>>>>><>v>><>>>v>><<^>v^^>v<vv<^^^>v><><<>v^>vv^^^v<<^>v^<>v<>>v>^^^v<v<v^<^>>v<^vvv<v^<>^v<<><v<v<<^v<vv^^vvvv^>v><<vv^<<^<<>v>^^^<^^^><>>^vv>^<<<vv^<v<v<<><^^><v^<<^v^^>^<^v<^^vv><^^>^<^><>^<v<<^^>v>><<^>vv<^>^><<v<<v^<<^v<^^^vv>>^>^>v><>^>>^<vv>>v>^^>vv<<<>>><>^>^><<>v^<<<<>^^v^<>>>^><^>>>^><v>v<>>^v<^>>><^^<v^vv^>^><<<>><><^v>^<>v<v>^<<^<^>^<>>>^v>><<^vv<^vv^v<>>v>v>><vv>v^^vv^<^^vv><^v<>^v>>vvv>v<<^<>^v^<vv^v<<>v^>vv<>^vv<^<^>><<>vvv^<>v<^<v>v>^^v^<v<<v^v^^^>vvvv><v<<v^vv<>vv^v^<^<<^v>v<^<<><<vv<>>v<^<^<<^>v<<^<<<>v><><^^>v<v<>v^>v>v><><<<^^<^>vv<v>><<>vv<<<>^v>>vvv^^v<^<v<v^v^^>><v<>^<^
<v<<v><vv<>^^v^v>^>vv^><^<>v><^vv^<^>>v<v>vvv<>>^vvv<>>v<>^v>><>vv>^v<v>vv^v^^<^v><<<vv<vv<v^<><v^><^>>v>vv^<^v^<^vvv><>><^^v<^<^<>>^>^<v>^<<v><<>v^vv>^v>><v^v^v<vv^^v^^vv<v<<v^v>^>^^v<<^^^>v<><><^>^>>v>>v<>^>>v><><v^<<v<>vv>v>>>^>^<>v^>vvv<^<vv><<>vv<<><v<<<><>^vvv<><<v>^^^v^^v>><<v<v>v>>v^v<vv<<<>>>^v<v>v>v>^v^<<<^>>^>^^^<<^>>^><v<^v^>v<><>^^<v>^^<>^vvvv^^v^<<<^><^><<^>v><^v^>v<<^><<vv<v><vv<<><<^^v<v>^^^><<v<>v>>^><v^<v>^vv<<<<^vv<v>v>>>^><><<<<v>v<^^v><>^v<^<>^<<v<^v^>vvv<<v>^^><><v<><^v<>>><<^>v><><v<>>><><^v<^<<><v^^v>vv>v>^^><^<^>v^>v>vv<>^<<^><v<<v><^^><v^>v<^v>^vvvv><^vv>^^^><^v><><vvv<<v^^^^vv>>v^>>v^v<>v>>><>v><>^<^<<<>>>>vv>>v<^>>><^<^>^^>><>^^<<<>v><v^^>v^<^v<<>vv>v^<v<^v><vv^<<>>^^<^><^<vvv>>vv^>>^<v>v><<><<>^v<><^^vv<^vv<<v>>><>>v>^<<^v<^v<^^>^><^>^^>><<<>^>>>>v>v>>>^v>^^v<^v>^<>^>>^<><^>vvv>>vv<<>^v^>^^>^<^^><^v<>>^v<><<>v>v^>^vv<vv<<v<^^><<v<v>^<<v>v<<v>><^v><v>^<^<<^<^v<^v>>v^^^v>v<v>>>^<^<v<^>v^v^v>><<^>^v>>v^<>v>^>^^<^v>>^v<^<^^><><<<<^vv<<^^>^><>>^>>>v>^^>^<v^^<>><
v<vv^>^<^^<><^^>>v>>v^^^<>v>v^<^<<v^^>>^>^>>^<v><^^^^>^<v>^v><vvv<^vv>v>>^><<^>>^vv<^^^^>^^v^<<v<><<vv<^<vv><v^v^v>v<^><<v^<<>^>><v<^v<<vvv><>>^vv^^<<^v<<>v><>^<<v>>v^v>^<<v><<v<^^>v>><vv<<^>><v<^>vv^vv<^<<v^vv<<^^>^^v><<^v>>>vv<^<^<v^^>^^v^>v><<>v^<>v><<v>v<v^vv^<^^>v<v^v>><^<<>>>v><^<v<><>^^<^<><^<<v>vvv<v^^vv^<^^><<v<vv^<<><<>>>^^^^>>v<^>>^v<v<^>v>vv<^>vvv><<v^>^^v<>^<>vvv^><v^<<<v<<><vv^<>>v<v^vv<><>v<<>v<^v^^<<v>^vvv>v<<v<v><<><v<^>>v^<^>v^vv^v>v^v<v<>><<>>>v<^<<^>vvv^>v>>>^vv><><<<v<>vvvv>^<>><^^v><><^v^v^^v<v<^vv^<>><^^>>>><^>^>^>v>>vvv<<>^><>^^v^^^v^^>v<<v>vv^><>><<v^<vv<><>v<v<^^vv<<><<vv^v<>v^><^v^^^^^<><<^<^^^>^^^vvv^<<^v>vv<<<v>v^<>v<<v^<<>^>v^vv^>^^>v<>vv^v><><>^<><>>><><^v^<>><<v<^v<<><v>vvvv<<^><v^><v>^v<><>v^<<^^vvv<<<>^>^>^^^>^v><^^<>^>^v<v^^v>^>>^v^v<<>vvvvv^<vv>^v<>v^<><^<^v<>^v>^^><^v>v<>v>vv>^>^v<^<<^>v^<v^<><v<vv>v>^^><vvvv>^<^>^vvv<<<^><^<v>^<^>>^^>^<<<>^>^vvv^v^<vv<^^v<v^^^>><v>^>><v>v<>><>><v<<<><^v^v^>>^^>>>v<<^^^>^v^^^><v><<<<<<^v><><vv<><^v>vvv>^v<v<v>v><>v<
<<>>v<^><^vv^^^^v^v^v^^<v<^v<<>^<^v<^^<<<>v^>>^^^v<>v^v>>>v<<><<<>^^>>^<<v>>v^<v>v^^^>^>^><>>><>>^v>><<^^vv>^<^^^<>^>>^<v>v<v^<>>>vvv^>v<v<><>^^v^<vv<>^^v>v<><<<>v^v>v<^v>^<^v^vv^><^>v^>v^>v^^^<>v>v<<v>v>v^^>><>^><v<<><<vv^>^vvv^v>^^<<<>^>v<<v<v<v>^<v>v<<>v>v<><>^^<v>>^vv<<v<^>><>vv>v<>v^>^^><v<<><^><><v<<>>><v^>v<^<v^v>><<<v<<v^><vv^^<<^<<>^<>v^><v<^v^v^<>>>^^^vv^<v^>><>vv<<vv>^<^v<v^^^><^>^>^<^v>><^v^v^>>^^v^v>v>>v>>vv^^^^>><>vv><vvv^v><<vv^<>>^^v><<<><vv>v^>^>^<^>^v>^<v>vv><><^<<<<^<^<v>^vv<<>>^v^^v^>>><vv>><^><v>>^<v>v>>v<v<v>><v<><v^<<^v^<v^v<<v^^<<><<^^v>v>>^<^^v>>vv<<^vv^^v<^>^^v<^^<<vv>>vv><^<v^^^<<^vv<<<v<^><<^><^^vv>^^>^^^<<v<v^><<<^v>>vv<vv^^><<<><^vv^><v>^<^<>>vvv^v>><^<vv>^^^>^v<>>vv^^<v<>^<>>^^v>>>^^vvvvv^<^<<>>v<vv^^<^<v><<>^<<>^<v^^^^>>>>v<v<><^^>v^><<><vvv^v<<vv<^v^v><><>^v^^v>>^<<v<v^^v^>>v<^<^^^v<<^>^^<<<<<^<>^><^<^v>^^^<>v^<>>^^>v^<^>^>^>^<<^><>v^v>>^<><^^>^>v<<v<><vv>>>v>>>^>>v<><<^<^v^<v^<v^<v^v>>>>v^<>^v<vv^^<>vv<<vv><<>>>^>^v^v><>>><vvv^<>^vv<<^^<>^v>><<v><<^<<^
vv<v>vv><><>>^^^>v><<>>><>^<^^^><v<vv^<<<><>><v^v^><>^<v^v^^v<<<v<v^<>>v><<<>>^<<^<v^<<<^>v<v^><<v^v<<^<<v><<^^^><v^>>>>^>>>>^><>v>><v<^^^>v>v>>v>><vv^vvvv>^^<>v><v^>v^^^^<<>vv<v><^>>>>^v>vv^>vvv^v<v>>>v<^^^>v>vvvv<<<vvv>^>^>><>v^<^^vv>^<v<^v><<><v^><<>v><<<><^v^^>><>>^^<v><><>^<<>>>^<>^<v>>^>><>^<<><vv^>^<v^v<><vv<^<<^v>^>><<>><^><<<>>v<>v^^>vvv<<^<>vv^>v<vv<>^><>^>^^v>^><><<v^<>v^v>v>^><><><^<v<^v>^^^>^v<^>^vv^^v<^><>>><^<<v<vv<v><^>>v><^v>>^>v>>v>>>vv><>v<^^v<<<^^<>^v><^<<v<<v<^^v><^^^^^>>vv^<<><>v<^<>vv<<>^^<>^>v<vv^^<^^^<v^>vv>^<<vv>v<v>>^^<>>>^vv^^^^^^><vvv>^><^^>v>^vv<<vv><><<>vv>v<v>^><><^>>v^>^>>v<v>vv<vv<^><v><<v<vv<v><><><v>^<>^<vv<^>^^v>^^^^^^v^>^<v<><^^^^<>><v>>>>>><<>>>>^<vv><<^>>>>>^>vv>^<<<<>v^><v>>>v^<vv^>vv^>>v>>v^^<><^<>v<^<v<<^<^><^><><><^^<^<><>^>v^<^>><>>>^^<vv<<vv>^^v<<vv^^vvvv^v^^<^v^v^^^^><v^<>^^v>vv<<^<>v<^>v><>^^^<<<^><<v>>v<<v<v><v^<v^vv^<vv<>^<^<>^>v>v<<^^^>>^^<>^<<^^<^^v^v^^v^^<^<<v>^<v>^^>^>^>v><^v^^^v>v^v>>v^>^>>v<>^<^v^^^^^<v>v<v^<^><^>>v^<^<<>^v^v^><<v
+71
View File
@@ -0,0 +1,71 @@
##################################################
#..OO..O.O....O...O..O...O.......O...OO##....O.OO#
#O.#..#OOO#..O..OO...O.O.....OO..O#O#.OOO.....#..#
#.....O.......OO.#OO....#O.OO.O..OO.O.O.O..##....#
#.O....O...O#...#...OO..#..O........#O..#..O..O..#
#O....O...O.O..OO..OO..#OO.#OO.O......##..O..O...#
#..O.##..#O...O...#.#.O.O..O.#......O..#.#...O...#
#O.O.........O..O........OO....OO......O.....O#..#
#...O....#..O..O........O......O.#.....O..O#..O..#
#.....#OOOOOOO.O.....O.OOO.#.#.........O#O....O..#
#.........OO#...O.O.#.O..O.....O..#.O..OO.O.#..O.#
#OOO...............#O.OOO..O#....O.....O...#....O#
#....O...O.O.#....O.O.O.OO..#......OO..O.OO.O...O#
#O.O..OO..#...........#O...O.O#...O...O..O..O.O..#
#OOO...O...#O.O.O...OO..#OO.OO#..O...O..OO...O...#
#..#........#...O..O...#.O..OO..#O.OO.#O......O..#
#O.........O.#O.......O.#.O.O....O#...OO...O...OO#
#.#...O.O....O.O....#...#.O...............O..#.OO#
#...O.....O..OOO...O..#O..#.......#OO..O..#...O..#
#OO.O#..O.#..O.#.........OO...O.OO..O....OO.O....#
#.O..O...O.......OOO....OO....O.OOO........O..O..#
#O..O..#..O.O.O..O.O.O..#O.......O..OO..O..O.....#
##O#.....#.O.....O#......O.........OOO.O...#.OOO.#
#O.#OO...O..#.O#.O..O.##OO......#..#OO.......O.#O#
#..O...#..O....OOO..#...@....OO.#.O#..OO......O..#
#.O#.....O...O..O#..O.OOO.OO.#O.O.O..O....O..OO.##
#..#.#.O#....#..O.O.OOO.......OO......O.OOO......#
#.....O....O...#.OO.OOO..#...O..O...O..#..O#OO.O.#
#OO.O.......O#...O.O......OO....#.O...OO.O..O.O..#
##O..O..O##..O..OOOO...O..#O..O.OO.O....O....#.#.#
##..OO#O.##...#O.OOO.......O.....O..O..OO.O...OOO#
#...#..OO.......O.O..OO..........O...OO....OO.O#.#
#..O.O..#OO.....O.........O#O.#..#..O...O.OO..O..#
#..O.#O...O............#O.O.O...O..O.O...#...OOO##
#...#OO.O#.OO.......#.......O..O.##....OO....OOOO#
#.O.....O..O...O.....#..O.....O...OO.O.O.......OO#
#...#O...O.O.#O..O..#..OOO#....O##....#OO.#.#OOOO#
#.O.#OOO......O...O..O.#O.OO..O.......O...O..O..##
#O.....O.#....O.OOO..O...#O#O....OOOO........#...#
#O...#.O...O.OO..O.O.O.............OO.O.#...#.O###
#O....OO.O.OOO#...#..#.....O#O..O..O.O..O#.O...O.#
#.........O#.##.OO..O..O..##..O........O..OOO....#
#.#....O.....O.O......O.O.O...OO.O....O..#O..O...#
#....O##O.O..#....O.OO.O...O..O..OOO..O...#..O...#
#O#....#.......O..O..#..OO.......O.OO.....OO.O...#
#O...O#OOO.O......O......OO..O.#.O.....O.O....OOO#
##....O##...#O.....O.#........OOOOO#..O....#.O.O.#
#O...O.....OO.....#O...O......O..OO.O..OOO.O#.O.O#
#O.O..#.O.O.O.O#.O#....OO.O....O.OO......O#OO...##
##################################################
>><^v><>^v<<vv<>vv><v><<^^>>>>^^><>^<^^vvv>>><><>v^^^^<<^<^><>>>v><><vv^v^<>>>^>><>v>v>^v>>v>>>v^<<^>v^<v<v<v^^>>v<^v>vv^><vvv<<^<><>^<>vv>^>^^^v<^^>v^>v>v<<^>>>^^vvv<>v>><^^<><<>v>>>^<v>vvv^^v>^^v<>^^<^^v^><>>><<<v^>v^>v^><v<^<<>^v^><v<^><^<>>>>v^<><^^>>>^^v^^<v^^>^v^v>>v<><<<vv^<<>^>^v>>v^v^<^<<><^>>^vv>>vvv^<v>v^<vv><^<<<vv>vv>^<^^>v>>^^^<^^^^<<^<<<<<<v>^v>^^v>>>^<>vvvv>>><<><>^v>>vvvvv^<<^<>^>v>>^>>>v<v><>^v^v><<^v<vv<v^<v^v>><^v<^>>^>>v<^v>>v>>v^v^v<<>v>><<><^<v<^<<v<<v>>^vv^vv<>v<v^<^^>^^^vv^<<>^>^^vv>^^<>>v^<v>>>><v<vv<v<^><^v<^vvvv><v>><<><>v<^<^vv<<<>><^<>^<^<>^<vv^>>><v<^^>vv<>v^>^<<^<^>^<^vvv>>v^>>>^<^>vv^<<^^<<>>>v><>v>^>^v>><><^<<>v^>>^<<>^v^<^<><^^^v<>^<v^v^v^<<^^<<<^>v>v<>^^^^^>>v>^v^v>><>^<<>^<v>>v^><v><<<>v^<<^^><>v<<v><vv^^<>v<<v<>>>v>v<<^v<vv><v<v>>^<<>vvv<<^>vv<<vvv>v>^>>^^^^^^^vv^v>>>vvvvv>^>^v<>v>><^v^^v^^v><>vv>><v<^<^>^v>^^^<<^><v>v^<^v<>><<^v^<^><v^v^^><<^v><><^^v<v><v>^><<^<<<^v<^>><>^^vv<^<<^^^^^v<vv^<v<^<<>>>^><^^>^v^v>v^<v^v^v^^>^v>^^><>v^v>vv>^>v^><v<>v<v<
>>v<v^<vv<v<><<>><^<^<^>><^<>>^>^^<^v^^^<v<^^vv^^^>>^>v>>v<<v^<>vv^<<>^v><v^v>v<>v<<^^^^<^v^<><vv^^v>v<<>>^>>^<^>><<v^^^>vvv>><>>^<^>v><v<<^<<v<<>v<^vv^v<>^>^v^><<<><^v>><v><<^v<<^<^<>>>>v><v>>v<>>><v>v>v<vv<>^>v<^>^^>v^^vvv>v>v<vv>>v<<vv^^v>><>><<<v^vv<<v^^v<<><v>^^>^^vv>v><>v<>>>>vvvvv<>v><<<<>vv>vv><^v^<^<v^<><<^^vv><^<vv^v>>^<>v>><>vv^>v<vv^<^><^v>^>v>^v<v<>^v^<>v><v<>>vv>>vv<^>^<>v><<vv^<><^<>vv><<<<v<<^v>>>^<>>^v^><>v^>^<<^>v^^^vv>>^vv^<<v><>vv^^v><vv><v<vv^<^>>v<><^<^v><^<<<^^<>>vv>>^^<^<<v>><>^^^<vv^<v<vvv><^^>^<<<^>v>^^v<<<vvv<^v<<vv>vvv<^<<v>v^><^^><>^<vv<>^<v<>v><<<v>>v^v<>>^><v><<^v>><v<^<vv^<^>>>>v>^>^<><v^v^v<v^<vvv<<<^<vv^>>v^^<^><^v><^^>v>v^>^>v>>^>>>>^<<v><v<<vv<<<^^<><v<^^<>v>>^^>v><><><<><v><v<>v>>^>^<v<^>^^<^><^^^v>v>>^^<<>>>vvv^v>v^v^<>^^<^><^vv^>^^^>>^><^><>>^<^^<<>>>v<<><v><>vv>^>v>^<^>^^>v<>>vv>^<^^^><vvvv^^vvv<v<<^<v^<<v<^>v><^<>v<<^>v><>>>><>>><^><^><^<<v^^^>^<v><v<>v>v<<^<>^vvv<>v>>>>^v>v^>v<^>^vv<<^<v<>v>vv^^<<vv<^^>v^<><<<v>v>vv^^>v<^^v><<>v>^>>^^v>>^>vvv>^
^^<v><<>^vvv<^v^>><^<^<>^<<v^v<vv>>vv^<^^<vv>><vv^v<<>^<^><^v>^>v^<v>>>>vv>vv<^>^<>^>>^><^>^<>^<>^^v>^vv<^^v>^>v>v>v<><<<>>^vv^<>vv^^^^^<<v>^^^^<<v<<v<v>v<<<^v^><<^>vvv>><v^^<<^>vv>^<<>>vv><<>^v>v^<vv>^vv<<^<v>>>>>>>>><>><^><^^^^><><<>^^^<<<v^^<<>^>v<^>^^<<><>^<<<>v^<>^v^<>v<^<<v^vv>v><^<^v<><<<>>>v><<<^<^>>^<^^><v<v^>vv^^><v>vvv^><^>^^>v><<v^>^v>^><vvv^<^<^^<^^>>>v^>^>v<v^<<^><<^<v<<>>^>^v<v>v^^vv><vv^>v<<v>^>v^v>>v>vv<<<<<^><^^<^<^^>><vv>^<<<vv^^v^vv^^^>v>vv^v^^>><v>^v<^v^>>>^>>^>>vv^v^<>^<>^><^>>^>^><<><^v^v<vv<<vv^<v^v^><<>v<^><>v>^v^<^>v><^><v<>>^v^vv>>^v<vvvv>><><>^v^vvv^<v^v<v<>^<v^<<v>v<<<>^<<>>v>v>><<^>><^<<<<<<<<^^>^>^^>><<>>^<v>v^^>v>>>><^^v^<>vv>^^vv<^<>v^v<<^^vv>>v^>>v><v^^^^<^v<<vv>vv<>^>v<v>v<><<<v<^v<^v^^^<<^vvv^>>vvv^>>^><v^^><>v<vv><>v>v^<<v><v<^><<v<^<v>vv<<><<v><<^^v>^><<<v<<v>^v>vv^><<<^>>v><><<<vv^>>^^<<^>^v^<>^v>v^>v><>v>>^v>^<^^>>>vv>>v^<>vv^^v>>v<^<>>^<^^>^>vvvv<>vv>>v<><v>>v<>v><^^^<<v<>v>v>>^v<<^<>><>^^<^<v<^^>><^^v<<<^>^>v^<>^><><<^^>>>>^<v<v^>>>>>><<<>^v<v>
>^>v^^<^<^<<^<vvv^>v^<v^^v>^<v><><^<^>><^v<^^^vv<v>v><^>^><<^^<^^v^>>><<v>vv>><><<<^^>>^^>>^^v<^>v^>><>v^v^>^^<^v><v^>^^<>>>v<<v^v<^>v^<vv^><>><^>v>v<^>>^>>>v^>v<^>^<v>>^<<^<v<vv>^<v<<v>^<v^<^<^v<><v>^vvvv<>>^^^<<<vv<>>v>v><vvv>vv^<^^^^^>v<^^<^>>v^^<>>v^vv^^v^><v^^^^>^^vvv^<^^<>vv^v<>><^^>v^>^v>>>^^>>>^<^v<v>^>vvv^^<><>><^vv>>^><<<<<^>>>^<vv><<v>>>v><><>>><vv>v^<^>>><^v>vv<<^<>v<><>vv><^^<^v^<<^v>^>v^vv<>^v^>v<v<>^<vv^v<^>^<<^<>><^^^<><^vv^v^^v^<vv>>^^>^<<^>>>><>^^<^^<v<<<<v>>>^<>^^>v^^^<v^>>^^v>><v>v^vv<v>^<^<<><v^<^<^^vv^v>><v<<^v<<^^^<<^v<v^>vv^^v>^>^v><^>><<^<v^<vv>v^^v><<^v><^v><>^^>^v><>vv^v><<v^<>^^>v^><><><^v>v^v>vv>^v><><<v<><>^<>vv<^<>^<<v^>vv>^v^^^v<vv^v<<<^<><<<<<v>>^v<v<<<v^v<vv<>^v>^<^<vvv>^>v><v<>v><>vvvv>^^v^^<>>>v>>>^^>vv^v<<^>v^<v><vv<^<>v<<^<<<vv^^>^vv>^<><<>^>>v^v>^<^v^<v<^<<>^<>^^<>^<^><vv<>^<<v<<><^>v><^<><vv<<v^<^>^<>>vvvv>^vv^vvv^^v><<^v<><<<^vv>><<^>^<^>v>v<>>^<^>^^v<^v<<^v>>>><>vv<^<v<^^v<>^<<>v^v><<v<v<>>^>^^<<v>^^<vv>vv<>>^>v>v>>^^v>^^>><v><^><v>>v<><^v<^v<^
<>v<v<^<>v^>><^<^<v<>>v^>v<vvvv<>^^><^>^>>^^>^v<^<v^<v><>v^<vv<^<v<^><v<v^>v^<<>>^^>^v<>^v<vv^<<v<>><vv^<^^vvv<><^vvv^><^<<v^^<<v^^><v><^v>^<^v^>v<>>^vv><<^v<<v<<vv<vv^>>>vv>vv^><v<<<^vv><>^v>^><<^v<<>>><^>><>vv^<vv<><><^<>^<v>v>^>>>>vv>vvv>v<>vvv^v^v<^<^v>><<>><><>vvvv<>vv<vv>>v^>><>^v<vv^v^>><^vvv^^<v^><v<^vvv<><><^^^v^<<v<>v^>^v<<>^>>^v^>^>^v>^<^^<>^<^^><>>v>^^><v^<v>^>v<v<<<<<<^v><vv<<^vvv>^>><>^><><v^v^^<vvv<^^<v^^>v<v<>v>^>><<^vv><<>><<v<><v<>^v^^<>v^v<v>v^>vv^<<>^>vvv^v<v^^><>v<<>><<v^<><^^vv<<<^><<><^>vv>v<<<^><vv^>>v<<><>>v^v^v<><<>^v>>v<v<vvvv<^^>><^><<>v^^><<v^v<>v<<v<^<^^<>v^>>^v^<<<>>^v^>^<^<v<v><^<>^v^<<><>v>^^^<<^<v^v^>vvv<v><^v^^>v^>>v^<<><<^^^<^><v<v^v^>><^^>>^<vv^>>>>^>><^v^v<^<v^v<><vv>v^v><>^<v^><v^v><>>^^>v<<<<>v<>v>v^v<><<>^>><><<^><<><^vvv<><<^^<v<v>^v^^>>v<vv<^<<^><<<<>><^v^>v>^v^<^<<v><vv>^^v<<><^^><<^v<>v<<<v^vv^^^>>v<><><>><>vvvvv<>>>vvv<<<^v>^^^>v>>v>vv<vv^vvv^<>>^<<v<>>>>^<<<^v<<^^^<vv<<v>>^v^<>^<><>v>v<^<<<v>^><v<^>^v^v^<vv><>v^>^<^^<vvv><<^>v<^^<^vv^^<v^v
^<>v>><<v^>^v^<>^^^>^>>vvv<>v<v>^<^vv<v^><vv^><>^v<<vv<>v><^^v^^v^^^^<^^v<<^^vv<<<<>vv<v^^v<^v<^>>v<^^>><vvvv^<v^<v<<^<>^^^<<>>v><^><^<v>v>^^>v><>^^vvv>^<^^v<v^v<<<^<>^<v<<<<v><^>^^<>vv<><^><>v<>v><^vvv>>>^>>v^<vv><v<>>>><v<^<^^<>^v><>^^^>^>v><^<v^<^v<>v>>v>v^<>^v<><>>><v>^<<<<vv>>><v>>v>^^v>><><^<<>><<<^<<^v^v^>^^><^<<<<>^><<<^v<<>v<<v>>^vv<^v><<<v><^^^><v^^<^vv>>vv<v^<<>^<^>vv<><>^v><>v^>v><^^<^v^v<^>vv>v><^>^>vv<v>^<^><^^^<>^>>vv<<vv^<v>>vv>vv<v<v<^<<<<<^<^^<<><^^<vvvv^<v^>><<<v>v<>><>><^vv<v<<v>^^<^^><^^<><^>><^>>^vv<^^v^<^v^v^<v>v>^><><<^>v^<>^>><^vvvv^><<<v<v<>>^vvv^vvv<><><>v><>v<vv>v>>>^<><^v>>^>v<><<v<>><>>>v^v>v><vv>^<v<^^^><v<<v<v>>><^<^^v^^><v><>><>><^<>>^<v^<<<v^>v^^v>>>^v>v^vvvvv>^<^^>><v^v^>><vvvv^^>vvv<^v^<^>v<^v^<>><>v^>>v<^<v<v>^>v><v>>><^v>^><v<v<vv^^<<>><<<v>^v^^v>v<><>v><<v>vv<^^v>>^>>^v^<^><^><v>^vv^v<^^v>v>v><^^^<><vv<<^v^<v<v>v>vv^>v^>>^vv^vv^^>v>>><<>^<vv>^>^>>^>^<>vvv^>^^<^^><>^vv><>v>><vv<^vv<^<<v>v^>^<>^^<^^>>v^<>>>>v^>v^^><>><v><^v^>>vv>>v>^^v^>^<^>>v<>v^>v
>^<<<^>><v<<^^><<v^v>^<>^^<>>^v<<<^vv<>><<^<><>^<^v<v^^<>v^<v<<vv^<><<v>^<<>>><vvv^>^>v><^v>^<v<v^<<<>>><^><v<<<>^^<<v>^<<v<vv><v^vv>>^<<v><>>v<vv^^<^^<><v^>^v^<<<v>v^^vv<v^>>^^^v><<^><v^^>vv^^>v<^>v>v><><vv<<><>^<<>>v^^<>vvv>v<<<^^<>^^<vv>^^>><>v>v>^vv>v><>^^><<^v^^vvv<v^^^v<^^<<<v^<v>vv^<^^v<><^>vv>>vv>^<>>^v^>v<^v<<v^>^vvv<v^>>>v^^>>^^v<v^^<>v<v<>^<<^>>v<<<>>v^<<<<v><<v^^<v^>>^^<^>^<<><^^>v<vv>v>v<^<v>><>v<^<v>>>v<vv<<<>^<>^^v^><^<>vv^^>>>^>v^<<>v><<v<<^>^>^<>vvv<vv>><<><>^vv<v><^<<vv>>v>>^<<v^>^^<v>>^>^>v^>><>>v<v<^<<<<><v<>^v^^<^v^^v>v>^v<><>>>^^><<<>v^^^<^v<v><^^v<>v<v><v>^^<<>^^v<>>^vvv>><<<<^vv^v>^v<>^>vv^^vvv>vv^><^<<>>v>^vv^v^>><<v^^>^<>>>vvv>^vv^^<>^vv^>^<><^<v^<<><v<>>>>v><>v>^vv>>vv<^^<^^>^>v><^><v^^<>vv>>><>>^^>>^v^v<^<>^vv^>v<><<^^v<><<v^^<<v><>v^v<>^<>v^^<<^^^^^><>v^v><^^v^<^><vvv<^>^<<^^v><^^>v><v>>^<vvvv><^<v>><<<>v>>>>^<>^<^v><>^<v<v<<>^<<^<^v^>v<<>^>^<v<^v^<>^v<>vv>v^<vv<^v>vv>v<<<>^v<>^><v><<<>^^<^^<v^><><<><^^>vv^^<^<^v>v>vv^>^>><^<v<><^><<>>>>^vv>^<v<><<<v<v>>v^^
vv<v>>>^<<vvv^>>v^^v<v^<><^^v<v>^v^<>><>>vv^>>v<<>v^^<<<>vv>^v^>v<>>^>v<^v><<>>^<>^^<<v>^^>>^v><>^^<>vv>><v>vv<><^^v^^<v^>>>^v^^<v><<<>^^vv><>v<><>>^^<v^v^<vv<><vvv><<vv^>^<><><<v^^><^v>v<^^^>>^v^>^><vv<<<>v>^v><v>^>v<v>^vvv<>v>><vv^v><<vv<^^>>v<>^<>v^v^^>^^<vv^><^<^v>v<vvv^><v^<^<v<><>v^^v>v>vvvv^vv^^^>v>vv<>>^<v>^vv^>v^<<v^v><>>v^>vv>vv^>^v^>>^<><^><v>v^^<v<>^><<>v<^>^^<v><>>><vv><^><v<^><<>^<vv^vv>^>^<^^<<^>v^v>^<^<v<v<^<vv^>>vv^^<<^^vv>>><^>vv^><^<><v^<^^v<><^<v<^v^^^v>>vvv>>^^^^><^>>>vv<>>v>>^^>^^>^v^vv^>>^>>v^v^^^v>>><>^<>>><^<v<<<><<>>^^vv<vvvvv^vv><^v^<^<<v^^<>><<>^<^<<<^^>v>v<<<<^v^v<>v^<<>>v<vvv>^vv><>^^^<>v<vv><v<<><vv<^v<>>^v<<<>v^^^^^>v^^<><<<vv^<>v<^v>v<vvv^<^^>^<<<vv<>^>^<v^<><^><^<^<^v><v^^v>^v^><^^<<^><^^>^>>^v>^<>v>>vv>v<<<^^v<^v<v>^>><v><<^^<<^v><<v<^^^^v>>^v>>>v>^^^^v>^<<<><<v<>v^>v^^>^v>v<vvv>^<>v^^v>^>^v><v<^<><^<^^v>>^<<vv<vv>>v^<vv<v><<^>>><<^>^>v<<^><^v^v^>^>^vv^vv>>vv<<<<v><^v><^>>^>>>v>>^>^>><<>><>v^><^^v<<^^v<>^><^v<<<vv><^^^<>^^v^<>>v^<>^^^^<v>>v><<<><>^v>v
v<v>v<>^>v^<^^<>^^>vvv<>><>>v><><<<>><^^>^<<<v^<vvvvvv<^v>v^>^>^>vv>>^v^v^<><><^><vv<>><<v>^v^vv><<>><vv><>v^<^<>v^<<v>^vv><<v>>vv><^>^>vv^vv<<^v<<v<><vvv<^>vvv><>>v^<^^^v^^<^>^^^>vv>^^<<v<^^>vv^v^<>^<<vvv>v<<>v^vv<v>>v<v<vvv<>>^>>v>vv>^v^^<<v>^vv<>v^>>><^<<>^^v^vv^v><vvv<<>>^^v<^<^<>vv><^>>^<<>v<^v<>^<>v^^vv<>><><^^<^v^<v>>^^<<^^v><^^v^^vvv>v<><^>><^<^<>v>>vv^>>^vv<>>vvv^><v<><>^v<><<>><>^^<<>>v<<^<><<^^v<<^^>><<^<vv<<<v^^<^<>>vv^^>><>>v><^<v^^v<>^>>^v<v^><v><^><<^<v<<vvv<<^>^^><>^<<><<><<^>>vv>>^vv<>^^>>v<>><vvv<<^^v^^<>>vv<><<vv><^^v^><v>^<>^^><^v^>v^v><v<^v^<>^<<>>vv<v<^^vv<v^v^vv<><vvv><vvv^^<vv><<<^v><^vvv<>>^v<>^^<^^<vvv^<v^<<^^>v^<^>v<>>^vv<<>^><>>v^^v>v^<v^^^<>^v^v>>><>^>v<>^^<><^><<<<v<<<vv^>>>v^vv^><>>>v<<<>v<<<v^^>v<^>^v^v<^vv<<<^>v>v^>^^><^>v>v><v><^^v>^vv>>vv^>^<^v>><>vv<vv^<^<v>^v^v>^<>>v^<^^^><v^v^><<<^^>>>^^>><v>^>^^><^^v>v<>vvv><^vv^^^^v^^<^><>>^>>^>^<v^><>^^<v>><vv><vv^>>>^<<v^v<<>>vv^>^>v>v^><v^^^^^^<^>vv<>>^>^>>^>><v>v><><vvvvv<^v^>v^>>v<v<v<^<vv^>>>>^<>^<<v<><^^><
><<>^>>^<^^v^^><<v>v>v^>v>>^^<><^^<^vvv<><<^^<^^><vv<^^v<>^^v^^>^vv><v^^^<>^<<<v><>^<<>vvv^v<v>^^<><>>><<>><^<>>^>^<^v>v>>v^>^^v^^^>^vv><v<<v>vv^v<>v^^^v<v<v>><^<>><>>vv<^>v^>^v<>^^^vv<<>v<<v>^^v><>^<<^>^>>^<<>^^^<<^vv^<<<^^^^<v^^^>>^>v<^<<^^>>^vv^><vv<^^^^<v><v<^v<<vv>v>v>^>>^^^v<<vv><^vv^^>>>^>^^^^<>>>>><^>>^^<><v>^<<v^>v^^vv<v^>^><>>><>>^v<^><>v^>^>>^>^^^>vv>v>^^^^vv<>>>v<<^^>>>v^v<^<^v<v><<>>^^^<>^v>>^<><v<>^><^>>^>>v><><vv^^vvv^<<^^v<vv^<<>>>v>><^<<<><v^>v>><>^>>>v^vv<>vvvv>v>>vvv>>vv^><>^^>v^>v<v<v>>^>v^vvv^^>>v^>><vv><v^<v<>>^>v<v<v>>^<><v<<v<<^<v<><<<>^^>v^v>>vv>^^<vv^v^<>>^<>>^v<^<<><<^><v><>^^vv>^<^^v>>^><^<^^><^v<v>>>^vv>><v>^v>^<v^>><v>^><^vv><v>^^>>v^>^^<^v^<<<v<^<<^v>^<<v>vv<v<<>vv^vv>^>><>v^><<vv>><><v^<^vv^<<>v<<>vv^^^<^vv>v^v><>^>>^v>><^<^^v>v^>vv^^>>^<><><^v<><<^><<><><vvv<<v<<vv^<<<<^<^v<v<v<<v<^>>^v>v<<<v^vvvvv<<^><vvv^<<>><v<><<^<>><^<^<>>^<v>v>><<^><>v>^>^v><>>^>>><<v>v<vvv>>>>>><<<v><>v>>v^^vv<^^<<<>vv^>vv<^^>^<><vv<^^<><v<^>v<v<^>^^<><^^>v^^>^>>v>vvv<<<v^>>>^<^v
v<>^^^>^<^>^<<<<v^>^vv^>><>v<<>>^<v<^v>v^^^>><>>v^^<<><^^^^>>^<^^<v<>v^v>v<<v>^>>v>^>^v<>^>v<<>>^<>^^<^<>>>^v>^<vv>>^><^^>><<^^><>^><<>^>^<v<><^^<vv>>v^v>v>v><^>>>>v<>^<vvv^^>^v<^^v>><<v<<>>>v<<v^>>^<>v<v>v<^>>^>><>>v>^v<>^^<^><>><>v<v><vv<>>^>vv^>^^<v>>v>>v>>^v<v<^^><<<<<^vv><<v>vv^>>v><>><vv^<^v^v^v>><v<^^>vv<>>^^<^<v<^vv^^<<<^<v<^>v^v<vv>v<<><>^v<^<<<vv^<>vv^v<>v>v<>^^^>^^>>v>vvvv><vv^v^v^v><<>v>v>>^<vv<<<v><^>><^v<^v><v>^>v<<<<vv^<^v><<>v^<<<^^^^<>vv>vvv^>^v>v>v><><<<^^vv^^^><v><v>><v^v^^<>v^^>vv>v<>>v><^v>><<><>v<^<>^^vv^^><>v^^^<vv>^>^^^<<>^<v><<<>^<^<<v^vv<<<vv^>>v<>>vvvvv<v>v><^vv>>v>><<><><^^>^>^>^<v><<<vvvvv>^<v<v^v>^^v><<<^v<>>^>>^v>^^v^^^^v>^>>v>vvvv<vv<^v<vv><^>v>^>^<>vv^^>><^^>>v^v<^>vv^<vv^>v^>v>>>>v>v^v^>>v><>v^v^<^>v<^^^^^v<<^>v>>^<v<v<>v>v^v>v^>vvv>vvv^vv^^v>^>v^v<v>^^>v<^vvv><>^v>^vvv>v<><vv<^><^^>v^^>><^<v^>^<^>vv>><<^^<>^<>>^><^^v^<<>>^^v<v^>>v^>v>^v^>v>>>>^>>>^>^><>^v^v^>vv^^<^^^>>^vv^^^>v^>>^<<v^^^v^vv><<^^<<v<v>^>^v^^^>><<v^<>><v>><>^<><<v<v<<>><<^>vv>vv<v<v<<<^
v>vv<<v<^v<v<^v>^v<>>>^>>><^^^><v^<><<<>^v>>^><<v>>^v>>^<>>v^>^^vv<<^^><<>v<vv^v^^^>^<>>^<<<<^^^><^<><^vv><>>v<^^>v>^v^^v><v>^v^>>^<^>vvv>^v<>v<>v>^^^><>^vv^<^<^>v<v<v<v<>^v^<vv<<v<^vv<v<v^^<vvv<<^^v<><>>><^v<v^v<^<<vv>^<>^^^<^><<v>>>v^v<^>v<^>^<vvv<^^^vv<^v<<<<v><<^<vv<v<>>^^^^<<<><v<<><><^>v>><v<>><^<v<^^>^>v^><v^<^<^<<>v^vvv<<^^^><^><^>>><<<<^<^^v<^<^v^<^><<^>>v<^>v<>><^v><v<<v><<<>>vv^<>^^^><^<vv^<^<^<v<<^><>^^><v^vv><^<^>v>>>^<><v<v>><>v<>vv<^^<^<^^<><v^<>v<><<vvv^vv>v^vvvvv<>v>>v><^^<<v>><<>v^>^v^><^<>>vv<>^^<<^<<v<<<v<^^^^><<>v^^<^>^v><><^>>v<>^vv^v>^v>>vv<^<^>vv<^<^<^^^<>v^vv><^^>v><<<<>>v^vv<^<v><>v><v<<<vvv<^<<v^><<<><><^vv<>v<vv<<<<^^v^v<<v><^v^<><<>^<^^vvvv<<>^^vv<>>><v<^<v^^vv^v^<v<><v>><>^v^^^>v>>^>v^>^<<>v>>^v^^<<^^v><>^v^>vv>>v<v<^vv>>^<^v<>>vvvv>>>^^<v<><vvv^<><>^><>>v>><<^<>^>^>v>>>^^<^><^v>><^><><<v<^v<v>>^v^^>v^v>>^v^v<<<^^^<^<^<<^v>^<><vv^vv><>>>v>^<<><>v<v>v>>>^>v<><>vvv^v>^v^vvvv>^<v^^^^>v><v<v>>^<^>v>^>>><<v>>vv<>^^<<>^v^v<<>vv<>^v>v<>^^<<>><<^vv^>><v<v><vv<<>v^
^^><v^^^<v>vv><v>^<<v<^>>vvv<^<vv<>^v>v>v>v<v^vvv<>>v>^v><vv>>^^><>v>v><<v<<vv><v^^><vv>><^>><^v>v^vv^^<<><^>v<vv<^><v>v^>>^><<v^<^v<<>v>^><<<^<<>^vv<>>v<<<<><>v>^^<v>><^><<vv>>>v^>v<^vv>v>^^<^>>v>^^<v<<<<>><v<^<v>>v^vvv^v>v^<^v<v<^^^<^v>>><<>>>v<<<><>^<>^>^>vvv^^^>>v<^<v<v^^<^<^><^^^<^>v^>^<^v><><^vv^^><><^>^<<^>>v^>^v^<<^>v^>^<^>v>vvv<<v^<><<>v>>>>^>>v^><^vv><v^v><<vvv^^>>><<>vvv<^<<><vv>>>^<^v^^>^>v^<^><><<vv^vv<vv^>v^vvv^^^<>^v>^>><^<<>>>>>>v<^>vvv>v^^^<<^>v<^><>>v>vvv<^^><^<^vv>^v<><v<v><>><vv>^<vv>>>^>^<^><^>vv<v>><v^v><><^><<<<v^<vv>>>^>^v><>>v^v>^v<^^^><vv^<><><^^>^^>v>^^^<^v><<<>>v<>>^>^^v>^^><>v<^^<<v><>>v<v<><v><v^^><^^>>><<^>>^^vv><<>><>^<<vvv^>vv<<v<v^<^<vv^<><>>v^<vv<^^<v^^v>^v^v^^<><<<>v<>>^>>^<^<<<<vvv>v<vv^v^>^>>^<^<<>vvv<><v><>vvv>>>>^^>^v<v>v>><v^<^^v<v>^^v>>v<>^^^><^^^><>>^<v^<v^>^^<<>>>v<^v^>^^<vvv<^^^<v^<>^vvv><^<><>>>^v<><><v>^>>vv>^^vv^^<^<>vv<^<^<vv><<>^>><<>><vv^>>^v><^v^^v^<^>v<<><v<^<>>^v^^<^^>^>><>>^><>^><v<>v^>>^^^^^^<^>^^><vv^>vv>>>>>^>v>^><v>^>>^v>>^><<>
>v><>^v^^>><<<<^^><>^><v^vv^v>v<<<>vv^^^v^^<<<>v<<^^<>v<><^v<<^^v<>^v>^v<^v^<vvv^><<v><<>>^<vvvvv<^>v^<><<<>>v><>v><vv>^v<v<<>^<v<v^<^>^vv^^><><v>v>v^>v>><v^^^<<vv><v^<^<^^^<><^>^<><>vvv>v^^<>vvv^^v>v><^>^>^<<<v>^v<^><^<v>vvv<vv<^><^>^>v>>^>^^vvv<>v<<<^>vv^>v>v^v<v>>v><<>vvvv>^>^v<^v<>>v<vvv>v><>v^>>^<^^>v<^^>>>><vvv<^><><v><^v>>^>^^>^^^>^>><^<vv<>^<><vv>^^>v^<<^<^<v<v^v<v<<v^v^^v<<v^^<<v^><vv>^<>vvv><>>v^^>^<^v<^^<vv^<^^<>^^v>>>^>^^v<<<<>>vv>vvv<^>vvvv<^<vv^vv^v^^<>^^>^>v<>>>^<><^>><^>v<<<^><>>^<v<v>>v><<<<^>v^^<v>>^^vv<^<<v^vv<^<><v<>>>v<v<>>^>>^<^<<^v>^>>><^^vv<<vvv<><v<<v<v>>^>v^><^>^vv^<>><<^>^>><v>^>^>v><<>^<<v>v>>^>v^>^^v<>v>^v>v<>>^^>>>>>^><>>^>><<v^<^^>vv<>v>^>>^<v<v<<<<^<^>^<vvv<><<vv^vv<v>>>>^>v<v<v^^>>^>>>>vv><<^v<^<<>^<^>vv>^v<v^^vv>>^^^>>><<<>v^^^<^<^><v><^<^>v<><>><><^v^^>>^<<v><^^><v>>>^<><^><<^v^<>>^v>^^<>^^^^^^v<^<^v<<<<<>>>>vv><v^^v^<^<<<>>^<^v<^>>^>><v^<<>^v<^^v>v^v><v^vv^^<<<^v><^<^v><<<>v>v<>^>^>v>v>^vv<<>^v<<vv><^<vv<>>>^<<<v^^v<^v^><<<<^v^v<v<><><>^^v^<><^v^^<><
^>v^<^><<<vv<vv>v<>>v<<vv>v>v<<<<<<^vv^<<<v^^v<v>>v^vv<vv^<<v<^v>v<^vv^<>^>^v><^>>^vv<<<^^^v>^<^><>vv<<v^>v<v^<<^><^<^>>^<^v<>^^<^v<^><v>><^v>^^<vv<v>v<>>><v>v^<>>v<<<^>^>v<<>>>^<v<>>><><^v<>vvvv^<v^<>v><v^>^^>^^^>^v^v<>^v>^^v<^>vvv<>><^^^<^^<>v>^>>v^<>^^vv<^vv<>v<><^<>^^><<<^^>v>v^^>>v>vv^>vvv>v<<^<v>><<<<>v<vv<><>^<v^>^>v^><>^>vv<><<^^><v^v>vv<v<^<v<<^>^<<<><^>^<>>^<^vv<>v>^<v<<<>vv<^>v<><^v><<<vv><<<v><^v<v<<vv<^v^<v^^<>v><^<vv^>><><^<v<v^<<>>^v>v>^v^<v<<v><v<>><><>>>^>^>>>v><>>^^<<<<<v^vvv<^v^<>^vv<>>v^>^<<vv^>>^^^<>v^v^vv><^vv>><^<>^>v>^<vv><v^^^v^<^^^<<^>^<>>>>^<^v<v<><>>^^<v<>^^v^v<>^>v<^^><^<<v><^>v>^vv<^vv<>>>>><v<^^vv<v<^>vv<^v^v^^v<v<<vv>^><<<<^>vv^><v<<v^>>^>v<v><^<^>^^>v><<^<>v<<v>v<><v^<<^>v>^<><v^<<v<v^v>^>vv^^<<^^v><>>vvv<>>^vv>><<^^<vv<>>>^<^^^><>^vv<v<^^v^^^^^<<v^<<v<>v>^^^v<^<^>v><v^v^v>><<>v><vv>>^vvvv<^^<<<v><<<vvv^>><v>v<^^^><vvv^^<<^vv>v^v^>v^^<>^v<v^>v^v><<<^v>^v>^<v^<v<v<^>^<^v>>v^><v^^^<>^>v>v>^^vvv>v^^>>^v<>>^v^<v>^^>^^<^><><v<><>^v<v<><^<v>>^>>><v><^v<>vvv^>
<>><>>v>vv^<^^<^vvv^v><^><<>vvvv^><<<>v<<<>^><^v><vv><^<v<v><v<^v<vv^^<<^v>>v^>^>vv><vv^vv^<v^vv^^>^<<>v>>>>^^vv<v^^v<>>v>^vv^>^v>v><vv<^v<v<<^v>>v>><v<<v>^^^><>v>>^v>>v^><^vv^^vv<v<<^^v<>^<>v<>><^^v^>v^v>v>vv<<<v^^^^<^^v>vvvvvv^v^^^><<>vv>^v^><>^^v>>><^>v>>><vv<><v^>>v^vv>^<vvvv^vv>v<v>^><<>^v<>vv>vvv^v^vv^v^^<<vv<<^v>>^<>v^v<>>^<v>><^>^<>^^v^v^v>>vv><vv<>v>v>v^>>>>>^><<>^v<>^<^^^v><>v>^^^<>v^>^vv>>>>>><>v>><>>>v>><<^>v^^>v<vv<^^^>v><><<>v^>vv^^^v<<^>v^<>v<>>v>^^^v<v<v^<^>>v<^vvv<v^<>^v<<><v<v<<^v<vv^^vvvv^>v><<vv^<<^<<>v>^^^<^^^><>>^vv>^<<<vv^<v<v<<><^^><v^<<^v^^>^<^v<^^vv><^^>^<^><>^<v<<^^>v>><<^>vv<^>^><<v<<v^<<^v<^^^vv>>^>^>v><>^>>^<vv>>v>^^>vv<<<>>><>^>^><<>v^<<<<>^^v^<>>>^><^>>>^><v>v<>>^v<^>>><^^<v^vv^>^><<<>><><^v>^<>v<v>^<<^<^>^<>>>^v>><<^vv<^vv^v<>>v>v>><vv>v^^vv^<^^vv><^v<>^v>>vvv>v<<^<>^v^<vv^v<<>v^>vv<>^vv<^<^>><<>vvv^<>v<^<v>v>^^v^<v<<v^v^^^>vvvv><v<<v^vv<>vv^v^<^<<^v>v<^<<><<vv<>>v<^<^<<^>v<<^<<<>v><><^^>v<v<>v^>v>v><><<<^^<^>vv<v>><<>vv<<<>^v>>vvv^^v<^<v<v^v^^>><v<>^<^
<v<<v><vv<>^^v^v>^>vv^><^<>v><^vv^<^>>v<v>vvv<>>^vvv<>>v<>^v>><>vv>^v<v>vv^v^^<^v><<<vv<vv<v^<><v^><^>>v>vv^<^v^<^vvv><>><^^v<^<^<>>^>^<v>^<<v><<>v^vv>^v>><v^v^v<vv^^v^^vv<v<<v^v>^>^^v<<^^^>v<><><^>^>>v>>v<>^>>v><><v^<<v<>vv>v>>>^>^<>v^>vvv<^<vv><<>vv<<><v<<<><>^vvv<><<v>^^^v^^v>><<v<v>v>>v^v<vv<<<>>>^v<v>v>v>^v^<<<^>>^>^^^<<^>>^><v<^v^>v<><>^^<v>^^<>^vvvv^^v^<<<^><^><<^>v><^v^>v<<^><<vv<v><vv<<><<^^v<v>^^^><<v<>v>>^><v^<v>^vv<<<<^vv<v>v>>>^><><<<<v>v<^^v><>^v<^<>^<<v<^v^>vvv<<v>^^><><v<><^v<>>><<^>v><><v<>>><><^v<^<<><v^^v>vv>v>^^><^<^>v^>v>vv<>^<<^><v<<v><^^><v^>v<^v>^vvvv><^vv>^^^><^v><><vvv<<v^^^^vv>>v^>>v^v<>v>>><>v><>^<^<<<>>>>vv>>v<^>>><^<^>^^>><>^^<<<>v><v^^>v^<^v<<>vv>v^<v<^v><vv^<<>>^^<^><^<vvv>>vv^>>^<v>v><<><<>^v<><^^vv<^vv<<v>>><>>v>^<<^v<^v<^^>^><^>^^>><<<>^>>>>v>v>>>^v>^^v<^v>^<>^>>^<><^>vvv>>vv<<>^v^>^^>^<^^><^v<>>^v<><<>v>v^>^vv<vv<<v<^^><<v<v>^<<v>v<<v>><^v><v>^<^<<^<^v<^v>>v^^^v>v<v>>>^<^<v<^>v^v^v>><<^>^v>>v^<>v>^>^^<^v>>^v<^<^^><><<<<^vv<<^^>^><>>^>>>v>^^>^<v^^<>><
v<vv^>^<^^<><^^>>v>>v^^^<>v>v^<^<<v^^>>^>^>>^<v><^^^^>^<v>^v><vvv<^vv>v>>^><<^>>^vv<^^^^>^^v^<<v<><<vv<^<vv><v^v^v>v<^><<v^<<>^>><v<^v<<vvv><>>^vv^^<<^v<<>v><>^<<v>>v^v>^<<v><<v<^^>v>><vv<<^>><v<^>vv^vv<^<<v^vv<<^^>^^v><<^v>>>vv<^<^<v^^>^^v^>v><<>v^<>v><<v>v<v^vv^<^^>v<v^v>><^<<>>>v><^<v<><>^^<^<><^<<v>vvv<v^^vv^<^^><<v<vv^<<><<>>>^^^^>>v<^>>^v<v<^>v>vv<^>vvv><<v^>^^v<>^<>vvv^><v^<<<v<<><vv^<>>v<v^vv<><>v<<>v<^v^^<<v>^vvv>v<<v<v><<><v<^>>v^<^>v^vv^v>v^v<v<>><<>>>v<^<<^>vvv^>v>>>^vv><><<<v<>vvvv>^<>><^^v><><^v^v^^v<v<^vv^<>><^^>>>><^>^>^>v>>vvv<<>^><>^^v^^^v^^>v<<v>vv^><>><<v^<vv<><>v<v<^^vv<<><<vv^v<>v^><^v^^^^^<><<^<^^^>^^^vvv^<<^v>vv<<<v>v^<>v<<v^<<>^>v^vv^>^^>v<>vv^v><><>^<><>>><><^v^<>><<v<^v<<><v>vvvv<<^><v^><v>^v<><>v^<<^^vvv<<<>^>^>^^^>^v><^^<>^>^v<v^^v>^>>^v^v<<>vvvvv^<vv>^v<>v^<><^<^v<>^v>^^><^v>v<>v>vv>^>^v<^<<^>v^<v^<><v<vv>v>^^><vvvv>^<^>^vvv<<<^><^<v>^<^>>^^>^<<<>^>^vvv^v^<vv<^^v<v^^^>><v>^>><v>v<>><>><v<<<><^v^v^>>^^>>>v<<^^^>^v^^^><v><<<<<<^v><><vv<><^v>vvv>^v<v<v>v><>v<
<<>>v<^><^vv^^^^v^v^v^^<v<^v<<>^<^v<^^<<<>v^>>^^^v<>v^v>>>v<<><<<>^^>>^<<v>>v^<v>v^^^>^>^><>>><>>^v>><<^^vv>^<^^^<>^>>^<v>v<v^<>>>vvv^>v<v<><>^^v^<vv<>^^v>v<><<<>v^v>v<^v>^<^v^vv^><^>v^>v^>v^^^<>v>v<<v>v>v^^>><>^><v<<><<vv^>^vvv^v>^^<<<>^>v<<v<v<v>^<v>v<<>v>v<><>^^<v>>^vv<<v<^>><>vv>v<>v^>^^><v<<><^><><v<<>>><v^>v<^<v^v>><<<v<<v^><vv^^<<^<<>^<>v^><v<^v^v^<>>>^^^vv^<v^>><>vv<<vv>^<^v<v^^^><^>^>^<^v>><^v^v^>>^^v^v>v>>v>>vv^^^^>><>vv><vvv^v><<vv^<>>^^v><<<><vv>v^>^>^<^>^v>^<v>vv><><^<<<<^<^<v>^vv<<>>^v^^v^>>><vv>><^><v>>^<v>v>>v<v<v>><v<><v^<<^v^<v^v<<v^^<<><<^^v>v>>^<^^v>>vv<<^vv^^v<^>^^v<^^<<vv>>vv><^<v^^^<<^vv<<<v<^><<^><^^vv>^^>^^^<<v<v^><<<^v>>vv<vv^^><<<><^vv^><v>^<^<>>vvv^v>><^<vv>^^^>^v<>>vv^^<v<>^<>>^^v>>>^^vvvvv^<^<<>>v<vv^^<^<v><<>^<<>^<v^^^^>>>>v<v<><^^>v^><<><vvv^v<<vv<^v^v><><>^v^^v>>^<<v<v^^v^>>v<^<^^^v<<^>^^<<<<<^<>^><^<^v>^^^<>v^<>>^^>v^<^>^>^>^<<^><>v^v>>^<><^^>^>v<<v<><vv>>>v>>>^>>v<><<^<^v^<v^<v^<v^v>>>>v^<>^v<vv^^<>vv<<vv><<>>>^>^v^v><>>><vvv^<>^vv<<^^<>^v>><<v><<^<<^
vv<v>vv><><>>^^^>v><<>>><>^<^^^><v<vv^<<<><>><v^v^><>^<v^v^^v<<<v<v^<>>v><<<>>^<<^<v^<<<^>v<v^><<v^v<<^<<v><<^^^><v^>>>>^>>>>^><>v>><v<^^^>v>v>>v>><vv^vvvv>^^<>v><v^>v^^^^<<>vv<v><^>>>>^v>vv^>vvv^v<v>>>v<^^^>v>vvvv<<<vvv>^>^>><>v^<^^vv>^<v<^v><<><v^><<>v><<<><^v^^>><>>^^<v><><>^<<>>>^<>^<v>>^>><>^<<><vv^>^<v^v<><vv<^<<^v>^>><<>><^><<<>>v<>v^^>vvv<<^<>vv^>v<vv<>^><>^>^^v>^><><<v^<>v^v>v>^><><><^<v<^v>^^^>^v<^>^vv^^v<^><>>><^<<v<vv<v><^>>v><^v>>^>v>>v>>>vv><>v<^^v<<<^^<>^v><^<<v<<v<^^v><^^^^^>>vv^<<><>v<^<>vv<<>^^<>^>v<vv^^<^^^<v^>vv>^<<vv>v<v>>^^<>>>^vv^^^^^^><vvv>^><^^>v>^vv<<vv><><<>vv>v<v>^><><^>>v^>^>>v<v>vv<vv<^><v><<v<vv<v><><><v>^<>^<vv<^>^^v>^^^^^^v^>^<v<><^^^^<>><v>>>>>><<>>>>^<vv><<^>>>>>^>vv>^<<<<>v^><v>>>v^<vv^>vv^>>v>>v^^<><^<>v<^<v<<^<^><^><><><^^<^<><>^>v^<^>><>>>^^<vv<<vv>^^v<<vv^^vvvv^v^^<^v^v^^^^><v^<>^^v>vv<<^<>v<^>v><>^^^<<<^><<v>>v<<v<v><v^<v^vv^<vv<>^<^<>^>v>v<<^^^>>^^<>^<<^^<^^v^v^^v^^<^<<v>^<v>^^>^>^>v><^v^^^v>v^v>>v^>^>>v<>^<^v^^^^^<v>v<v^<^><^>>v^<^<<>^v^v^><<v
+1020055
View File
File diff suppressed because it is too large. Load diff
+9
View File
@@ -0,0 +1,9 @@
#####
#...#
#.O.#
#.O@#
#OO.#
#...#
#####
<>^<^<v
+7
View File
@@ -0,0 +1,7 @@
#######
#.....#
#.OO@.#
#.....#
#######
<<
+8
View File
@@ -0,0 +1,8 @@
#######
#.....#
#.O#..#
#..O@.#
#.....#
#######
<v<<^
+11
View File
@@ -0,0 +1,11 @@
#######
#.....#
#.....#
#.@O..#
#..#O.#
#...O.#
#..O..#
#.....#
#######
>><vvv>v>^^^
+13
View File
@@ -0,0 +1,13 @@
######
#....#
#....#
#.O..#
#.OO@#
#.O..#
#.O..#
#.O..#
#....#
#....#
######
<^^<<vvv
+11
View File
@@ -0,0 +1,11 @@
########
#......#
#OO....#
#.O....#
#.O....#
##O....#
#O..O@.#
#......#
########
<^^<<>^^^<v
+141
View File
@@ -0,0 +1,141 @@
--- Day 16: Reindeer Maze ---
It's time again for the Reindeer Olympics! This year, the big event is the Reindeer Maze, where the Reindeer compete for the lowest score.
You and The Historians arrive to search for the Chief right as the event is about to start. It wouldn't hurt to watch a little, right?
The Reindeer start on the Start Tile (marked S) facing East and need to reach the End Tile (marked E). They can move forward one tile at a time (increasing their score by 1 point), but never into a wall (#). They can also rotate clockwise or counterclockwise 90 degrees at a time (increasing their score by 1000 points).
To figure out the best place to sit, you start by grabbing a map (your puzzle input) from a nearby kiosk. For example:
###############
#.......#....E#
#.#.###.#.###.#
#.....#.#...#.#
#.###.#####.#.#
#.#.#.......#.#
#.#.#####.###.#
#...........#.#
###.#.#####.#.#
#...#.....#.#.#
#.#.#.###.#.#.#
#.....#...#.#.#
#.###.#.#.#.#.#
#S..#.....#...#
###############
There are many paths through this maze, but taking any of the best paths would incur a score of only 7036. This can be achieved by taking a total of 36 steps forward and turning 90 degrees a total of 7 times:
###############
#.......#....E#
#.#.###.#.###^#
#.....#.#...#^#
#.###.#####.#^#
#.#.#.......#^#
#.#.#####.###^#
#..>>>>>>>>v#^#
###^#.#####v#^#
#>>^#.....#v#^#
#^#.#.###.#v#^#
#^....#...#v#^#
#^###.#.#.#v#^#
#S..#.....#>>^#
###############
Here's a second example:
#################
#...#...#...#..E#
#.#.#.#.#.#.#.#.#
#.#.#.#...#...#.#
#.#.#.#.###.#.#.#
#...#.#.#.....#.#
#.#.#.#.#.#####.#
#.#...#.#.#.....#
#.#.#####.#.###.#
#.#.#.......#...#
#.#.###.#####.###
#.#.#...#.....#.#
#.#.#.#####.###.#
#.#.#.........#.#
#.#.#.#########.#
#S#.............#
#################
In this maze, the best paths cost 11048 points; following one such path would look like this:
#################
#...#...#...#..E#
#.#.#.#.#.#.#.#^#
#.#.#.#...#...#^#
#.#.#.#.###.#.#^#
#>>v#.#.#.....#^#
#^#v#.#.#.#####^#
#^#v..#.#.#>>>>^#
#^#v#####.#^###.#
#^#v#..>>>>^#...#
#^#v###^#####.###
#^#v#>>^#.....#.#
#^#v#^#####.###.#
#^#v#^........#.#
#^#v#^#########.#
#S#>>^..........#
#################
Note that the path shown above includes one 90 degree turn as the very first move, rotating the Reindeer from facing East to facing North.
Analyze your map carefully. What is the lowest score a Reindeer could possibly get?
Your puzzle answer was 143564.
--- Part Two ---
Now that you know what the best paths look like, you can figure out the best spot to sit.
Every non-wall tile (S, ., or E) is equipped with places to sit along the edges of the tile. While determining which of these tiles would be the best spot to sit depends on a whole bunch of factors (how comfortable the seats are, how far away the bathrooms are, whether there's a pillar blocking your view, etc.), the most important factor is whether the tile is on one of the best paths through the maze. If you sit somewhere else, you'd miss all the action!
So, you'll need to determine which tiles are part of any best path through the maze, including the S and E tiles.
In the first example, there are 45 tiles (marked O) that are part of at least one of the various best paths through the maze:
###############
#.......#....O#
#.#.###.#.###O#
#.....#.#...#O#
#.###.#####.#O#
#.#.#.......#O#
#.#.#####.###O#
#..OOOOOOOOO#O#
###O#O#####O#O#
#OOO#O....#O#O#
#O#O#O###.#O#O#
#OOOOO#...#O#O#
#O###.#.#.#O#O#
#O..#.....#OOO#
###############
In the second example, there are 64 tiles that are part of at least one of the best paths:
#################
#...#...#...#..O#
#.#.#.#.#.#.#.#O#
#.#.#.#...#...#O#
#.#.#.#.###.#.#O#
#OOO#.#.#.....#O#
#O#O#.#.#.#####O#
#O#O..#.#.#OOOOO#
#O#O#####.#O###O#
#O#O#..OOOOO#OOO#
#O#O###O#####O###
#O#O#OOO#..OOO#.#
#O#O#O#####O###.#
#O#O#OOOOOOO..#.#
#O#O#O#########.#
#O#OOO..........#
#################
Analyze your map further. How many tiles are part of at least one of the best paths through the maze?
Your puzzle answer was 593.
Both parts of this puzzle are complete! They provide two gold stars: **
+75
View File
@@ -0,0 +1,75 @@
#!/usr/bin/env python3
import sys, math
import numpy as np
def dijkstra(graph, v, a):
Q = [n for n in graph.keys()]
lq = len(Q)
while len(Q) > 0:
u = min([u for u in Q], key=lambda x: a[x])
Q.remove(u)
for vo in graph[u]:
if vo in Q:
distance_update(graph, u,vo,a,v)
return v, a
def distance_update(g, u, vo, a, v):
dist = 1 if vo[2] == u[2] else 1000
alt = a[u] + dist
# joining the sets does not work because we never remove the older nodes!
if alt <= a[vo]:
if alt < a[vo]:
v[vo] = set([])
a[vo] = alt
v[vo].add(u)
v[vo] = v[vo].union(set(v[u]))
def count_set(edges, lab):
edg = set([])
for e in edges:
edg.add((e[0], e[1]))
lab[e[1]][e[0]] = 'O'
return edg
if __name__ == '__main__':
lab = [list(line.strip('\n')) for line in open(sys.argv[1])]
rot90 = {(0,-1): [(-1,0),(1,0)], (1,0): [(0,-1),(0,1)], (0,1): [(1,0),(-1, 0)], (-1,0): [(0,1),(0,-1)]}
start = (1, len(lab)-2, (1,0))
end = (len(lab[0])-2, 1, (0,-1))
graph = {}
distance = {}
pred = {}
for y, l in enumerate(lab):
for x, f in enumerate(lab[y]):
if f == '#': continue
for d in [(0,1), (0,-1), (1,0), (-1,0)]:
distance[(x,y,d)] = math.inf
pred[(x,y,d)] = set([])
graph[(x,y,d)] = []
for d1 in rot90[d]:
if not lab[y+d1[1]][x+d1[0]] == '#': graph[(x,y,d)].append((x,y,d1))
if lab[y+d[1]][x+d[0]] != '#':
graph[(x,y,d)].append((x+d[0], y+d[1], d))
distance[start] = 0
v1, a1 = dijkstra(graph, pred, distance)
d1 = count_set(v1[end], lab)
# challenge 1
res1 = a1[end]
print(f"challenge 1:\n{res1}\n")
# challenge 2, needed some reddit help again...
d1.add((end[0],end[1]))
d1.add((start[0], start[1]))
res2 = len(d1)
print(f"challenge 2:\n{res2}")
for line in lab:
print(''.join(line))
+15
View File
@@ -0,0 +1,15 @@
###############
#.......#....E#
#.#.###.#.###.#
#.....#.#...#.#
#.###.#####.#.#
#.#.#.......#.#
#.#.#####.###.#
#...........#.#
###.#.#####.#.#
#...#.....#.#.#
#.#.#.###.#.#.#
#.....#...#.#.#
#.###.#.#.#.#.#
#S..#.....#...#
###############
+17
View File
@@ -0,0 +1,17 @@
#################
#...#...#...#..E#
#.#.#.#.#.#.#.#.#
#.#.#.#...#...#.#
#.#.#.#.###.#.#.#
#...#.#.#.....#.#
#.#.#.#.#.#####.#
#.#...#.#.#.....#
#.#.#####.#.###.#
#.#.#.......#...#
#.#.###.#####.###
#.#.#...#.....#.#
#.#.#.#####.###.#
#.#.#.........#.#
#.#.#.#########.#
#S#.............#
#################
+141
View File
@@ -0,0 +1,141 @@
#############################################################################################################################################
#...#.....#.......#...........#...#.............#.......#.........#.....................#.............#.........#.....#.......#.........#..E#
#.#.#.#.###.#.###.#####.#.#.#.#.#.#.###.#######.#######.#.#####.###.#.#######.###.#.#.#.#.#.###.#####.###.#####.#.###.#.###.#.#######.#.#.#.#
#.#...................#.....#...#.#.#.#.......#.........#.....#.....#.........#...#.#.#.#.#.........#.....#...#...#...#.#...#...#.....#...#.#
###.#.#.#.#####.#####.#.#.#######.#.#.#######.#######.#######.###########.#####.#.###.#.#.#########.#######.#.#.###.#####.#####.#.###.#####.#
#...#.#...#...#.#.#...#...#...#...#...#.....#.....#.#.#...#.............#...#...#.#...#...#.......#.....................#.#.....#...#.....#.#
#.###.#####.#.#.#.#.###.#.###.#.#####.#.###.#####.#.#.#.#.#.#####.#.###.#####.#####.#########.#.#.#####.#.#####.#.###.#.#.#.#######.#.###.#.#
#.....#...#.#.#.#...#...#...#.......#.#...#...#...#...#.#...#...#.#...#.......#.....#.........#...#.....#.....#.#.#...#...#.#.......#...#.#.#
#.#####.###.#.#.#.###.#.###.#.#######.###.#.#.#.#.#####.#####.#.#.###.###.#####.#####.#############.#####.###.#.#.###.#####.###.#####.#.#.#.#
#.......#...#...#...#...#...#.#.....#.....#...#.#.#.....#.....#...#...#...#...#.....#...#...........#.#...#.#...#...#...#.....#...#.....#...#
#####.###.#####.###.###.#.#.###.###.#######.###.#.#.#########.#.###.#######.#.#####.###.#.###########.#.###.###.###.#.#.#####.###.#.#.#.###.#
#...#.#...#.......#.......#.#...#...#.....#.#.#.#.#...#...#...#.#...#.....#.#.........#.#.....#.........#.....#.....#.#.....#.....#.#.#.#...#
#.###.#.###.###.###########.#.###.#.#.#.#.#.#.#.#####.#.#.#.###.#.#.#.###.#.#########.#.#####.#.#####.###.###.#######.#####.#######.#.#.#.###
#.....#.#.......#.......................#.#.....................#.#.#...#...#.......#.......#.#.#...#.#...#.#.#.#.........#.#.....#.#.#.#...#
#.#####.#.#####.#.#.#.#######.#.#.#.#.#.#.#.#.###.#######.#####.#.#####.#####.###.#.#######.#.###.#.#.###.#.#.#.#.#########.#.###.###.#.###.#
#.....#.#.....#...#.#.#.........#.#.#.#.....#...#.........#...#.#.........#...#.....#...#...#.#...#.#...#.#.#.#...#.....#...#...#...#.......#
#######.#####.#####.#.#####.###.#.###.###.#.#.#####.#######.#.###########.#.###.#####.###.###.#.###.###.#.#.#.#####.###.#.###.#.###.#.###.###
#.......#...#.#...#...#...#...#.#.....#...#...#...#.......#.#.#.......#...#.#.#.#...#.....#.#...#.#.#.#...#...#.....#...#.#...#.#.#...#...#.#
#.#######.#.#.###.#####.#.#.#.#.#######.#######.#.#.#######.#.#.#####.###.#.#.#.#.#.#.#####.#.#.#.#.#.#####.###.#.###.###.#.###.#.###.#.###.#
#...#...#.#.............#.#...#...#.....#...#...#...#.........#...#.#...#.#.#.....#.#.......#.....#.#.....#.....#...#.#...#...#.#.....#.....#
###.#.#.#.#########.#.###.###.###.###.###.#.#.#.###.#.#######.###.#.###.###.#.###.#.#######.#######.#.###.#######.#.#.#.#######.#.#########.#
#...#.#...#...#.......#.........#...#.#...#.#.....#...#.....#...#.#.........#.....#.............#...#...#.#.....#.#.....#.......#.........#.#
#.#####.###.#.###############.#####.#.#.###.#####.#######.#####.#.#####################.#########.#####.#.#.#####.#####.#.#.###.#######.###.#
#.#...#.#...#.......#.....#.......#...#...#.......#.......#.....#.#...#.....#.........#...........#.....#.#.#.....#.....#.#...#.........#...#
#.#.#.###.#########.#.###.#.###.###.#.###.#.#######.#.#####.###.#.#.#.###.#.#.#####.#.#.#########.#.#.#.#.#.#.#####.#.#####.#.#.#####.###.###
#...#...#.#.....#.#.#...#...#.#.......#.....#.....#.#.....#...#.....#...#.#.#.#...#.#.#.............#...#...#.#...#.#.#...#.#.......#.#...#.#
#.#####.#.#.###.#.#.###.#####.#########.#####.###.###.#.#.###.#.#######.#.###.#.#.#.###.#############.#.#.#.#.#.###.#.#.#.#######.#.###.###.#
#.#...#.....#.....#.....#.....#.......#.....#...#...#...#...#.#.....#...#.......#.#.#...#...#.......#.#.#.#...#.#...#...#.#.....#.#.#...#...#
#.#.#.#.#########.###########.#.###.#######.###.###.#######.#.###.###.#############.#.#####.#.#####.###.#.#.###.#.#######.#.###.#.#.#.###.#.#
#.#.#.#...#...#.#.....#.....#...#.#.#.....#...#.#.#.#.......#...#.#...#.........#...#.......#.#...#...#.#.#.#...#.#.....#.#.#...#.#...#...#.#
#.#.#.#.###.#.#.#####.###.#.#.###.#.#.###.#.#.#.#.#.#.#####.###.#.#.###.#######.#.#######.###.#.#.###.#.#.#.#.#.#.#.###.#.#.#.###.#####.###.#
#.#.#.#.#...#.#.#...#.#...#.#.#...#.....#...#.....#.#.....#.#.#.#.#.#.......#...#.......#.#...#.#...#.#.#.#.#.#...#.#...#...#...#.#.....#...#
###.#.###.###.#.#.#.#.#.###.#.#.#.#########.#######.#.###.#.#.#.###.#######.#.#######.###.#.#####.###.#.###.#.###.#.###.#######.#.#.#######.#
#...#.....#.#.#.#.#...#.#...#.#.#...#.......#.......#...#.....#.....#...#.....#.......#...#.#.....#...#.#...#.....#...#.........#.#...#...#.#
#.#########.#.#.#.#####.###.#.###.#.#.#####.#.#########.#.#########.#.#.#.###.#.#######.###.#.#.###.#.#.#.#########.#.#########.#.###.#.#.#.#
#...#.......#.#.#.#.......#.#...#.#...#.....#...........#.#...#.............#.#.#.......#.#.#.#...#...#.#.#.......#.#...#.......#.....#.#.#.#
###.#.#####.#.#.#.#######.#.###.#.#.#####.###########.#.###.#.#.#####.#####.#.#.#.#######.#.###.#.###.#.#.###.###.#.###.#.#####.#.#####.#.#.#
#...#.....#...#.......#...#...#...#.#...#...#...#.....#.....#.#.#...#.#...#.....#.........#...#.#...#...#.....#.#.#.#.#.#.#.#...#.#.....#.#.#
#.#######.###########.#.#.###.###.#.#.#.###.#.#.#.#.#######.#.#.#.#.#.###.#.#######.#####.###.#.###.###.#####.#.#.#.#.#.#.#.#.#.###.#####.#.#
#.#.......#.........#...#...#...#.#...#...#.#.#...#.#.....#.#.......#...#.#...#.....#...#.#.#.#...#...#.#.......#.#...#...#.#.#.......#...#.#
#.#.#########.###.#.#######.###.#########.#.#.#####.#.#.#.#####.#.###.#.#.#.###.###.#.#.#.#.#.#####.#.#.#.#####.#.#######.#.#.#.#######.###.#
#.#.#.........#...#...#.....#...#.........#.#.#.....#.#.#.....#.#...........#...#.....#.#...#.....#.#.#.#.#...#.#.#.....#...#.#.....#...#.#.#
#.#.###.#########.###.#.#.###.###.###.#####.#.###.###.#.#####.###.#####.#.###.###.#####.#.#######.#.###.#.#.#.#.#.#.###.#####.#.###.#.###.#.#
#.#.....#.#.........#.#.........#.#...#.....#.....#...#.....#...#.#...#.#...#.#...#.....#.#.......#...#.#...#.#.#...#...#...#.......#.#...#.#
#.#######.#.#.#.#.###.#.#######.#.#.###.#####.#.#.#.#######.###.#.#.###.#.#.#.#.###.#######.#######.#.#.#####.#.#####.###.#.###.#####.#.###.#
#.............#.#.#...#.#.....#...#.....#...#.#.#.#.#...#.........#.....#.#...#...#.......#...#.....#.......#.#.#...#.......#.........#.....#
#.#.#.#.#####.#.#.#.###.#.###.#####.#####.#.#.#.#.#.#.###.#.#######.###.#.#.#####.#######.#.#.###########.#.#.#.#.#.###.###.#.#.#.#####.#####
#.#.#.#.#...#.#.#.#.#...#.#...#.....#...#.#.#.#.#.#.#...#.......#.#.....#...#...#...#...#.#.#...........#.....#...#...#...#.#.#.#.....#.#...#
#.#.#.#.#.#.#.#.#.#.#.###.#.###.#####.#.#.#.#.#.#.#.###.#######.#.#####.###.#.#####.###.#.#####.#######.###.#######.#.###.#.#.#.#####.#.#.#.#
#.....#...#...#...#.#...#.#...#...#...#...#...#.#.#...#.......#.....#.....#.#.....#...#.......#.#.....#...#...#.....#.....#.#.#.#.....#...#.#
#.#.#.#.#####.###.#.###.#.###.###.###.###.###.#.#####.#.#.###.#.###.#.###.#.###.#####.#######.#.#.###.###.#.#.#.###.#.#.#.#.#.#.#.#########.#
#.#.#.#.#...#.....#...#.#.#.#.#.......#...#...#.#.....#.#...#.#...#.....#.......#...#.......#.#.#...#.....#.#...#...#...#.#...#...#.........#
#.#.#.###.#.#.###.###.###.#.#.#.#######.###.###.#.#####.#.#.#.###.###.###.#######.#.#######.#.###.#.#.#####.#.#.#.#######.#####.###.#########
#.#.#.#...#...#...#...#...#...#.#...#...#...#.....#.....#...#...#...#.#...#.......#.........#...#.#.#.#...#.#...#.......#...#.....#.#.....#.#
#.###.#.#.###.#.###.###.###.#####.#.###.#.#######.#####.#.###.#####.###.###.###################.###.###.#.#.###########.###.#.#.#.#.#.#.#.#.#
#...#...#...#.#.#...#.....#.......#...#.#.......#.....#.#.#...#...#.....#...#...#...........#.....#.#...#.#...........#.....#.#.#...#.#.#.#.#
###.#####.#.#.#.#.#.#.###.###########.#.#######.#####.###.#####.#.#######.###.#.#.#####.#.#.#.###.#.#.###.###.#######.#######.#.#######.#.#.#
#...#...#.#.#.#...#.#...#.#.......#...#...#.....#...#.....#...#.#.....#...#...#...#...#.#.#...#...#.#...#.#...#.....#.#.....#.#.........#.#.#
#.###.#.#.#.#.###.#.###.#.#.#####.#.#####.#.#######.###.#.#.#.#.#####.#.###.#########.#.#.#####.###.#.###.#####.###.###.###.#.#.#########.#.#
#.#...#.#.#...#.....#.#.#.#.#...#.#.......#.......#.#...#...#.....#...#.#.....#.......#.#.#...#.#.....#...#.....#.#.....#.#...#.............#
#.#.#.#.#.###.#.#####.#.#.#.###.#.#######.#.#####.#.#.#####.#######.###.#####.#.#####.#.#.#.#.#.#######.###.#####.#######.#######.###.#.###.#
#...#.#...#...#.#.......#.#...#.....#...#.#.....#.#.#.#...#.......#...#.....#.#.#...#.#...#.#...#.....#...#.#.#.......#.........#.#...#.....#
#.###.###.#.#.#.#########.###.#.#####.#.#.#######.#.#.#.#.#.#####.#.#.#####.#.#.#.#.#.#.###.#####.###.###.#.#.#.###.###.#.#.###.#.#.###.#####
#.#...#...#.#.............#...#.#.....#...#.......#.#...#...#...#.#.#.#.....#.#.#.#.#.#.....#.#...#.#.....#.#.#.#.#.....#...#.#.#.#.#.#...#.#
#.#.###.#.#.#.###.#.#.#####.#####.#######.#.#######.#########.###.#.#.#.#####.#.#.#.###.#.###.#.#.#.#####.#.#.#.#.###.###.###.#.#.#.#.###.#.#
#.#...#.#...#...#...#.#...#.........#...#...#.#.............#...#...#.#.#.....#...#.....#...#...#.#.....#.#.#.....#...#...#.#...#.#.#.....#.#
#.###.#######.#.#.#.###.#.###########.#.#####.#.#########.###.#.###.#.#.###.###.#####.#####.###.#.#.###.#.#.#######.#.#.###.#.###.#.#.#####.#
#.....#.......#...#.....#.#...........#.#...#...#.....#.#...#.#.....#.#...#...#.#...#.#...#...#.#.#...#...#.#.....#.#.#.#...#.......#.#.....#
#.#.###.#######.#########.#.#####.#####.#.#.#.###.###.#.###.#.#######.###.###.#.#.#.#.###.###.###.###.#####.#.###.#.#.#.#.###.#.#####.#.#####
#.#.....#.....#.#.#.....#...#...#...#...#.#.#.#...#.#...#.#.#.........#...#...#.#.#.#.#.....#.#...#.#.#.....#...#...#.#.#.....#...#...#.....#
#.#.#######.#.#.#.#.###.###.#.#.#####.###.#.#.###.#.###.#.#.#########.#.###.###.#.#.#.#.#####.#.###.#.#.#####.#.#####.#.#####.#.#.#.#######.#
#.#.......#.#...#.#.#.#...#.#.#...#.......#.....#.#.....#.#.....#.....#.#.....#.#.#.#...#.....#.#.....#.#...#.#...#.#.......#.#.#.#.........#
#.#######.#.#####.#.#.###.#.#.###.#.#######.###.#.###.###.#####.#.#######.###.###.#.###.#.#####.#.#####.#.###.###.#.#.#####.###.#.#########.#
#...#.#...#...#...#.#...#.#.#.#...#.#.....#...#.#...#.....#.....#.......#.#...#.......#.#...#...#.#.....#.......#.#.#.......#...#.#...#...#.#
#.#.#.#.#####.#.#.#.#.###.###.#.#.#.#.###.###.#.#.#.#####.#.#.#########.#.#.###.#####.#.###.#.#####.#########.###.#.#.#.###.#.#.#.#.#.#.#.#.#
#.#.#.#...#.....#.#.#...#.....#.#...#...#.....#.#.#...#...#.#.#.........#.....#.#.#...#.#.#.#.......#.......#.#...#.#.#.#...#.#.#.#.#.#.#...#
###.#.###.#######.#.#.#.#######.###.###.#######.#.###.#####.###.#.###.#.#.###.#.#.#.###.#.#.#####.###.#####.###.###.#.#.###.#.#.#.#.###.#####
#...#...#.......#...#.#.......#...#...#.........#...#.....#.....#...#.#.#...#.#...#.#.#...#.....#.#.....#.......#.....#...#.#.#...#...#...#.#
#.#####.#######.#.###.#####.#####.###.#.#####.###.#######.#########.#.#.#####.#.###.#.#.#######.#.###.#.#########.#######.#.#.#.#.###.###.#.#
#.#...#.......#.#...#.#...#.#...#.....#.#.........#.......#...#...#.#.#.....#...#...#...#.....#.#...#.#...#.............#.#.........#.....#.#
#.#.#.#.###.#.#.#.#.#.#.#.#.#.#.###.###.###########.#####.#.#.#.###.#.#####.#####.###.###.###.#.###.#.###.#############.#.###.#.#.#.#.#####.#
#.#.#.#.#...#.#.#.#.#.#.#...#.#.......#.#...........#.....#.#...#...#.#...#.....#.#.#...#.#.#...#.#.#.#...#.......#.......#...#...#.#.#...#.#
#.#.#.#.#.#####.#.#.###.###.#.#######.#.#.#.#########.#####.#####.###.###.#####.#.#.###.#.#.#####.#.###.###.#####.#########.#####.#.#.#.#.#.#
#...#.#.#.......#.#...#...#.#.#.....#.....#.#...#...........#.....#.#.........#...#...#.#.#...#...#.#...#...#.#...#.......#.#.#...#.#...#...#
#.#.#.#.#.#########.#.###.###.#####.#########.#.#.#########.#.#####.#####.###########.#.#.#.#.#.#.#.#.#.#.###.#.###.#####.#.#.#.#.#.#####.#.#
#...#...#.#.......#.#...#.#...#...#.....#.............#.....#...#.#.......#...........#.#.#.#.#.#.#...#...#...#.#...#...#.#.#.......#.......#
#.#.###.#.###.###.#####.#.#.###.#.#.#####.###########.###.#.###.#.#.#######.###.#######.#.#.#.#.#.#####.#.#.###.#.###.#.#.#.###.#.#.#######.#
#.#...#.#...#...#.......#...#...#.#.....#...#...#.....#...#.#.#.......#.....#.#.....#.....#.#.#.#...#.....#.....#.#...#...#...#.#.#.#.....#.#
#.###.#.###.###.#########.###.###.#####.###.#.#.#.#.#.#.###.#.#.#.#####.#####.#####.#.###.#.#.#.###.#.#.#.#.#####.#####.#####.###.#.#.###.###
#...............#.#.....#.#...#...#.......#...#.#.#.#.#.......#.#.#.....#.........#...#.#.#.#.#.........#.#.....#.....#.......#...#.#.#.#...#
#.#####.#.#######.#.###.#.#.#.###.#.#.#.#.#####.#.#.#.#####.#.#.###.#####.###.#.#.#####.#.#.#####.#######.#####.#.###.#########.#.#.#.#.###.#
#.#...#...#.....#...#.#...#.#...#.#.#.#.......#.#.#.#.#...#...#.....#...#...#.#.#.#.......#.........#...#.#.....#...#.......#...#.#.#.#.#...#
#.#.#.#.###.#.###.###.#########.#.#.#.#.#.#####.#.###.#.#.###.#######.#####.#.#.#.#####.#.#.#########.#.#.###.#########.###.#.#.###.#.#.#.#.#
#.#.#.#...#.#.#...#.....#.......#...#...#.#.....#...#.#.#.#.#.#.....#.#.....#.#.......#.#.#.#...#.....#.#...#...#.....#...#.#.#...#...#.#...#
#.#.#.#.#.###.#.#####.#.###.#############.#.#####.#.#.#.#.#.#.#.###.#.#.#.###.#.#####.#.#.###.#.#.#####.###.#.#.#.###.#####.#.###.#####.###.#
#.#.#...#...#.........#.....#.....#.....#.#.#.....#.#...#.#.#...#.....#.#.#...#.......#.#.....#...#...#.....#.#...#.#.....#.#...#.........#.#
#.###.#.###.#.###.#.#########.###.#.#####.#.#.#####.#####.#.#.#.#######.#.#.###.#######.###########.#.#######.#####.#####.#.###.#########.#.#
#...#.#.#...#.#...#...#.........#.#.......#.#.#...#.......#.#.#.#.....#.#.#.#.#.......#...........#.#.#.#.......#.......#.#.#...#.......#.#.#
#.#.#.#.#.###.#####.#.#.#########.#.###.###.###.#.###.###.#.#.#.#.###.#.#.#.#.#######.#.#########.#.#.#.#.#.#####.#.###.#.#.#.###.#####.#.#.#
#.#.#.#.#.#.......#.#.....#.......#.......#.....#.#...#...#.#.#...#...#...#.#...........#.......#.#.#...#.#.......#.#...#.#.#...#.....#.#...#
#.#.###.#.#######.#########.#.#####.#######.#####.#.#.#.###.#.#.###.###.###.#.###########.#.#.#.#.#.#.###.###.#.###.#.###.#.###.#####.#.#####
#.#.#...#.....#.......#.....#...#...#.......#...#...#.#.#.#...#.#.#.....#.....#.#...........#.......#.........#.#...#...#.#.#...#.....#.#...#
#.#.#.#.#####.#######.#.#####.#.#####.#.#.###.#.#####.#.#.#.###.#.#######.###.#.#.###########.#######.#####.#.#.#.#.#.#.#.#.#.###.#######.#.#
#.#.#.......#.....#.....#.....#.....#.#.....#.#...#...#.#...#.#.....#.#...#.....#...#.....#...#.....#.#.....#.#...#.....#...#...#.#.......#.#
#.#.#.###.#.###.#.#######.#########.#.#######.###.#####.#.###.#####.#.#.###########.#####.#.###.###.#.#.###.#.###.#.###.#######.#.#.#######.#
#...#.#.#.#.#...#.#...#...#.#.....#...#...#...#.#...#...#.#...#.....#.#.#...........#.....#...#.#.#...#.#...#.....#...#...#...#.#.#.#.....#.#
#.###.#.#.###.#.#.#.#.#.###.#.###.#####.###.###.###.#.###.#.###.#####.#.#.#########.#.#####.#.#.#.#####.#.#####.#####.###.#.###.#.#.#.###.#.#
#...#.#.#...#.#.#...#...#.....#.#.....#...#.#.....#.#.#.#.#.........#.#.......#...#...#...#.#.#.#...#...#...#...#...#.#.....#...#...#.#...#.#
###.#.#.###.#.#.###########.###.#####.#.#.#.#.#.###.#.#.#.#########.#.#########.#.#.###.#.###.#.#.#.###.###.#.#####.#.#######.###.#####.#.#.#
#...#.#...#...#.....#.....#.........#...#.#.#.#.......#...#.......#...#.........#.#.#...#...#.#.#.#.....#.#...#.....#.......#.#.#.#...#.#.#.#
#.#.#.###.#####.###.###.#.#####.#########.#.###########.###.#####.###.#.#########.###.#####.#.#.#.#####.#.#####.###.#####.#.#.#.#.#.#.#.###.#
#...#.....#...#.#.#.#...#.#.#...#.........#.#.......#.....#.#.....#...#...#...........#.......#...#...#.........#.#.....#...#.#.....#...#...#
#.#.#####.#.#.#.#.#.#.###.#.#.###.#######.#.#.#####.#####.#.#.#####.#####.#.###.#######.#######.#.###.###########.#.###.#.###.###########.#.#
#...#.....#.#.#.#.#...#...#.#.#...#...#.#.#.#.#...#.....#...#.#...#.#.....#.....#...#...#.......#...#.......#.......#...#.....#...#.....#.#.#
###.###.###.#.#.#.#####.###.#.#.###.#.#.#.#.#.#.###.#.#.#####.#.#.#.#.#.#####.#.#.#.#####.#########.#.#####.#.#####.#.#########.#.#.###.#.#.#
#.#...#.#.#.#...#.....#.#.....#.....#...#.#.....#...#.#...#.......#.#.#.#.....#.#.#.......#.#.......#.....#.#.#...#.#.#...#.....#...#.#.#.#.#
#.#.#.#.#.#.#####.#.###.#######.#.#.#.#.#.#####.#.#.#.###.#######.#.#.###.#####.#.#########.#.###.#######.#.#.###.#.#.#.#.###.#######.#.#.#.#
#.....#...#.....#.#.#...#.....#.#.#.#...#.......#.#.#...#...#...#.#.#.#.....#...#.......#...#.#.#.....#...#.#.....#...#.#...#.....#.......#.#
#.#.#####.#####.#.###.###.###.#.#.#.#########.###.#.#######.#.#.#.###.#.#####.#########.#.###.#.#####.#.###.#.#.#######.###.#.###.#########.#
#.....#...#...#.#...#.#.....#.....#.......#...#...#.........#.#.#...#.#.#.#...#.......#.#...#.......#.#...#.#.#.........#.#.#.#.#.....#.....#
#####.###.###.#.###.#.#.###.#####.#####.###.###.#############.#####.#.#.#.#.###.#.#####.#.#.###.#####.#####.#.#####.#.###.#.#.#.#####.###.###
#...#...#.....#.....#.#.#...#...#.....#...#.#...#.....#...........#.#.#...........#...#.#.#.....#.....#.....#.....#.#.#.....#...#...#...#...#
#.#.###.#########.#.#.###.###.###.###.###.#.#.#####.#.#.#########.#.#.###.#######.#.#.#.#.#######.###.#.#.#.###.#.###.#.#####.###.#.#.#.###.#
#.#...#...........#.#.#...#.......#.....#.#.#.....#.#.#...#...#.#.#.#.#...#.....#.#.#...#.......#.#...#.#.#.....#.....#.#...#.#...#.#.#.#.#.#
#.#.###############.#.#.###.#######.###.#.#.#####.#.#####.#.#.#.#.#.#.#.#.#.###.#.#.#####.###.###.#.###.#.#.###.#######.#.#.#.#.###.###.#.#.#
#.#.#.......#.....#...#...#.......#...#...#.......#.....#...#...#.....#.#...#...#.#.......#.#.#...#.#...#.#...#.#.....#.....#.#.............#
#.###.###.###.###.#.#####.#######.#.#.#########.#.#.#.###.###.#.#######.#.#.#.###.#######.#.#.#.#####.###.###.###.#.#######.#.#.#########.#.#
#...#.#.#.......#.#.#...#...#...#...#.......#...#.#.#.......#.#.#.......#.#.#.#...#...#...#...#...#.....#.#...#...#.......#.#.#.....#...#...#
#.#.#.#.#########.#.#.#.###.#.#####.#######.#.###.#.#.#.#.#.#.#.#.#######.#.#.#.###.#.#.#########.#.#####.#.#.#.#####.#####.#.#####.#.#.#.###
#.#.#.....#...#...................#.....#.#.#.#.#.#...#.#.#...#.#...#.....#.#.#.....#...#.......#.....#...#.#.#.#...................#.#.#...#
#.#.#####.#.###.#.###.#######.#.#.#####.#.#.#.#.#.#.#.#.#.#.###.###.#######.#.#############.###.#######.###.#.#.###.#.#.#.#.#####.#####.###.#
#.#.........#...#.#...#.......#.#.....#...#.#...#.#.#...#...#...#...#.......#.........#...#.#...........#...#.#.....#.#.#...#...#.#.....#...#
#.###########.###.#.#.#.###.###.#.#.#####.#.###.#.###.###.###.###.###.#######.#######.#.#.#.#############.#####.#####.#.#####.#.#.#.#.###.###
#...#...#.#...#...#.#.#...#.#...#.#.#.....#.#...#...#...........#.....#.......#...#...#.#.#...#...........#.....#.....#.#.....#...#.#...#.#.#
###.#.#.#.#.###.###.#.###.#.#.###.#.#.#####.#.#####.#.###.#############.#.#.###.#.#.###.#.###.#######.#####.#####.###.#.#.###.#####.###.#.#.#
#.#...#...#.#.#.#...#.#...#...#...#.#.....#.#...#.#.#...#...#.....#.....#.#.#...#.#.....#...#.......#.#.....#...#.#...#.#...#.#...#.#.#.#...#
#.#####.###.#.#.#.###.#.#######.#.###.#####.###.#.#.#####.#.#.#.###.#####.#.#.###.#########.#.#####.#.#.#####.###.#.###.###.#.#.#.#.#.#.###.#
#.....#.#...#...#.#.#...#.....#...#...#.................#.#...........................#...#.#.#.....#.#.#.....#...#.#...#...#.#.#.#.#.#.....#
#.###.#.#.#######.#.#######.#.###.#.###.#########.#.#.#.#.#######.###.#.###.###.#####.#.#.#.#.#.#####.#.#####.#.#####.#######.#.#.#.#.#######
#S..#...#...................#...#.....#...........#...#.........#.....#.............#...#.......#.............#...............#.#...........#
#############################################################################################################################################
+141
View File
@@ -0,0 +1,141 @@
#############################################################################################################################################
#...#.....#.......#...........#...#.............#.......#.........#.....................#.............#.........#.....#.......#.........#..E#
#.#.#.#.###.#.###.#####.#.#.#.#.#.#.###.#######.#######.#.#####.###.#.#######.###.#.#.#.#.#.###.#####.###.#####.#.###.#.###.#.#######.#.#.#O#
#.#...................#.....#...#.#.#.#.......#.........#.....#.....#.........#...#.#.#.#.#.........#.....#...#...#...#.#...#...#.....#...#O#
###.#.#.#.#####.#####.#.#.#######.#.#.#######.#######.#######.###########.#####.#.###.#.#.#########.#######.#.#.###.#####.#####.#.###.#####O#
#...#.#...#...#.#.#...#...#...#...#...#.....#.....#.#.#...#.............#...#...#.#...#...#.......#.....................#.#.....#...#OOOOO#O#
#.###.#####.#.#.#.#.###.#.###.#.#####.#.###.#####.#.#.#.#.#.#####.#.###.#####.#####.#########.#.#.#####.#.#####.#.###.#.#.#.#######.#O###O#O#
#.....#...#.#.#.#...#...#...#.......#.#...#...#...#...#.#...#...#.#...#.......#.....#.........#...#.....#.....#.#.#...#...#.#.......#O..#O#O#
#.#####.###.#.#.#.###.#.###.#.#######.###.#.#.#.#.#####.#####.#.#.###.###.#####.#####.#############.#####.###.#.#.###.#####.###.#####O#.#O#O#
#.......#...#...#...#...#...#.#.....#.....#...#.#.#.....#.....#...#...#...#...#.....#...#...........#.#...#.#...#...#...#.....#...#..O..#OOO#
#####.###.#####.###.###.#.#.###.###.#######.###.#.#.#########.#.###.#######.#.#####.###.#.###########.#.###.###.###.#.#.#####.###.#.#O#.###.#
#...#.#...#.......#.......#.#...#...#.....#.#.#.#.#...#...#...#.#...#.....#.#.........#.#.....#.........#.....#.....#.#.....#.....#.#O#.#...#
#.###.#.###.###.###########.#.###.#.#.#.#.#.#.#.#####.#.#.#.###.#.#.#.###.#.#########.#.#####.#.#####.###.###.#######.#####.#######.#O#.#.###
#.....#.#.......#.......................#.#.....................#.#.#...#...#.......#.......#.#.#...#.#...#.#.#.#.........#.#.....#.#O#.#...#
#.#####.#.#####.#.#.#.#######.#.#.#.#.#.#.#.#.###.#######.#####.#.#####.#####.###.#.#######.#.###.#.#.###.#.#.#.#.#########.#.###.###O#.###.#
#.....#.#.....#...#.#.#.........#.#.#.#.....#...#.........#...#.#.........#...#.....#...#...#.#...#.#...#.#.#.#...#.....#...#...#...#O......#
#######.#####.#####.#.#####.###.#.###.###.#.#.#####.#######.#.###########.#.###.#####.###.###.#.###.###.#.#.#.#####.###.#.###.#.###.#O###.###
#.......#...#.#...#...#...#...#.#.....#...#...#...#.......#.#.#.......#...#.#.#.#...#.....#.#...#.#.#.#...#...#.....#...#.#...#.#.#..O#...#.#
#.#######.#.#.###.#####.#.#.#.#.#######.#######.#.#.#######.#.#.#####.###.#.#.#.#.#.#.#####.#.#.#.#.#.#####.###.#.###.###.#.###.#.###O#.###.#
#...#...#.#.............#.#...#...#.....#...#...#...#.........#...#.#...#.#.#.....#.#.......#.....#.#.....#.....#...#.#...#...#.#OOOOO#.....#
###.#.#.#.#########.#.###.###.###.###.###.#.#.#.###.#.#######.###.#.###.###.#.###.#.#######.#######.#.###.#######.#.#.#.#######.#O#########.#
#...#.#...#...#.......#.........#...#.#...#.#.....#...#.....#...#.#.........#.....#.............#...#...#.#.....#.#.....#.......#OOOOOOO..#.#
#.#####.###.#.###############.#####.#.#.###.#####.#######.#####.#.#####################.#########.#####.#.#.#####.#####.#.#.###.#######O###.#
#.#...#.#...#.......#.....#.......#...#...#.......#.......#.....#.#...#.....#.........#...........#.....#.#.#.....#.....#.#...#OOOOOOOOO#...#
#.#.#.###.#########.#.###.#.###.###.#.###.#.#######.#.#####.###.#.#.#.###.#.#.#####.#.#.#########.#.#.#.#.#.#.#####.#.#####.#.#O#####.###.###
#...#...#.#.....#.#.#...#...#.#.......#.....#.....#.#.....#...#.....#...#.#.#.#...#.#.#.............#...#...#.#...#.#.#...#.#..OOO..#.#...#.#
#.#####.#.#.###.#.#.###.#####.#########.#####.###.###.#.#.###.#.#######.#.###.#.#.#.###.#############.#.#.#.#.#.###.#.#.#.#######O#.###.###.#
#.#...#.....#.....#.....#.....#.......#.....#...#...#...#...#.#.....#...#.......#.#.#...#...#.......#.#.#.#...#.#...#...#.#.....#O#.#...#OOO#
#.#.#.#.#########.###########.#.###.#######.###.###.#######.#.###.###.#############.#.#####.#.#####.###.#.#.###.#.#######.#.###.#O#.#.###O#O#
#.#.#.#...#...#.#.....#.....#...#.#.#.....#...#.#.#.#.......#...#.#...#.........#...#.......#.#...#...#.#.#.#...#.#.....#.#.#...#O#...#OOO#O#
#.#.#.#.###.#.#.#####.###.#.#.###.#.#.###.#.#.#.#.#.#.#####.###.#.#.###.#######.#.#######.###.#.#.###.#.#.#.#.#.#.#.###.#.#.#.###O#####O###O#
#.#.#.#.#...#.#.#...#.#...#.#.#...#.....#...#.....#.#.....#.#.#.#.#.#.......#...#.......#.#...#.#...#.#.#.#.#.#...#.#...#...#...#O#OOOOO#..O#
###.#.###.###.#.#.#.#.#.###.#.#.#.#########.#######.#.###.#.#.#.###.#######.#.#######.###.#.#####.###.#.###.#.###.#.###.#######.#O#O#######O#
#...#.....#.#.#.#.#...#.#...#.#.#...#.......#.......#...#.....#.....#...#.....#.......#...#.#.....#...#.#...#.....#...#.........#O#OOO#...#O#
#.#########.#.#.#.#####.###.#.###.#.#.#####.#.#########.#.#########.#.#.#.###.#.#######.###.#.#.###.#.#.#.#########.#.#########.#O###O#.#.#O#
#...#.......#.#.#.#.......#.#...#.#...#.....#...........#.#...#.............#.#.#.......#.#.#.#...#...#.#.#.......#.#...#.......#OOOOO#.#.#O#
###.#.#####.#.#.#.#######.#.###.#.#.#####.###########.#.###.#.#.#####.#####.#.#.#.#######.#.###.#.###.#.#.###.###.#.###.#.#####.#.#####.#.#O#
#...#.....#...#.......#...#...#...#.#...#...#...#.....#.....#.#.#...#.#...#.....#.........#...#.#...#...#.....#.#.#.#.#.#.#.#...#.#.....#.#O#
#.#######.###########.#.#.###.###.#.#.#.###.#.#.#.#.#######.#.#.#.#.#.###.#.#######.#####.###.#.###.###.#####.#.#.#.#.#.#.#.#.#.###.#####.#O#
#.#.......#.........#...#...#...#.#...#...#.#.#...#.#.....#.#.......#...#.#...#.....#...#.#.#.#...#...#.#.......#.#...#...#.#.#.......#...#O#
#.#.#########.###.#.#######.###.#########.#.#.#####.#.#.#.#####.#.###.#.#.#.###.###.#.#.#.#.#.#####.#.#.#.#####.#.#######.#.#.#.#######.###O#
#.#.#.........#...#...#.....#...#.........#.#.#.....#.#.#.....#.#...........#...#.....#.#...#.....#.#.#.#.#...#.#.#.....#...#.#.....#...#.#O#
#.#.###.#########.###.#.#.###.###.###.#####.#.###.###.#.#####.###.#####.#.###.###.#####.#.#######.#.###.#.#.#.#.#.#.###.#####.#.###.#.###.#O#
#.#.....#.#.........#.#.........#.#...#.....#.....#...#.....#...#.#...#.#...#.#...#.....#.#.......#...#.#...#.#.#...#...#...#.......#.#...#O#
#.#######.#.#.#.#.###.#.#######.#.#.###.#####.#.#.#.#######.###.#.#.###.#.#.#.#.###.#######.#######.#.#.#####.#.#####.###.#.###.#####.#.###O#
#.............#.#.#...#.#.....#...#.....#...#.#.#.#.#...#.........#.....#.#...#...#.......#...#.....#.......#.#.#...#.......#.........#OOOOO#
#.#.#.#.#####.#.#.#.###.#.###.#####.#####.#.#.#.#.#.#.###.#.#######.###.#.#.#####.#######.#.#.###########.#.#.#.#.#.###.###.#.#.#.#####O#####
#.#.#.#.#...#.#.#.#.#...#.#...#.....#...#.#.#.#.#.#.#...#.......#.#.....#...#...#...#...#.#.#...........#.....#...#...#...#.#.#.#.....#O#OOO#
#.#.#.#.#.#.#.#.#.#.#.###.#.###.#####.#.#.#.#.#.#.#.###.#######.#.#####.###.#.#####.###.#.#####.#######.###.#######.#.###.#.#.#.#####.#O#O#O#
#.....#...#...#...#.#...#.#...#...#...#...#...#.#.#...#.......#.....#.....#.#.....#...#.......#.#.....#...#...#.....#.....#.#.#.#.....#OOO#O#
#.#.#.#.#####.###.#.###.#.###.###.###.###.###.#.#####.#.#.###.#.###.#.###.#.###.#####.#######.#.#.###.###.#.#.#.###.#.#.#.#.#.#.#.#########O#
#.#.#.#.#...#.....#...#.#.#.#.#.......#...#...#.#.....#.#...#.#...#.....#.......#...#.......#.#.#...#.....#.#...#...#...#.#...#...#OOOOOOOOO#
#.#.#.###.#.#.###.###.###.#.#.#.#######.###.###.#.#####.#.#.#.###.###.###.#######.#.#######.#.###.#.#.#####.#.#.#.#######.#####.###O#########
#.#.#.#...#...#...#...#...#...#.#...#...#...#.....#.....#...#...#...#.#...#.......#.........#...#.#.#.#...#.#...#.......#...#..OOO#O#.....#.#
#.###.#.#.###.#.###.###.###.#####.#.###.#.#######.#####.#.###.#####.###.###.###################.###.###.#.#.###########.###.#.#O#O#O#.#.#.#.#
#...#...#...#.#.#...#.....#.......#...#.#.......#.....#.#.#...#...#.....#...#...#...........#.....#.#...#.#...........#.....#.#O#OOO#.#.#.#.#
###.#####.#.#.#.#.#.#.###.###########.#.#######.#####.###.#####.#.#######.###.#.#.#####.#.#.#.###.#.#.###.###.#######.#######.#O#######.#.#.#
#...#...#.#.#.#...#.#...#.#.......#...#...#.....#...#.....#...#.#.....#...#...#...#...#.#.#...#...#.#...#.#...#.....#.#.....#.#O........#.#.#
#.###.#.#.#.#.###.#.###.#.#.#####.#.#####.#.#######.###.#.#.#.#.#####.#.###.#########.#.#.#####.###.#.###.#####.###.###.###.#.#O#########.#.#
#.#...#.#.#...#.....#.#.#.#.#...#.#.......#.......#.#...#...#.....#...#.#.....#.......#.#.#...#.#.....#...#.....#.#.....#.#...#OOO..........#
#.#.#.#.#.###.#.#####.#.#.#.###.#.#######.#.#####.#.#.#####.#######.###.#####.#.#####.#.#.#.#.#.#######.###.#####.#######.#######O###.#.###.#
#...#.#...#...#.#.......#.#...#.....#...#.#.....#.#.#.#...#.......#...#.....#.#.#...#.#...#.#...#.....#...#.#.#.......#.........#O#...#.....#
#.###.###.#.#.#.#########.###.#.#####.#.#.#######.#.#.#.#.#.#####.#.#.#####.#.#.#.#.#.#.###.#####.###.###.#.#.#.###.###.#.#.###.#O#.###.#####
#.#...#...#.#.............#...#.#.....#...#.......#.#...#...#...#.#.#.#.....#.#.#.#.#.#.....#.#...#.#.....#.#.#.#.#.....#...#.#.#O#.#.#...#.#
#.#.###.#.#.#.###.#.#.#####.#####.#######.#.#######.#########.###.#.#.#.#####.#.#.#.###.#.###.#.#.#.#####.#.#.#.#.###.###.###.#.#O#.#.###.#.#
#.#...#.#...#...#...#.#...#.........#...#...#.#.............#...#...#.#.#.....#...#.....#...#...#.#.....#.#.#.....#...#...#.#...#O#.#.....#.#
#.###.#######.#.#.#.###.#.###########.#.#####.#.#########.###.#.###.#.#.###.###.#####.#####.###.#.#.###.#.#.#######.#.#.###.#.###O#.#.#####.#
#.....#.......#...#.....#.#...........#.#...#...#.....#.#...#.#.....#.#...#...#.#...#.#...#...#.#.#...#...#.#.....#.#.#.#...#..OOO..#.#.....#
#.#.###.#######.#########.#.#####.#####.#.#.#.###.###.#.###.#.#######.###.###.#.#.#.#.###.###.###.###.#####.#.###.#.#.#.#.###.#O#####.#.#####
#.#.....#.....#.#.#.....#...#...#...#...#.#.#.#...#.#...#.#.#.........#...#...#.#.#.#.#.....#.#...#.#.#.....#...#...#.#.#.....#OOO#...#.....#
#.#.#######.#.#.#.#.###.###.#.#.#####.###.#.#.###.#.###.#.#.#########.#.###.###.#.#.#.#.#####.#.###.#.#.#####.#.#####.#.#####.#O#O#.#######.#
#.#.......#.#...#.#.#.#...#.#.#...#.......#.....#.#.....#.#.....#.....#.#.....#.#.#.#...#.....#.#.....#.#...#.#...#.#.......#.#O#O#.........#
#.#######.#.#####.#.#.###.#.#.###.#.#######.###.#.###.###.#####.#.#######.###.###.#.###.#.#####.#.#####.#.###.###.#.#.#####.###O#O#########.#
#...#.#...#...#...#.#...#.#.#.#...#.#.....#...#.#...#.....#.....#.......#.#...#.......#.#...#...#.#.....#.......#.#.#.......#..O#O#...#...#.#
#.#.#.#.#####.#.#.#.#.###.###.#.#.#.#.###.###.#.#.#.#####.#.#.#########.#.#.###.#####.#.###.#.#####.#########.###.#.#.#.###.#.#O#O#.#.#.#.#.#
#.#.#.#...#.....#.#.#...#.....#.#...#...#.....#.#.#...#...#.#.#.........#.....#.#.#...#.#.#.#.......#.......#.#...#.#.#.#...#.#O#O#.#.#.#...#
###.#.###.#######.#.#.#.#######.###.###.#######.#.###.#####.###.#.###.#.#.###.#.#.#.###.#.#.#####.###.#####.###.###.#.#.###.#.#O#O#.###.#####
#...#...#.......#...#.#.......#...#...#.........#...#.....#.....#...#.#.#...#.#...#.#.#...#.....#.#.....#.......#.....#...#.#.#OOO#...#...#.#
#.#####.#######.#.###.#####.#####.###.#.#####.###.#######.#########.#.#.#####.#.###.#.#.#######.#.###.#.#########.#######.#.#.#O#O###.###.#.#
#.#...#.......#.#...#.#...#.#...#.....#.#.........#.......#...#...#.#.#.....#...#...#...#.....#.#...#.#...#.............#.#....OOO..#.....#.#
#.#.#.#.###.#.#.#.#.#.#.#.#.#.#.###.###.###########.#####.#.#.#.###.#.#####.#####.###.###.###.#.###.#.###.#############.#.###.#O#O#.#.#####.#
#.#.#.#.#...#.#.#.#.#.#.#...#.#.......#.#...........#.....#.#...#...#.#...#.....#.#.#...#.#.#...#.#.#.#...#.......#.......#...#OOO#.#.#...#.#
#.#.#.#.#.#####.#.#.###.###.#.#######.#.#.#.#########.#####.#####.###.###.#####.#.#.###.#.#.#####.#.###.###.#####.#########.#####O#.#.#.#.#.#
#...#.#.#.......#.#...#...#.#.#.....#.....#.#...#...........#.....#.#.........#...#...#.#.#...#...#.#...#...#.#...#.......#.#.#..O#.#...#...#
#.#.#.#.#.#########.#.###.###.#####.#########.#.#.#########.#.#####.#####.###########.#.#.#.#.#.#.#.#.#.#.###.#.###.#####.#.#.#.#O#.#####.#.#
#...#...#.#.......#.#...#.#...#...#.....#.............#.....#...#.#.......#...........#.#.#.#.#.#.#...#...#...#.#...#...#.#.#....O..#.......#
#.#.###.#.###.###.#####.#.#.###.#.#.#####.###########.###.#.###.#.#.#######.###.#######.#.#.#.#.#.#####.#.#.###.#.###.#.#.#.###.#O#.#######.#
#.#...#.#...#...#.......#...#...#.#.....#...#...#.....#...#.#.#.......#.....#.#.....#.....#.#.#.#...#.....#.....#.#...#...#...#.#O#.#.....#.#
#.###.#.###.###.#########.###.###.#####.###.#.#.#.#.#.#.###.#.#.#.#####.#####.#####.#.###.#.#.#.###.#.#.#.#.#####.#####.#####.###O#.#.###.###
#...............#.#.....#.#...#...#.......#...#.#.#.#.#.......#.#.#.....#.........#...#.#.#.#.#.........#.#.....#.....#.......#OOO#.#.#.#...#
#.#####.#.#######.#.###.#.#.#.###.#.#.#.#.#####.#.#.#.#####.#.#.###.#####.###.#.#.#####.#.#.#####.#######.#####.#.###.#########O#.#.#.#.###.#
#.#...#...#.....#...#.#...#.#...#.#.#.#.......#.#.#.#.#...#...#.....#...#...#.#.#.#.......#.........#...#.#.....#...#.......#OOO#.#.#.#.#...#
#.#.#.#.###.#.###.###.#########.#.#.#.#.#.#####.#.###.#.#.###.#######.#####.#.#.#.#####.#.#.#########.#.#.###.#########.###.#O#.###.#.#.#.#.#
#.#.#.#...#.#.#...#.....#.......#...#...#.#.....#...#.#.#.#.#.#.....#.#.....#.#.......#.#.#.#...#.....#.#...#...#.....#...#.#O#...#...#.#...#
#.#.#.#.#.###.#.#####.#.###.#############.#.#####.#.#.#.#.#.#.#.###.#.#.#.###.#.#####.#.#.###.#.#.#####.###.#.#.#.###.#####.#O###.#####.###.#
#.#.#...#...#.........#.....#.....#.....#.#.#.....#.#...#.#.#...#.....#.#.#...#.......#.#.....#...#OOO#.....#.#...#.#.....#.#OOO#.........#.#
#.###.#.###.#.###.#.#########.###.#.#####.#.#.#####.#####.#.#.#.#######.#.#.###.#######.###########O#O#######.#####.#####.#.###O#########.#.#
#...#.#.#...#.#...#...#.........#.#.......#.#.#...#.......#.#.#.#.....#.#.#.#.#.......#...........#O#O#.#.......#OOO....#.#.#OOO#.......#.#.#
#.#.#.#.#.###.#####.#.#.#########.#.###.###.###.#.###.###.#.#.#.#.###.#.#.#.#.#######.#.#########.#O#O#.#.#.#####O#O###.#.#.#O###.#####.#.#.#
#.#.#.#.#.#.......#.#.....#.......#.......#.....#.#...#...#.#.#...#...#...#.#...........#.......#.#O#O..#.#..OOOOO#O#...#.#.#OOO#.....#.#...#
#.#.###.#.#######.#########.#.#####.#######.#####.#.#.#.###.#.#.###.###.###.#.###########.#.#.#.#.#O#O###.###O#.###O#.###.#.###O#####.#.#####
#.#.#...#.....#.......#.....#...#...#.......#...#...#.#.#.#...#.#.#.....#.....#.#...........#OOOOOOO#OOOOOOOOO#.#OOO#...#.#.#OOO#.....#.#...#
#.#.#.#.#####.#######.#.#####.#.#####.#.#.###.#.#####.#.#.#.###.#.#######.###.#.#.###########O#######.#####.#O#.#O#O#.#.#.#.#O###.#######.#.#
#.#.#.......#.....#.....#.....#.....#.#.....#.#...#...#.#...#.#.....#.#...#.....#...#.....#OOO#.....#.#.....#O#..O#O....#...#OOO#.#.......#.#
#.#.#.###.#.###.#.#######.#########.#.#######.###.#####.#.###.#####.#.#.###########.#####.#O###.###.#.#.###.#O###O#O###.#######O#.#.#######.#
#...#.#.#.#.#...#.#...#...#.#.....#...#...#...#.#...#...#.#...#.....#.#.#...........#.....#OOO#.#.#...#.#...#OOOOO#OOO#...#...#O#.#.#.....#.#
#.###.#.#.###.#.#.#.#.#.###.#.###.#####.###.###.###.#.###.#.###.#####.#.#.#########.#.#####.#O#.#.#####.#.#####.#####O###.#.###O#.#.#.###.#.#
#...#.#.#...#.#.#...#...#.....#.#.....#...#.#.....#.#.#.#.#.........#.#.......#OOO#...#OOO#.#O#.#...#...#...#...#...#O#.....#OOO#...#.#...#.#
###.#.#.###.#.#.###########.###.#####.#.#.#.#.#.###.#.#.#.#########.#.#########O#O#.###O#O###O#.#.#.###.###.#.#####.#O#######O###.#####.#.#.#
#...#.#...#...#.....#.....#.........#...#.#.#.#.......#...#.......#...#OOOOOOOOO#O#.#OOO#OOO#O#.#.#.....#.#...#.....#OOOOO..#O#.#.#...#.#.#.#
#.#.#.###.#####.###.###.#.#####.#########.#.###########.###.#####.###.#O#########O###O#####O#O#.#.#####.#.#####.###.#####O#.#O#.#.#.#.#.###.#
#...#.....#...#.#.#.#...#.#.#...#.........#.#.......#.....#.#.....#...#OOO#......OOOOO#....OOO#...#...#.........#.#.....#O..#O#.....#...#...#
#.#.#####.#.#.#.#.#.#.###.#.#.###.#######.#.#.#####.#####.#.#.#####.#####O#.###.#######.#######.#.###.###########.#.###.#O###O###########.#.#
#...#.....#.#.#.#.#...#...#.#.#...#...#.#.#.#.#...#.....#...#.#...#.#OOOOO#.....#...#...#.......#...#.......#.......#...#OOOOO#...#.....#.#.#
###.###.###.#.#.#.#####.###.#.#.###.#.#.#.#.#.#.###.#.#.#####.#.#.#.#O#.#####.#.#.#.#####.#########.#.#####.#.#####.#.#########.#.#.###.#.#.#
#.#...#.#.#.#...#.....#.#.....#.....#...#.#.....#...#.#...#.......#.#O#.#.....#.#.#.......#.#.......#.....#.#.#...#.#.#...#.....#...#.#.#.#.#
#.#.#.#.#.#.#####.#.###.#######.#.#.#.#.#.#####.#.#.#.###.#######.#.#O###.#####.#.#########.#.###.#######.#.#.###.#.#.#.#.###.#######.#.#.#.#
#.....#...#.....#.#.#...#.....#.#.#.#...#.......#.#.#...#...#...#.#.#O#.....#...#.......#...#.#.#.....#...#.#.....#...#.#...#.....#.......#.#
#.#.#####.#####.#.###.###.###.#.#.#.#########.###.#.#######.#.#.#.###O#.#####.#########.#.###.#.#####.#.###.#.#.#######.###.#.###.#########.#
#.....#...#...#.#...#.#.....#.....#.......#...#...#.........#.#.#...#O#.#.#...#.......#.#...#.......#.#...#.#.#.........#.#.#.#.#.....#.....#
#####.###.###.#.###.#.#.###.#####.#####.###.###.#############.#####.#O#.#.#.###.#.#####.#.#.###.#####.#####.#.#####.#.###.#.#.#.#####.###.###
#...#...#.....#.....#.#.#...#...#.....#...#.#...#.....#OOOOOOOOOOO#.#O#...........#...#.#.#.....#.....#.....#.....#.#.#.....#...#...#...#...#
#.#.###.#########.#.#.###.###.###.###.###.#.#.#####.#.#O#########O#.#O###.#######.#.#.#.#.#######.###.#.#.#.###.#.###.#.#####.###.#.#.#.###.#
#.#...#...........#.#.#...#.......#.....#.#.#.....#.#.#OOO#...#.#O#.#O#...#.....#.#.#...#.......#.#...#.#.#.....#.....#.#...#.#...#.#.#.#.#.#
#.#.###############.#.#.###.#######.###.#.#.#####.#.#####O#.#.#.#O#.#O#.#.#.###.#.#.#####.###.###.#.###.#.#.###.#######.#.#.#.#.###.###.#.#.#
#.#.#OOOOO..#OOOOO#...#...#.......#OOO#...#.......#.....#O..#...#OOOOO#.#...#...#.#.......#.#.#...#.#...#.#...#.#.....#.....#.#.............#
#.###O###O###O###O#.#####.#######.#O#O#########.#.#.#.###O###.#.#######.#.#.#.###.#######.#.#.#.#####.###.###.###.#.#######.#.#.#########.#.#
#OOO#O#.#OOOOO..#O#.#...#...#...#..O#OOOOOOO#...#.#.#....O..#.#.#.......#.#.#.#...#...#...#...#...#.....#.#...#...#.......#.#.#.....#...#...#
#O#O#O#.#########O#.#.#.###.#.#####O#######O#.###.#.#.#.#O#.#.#.#.#######.#.#.#.###.#.#.#########.#.#####.#.#.#.#####.#####.#.#####.#.#.#.###
#O#O#OOOOO#...#..OOOOOOOOOOOOOOOOO#OOOOO#.#O#.#.#.#...#.#O#...#.#...#.....#.#.#.....#...#.......#.....#...#.#.#.#...................#.#.#...#
#O#O#####O#.###.#.###.#######.#.#O#####O#.#O#.#.#.#.#.#.#O#.###.###.#######.#.#############.###.#######.###.#.#.###.#.#.#.#.#####.#####.###.#
#O#OOOOOOO..#...#.#...#.......#.#O....#OOO#O#...#.#.#...#O..#...#...#.......#.........#...#.#...........#...#.#.....#.#.#...#...#.#.....#...#
#O###########.###.#.#.#.###.###.#O#.#####O#O###.#.###.###O###.###.###.#######.#######.#.#.#.#############.#####.#####.#.#####.#.#.#.#.###.###
#OOO#OOO#.#...#...#.#.#...#.#...#O#.#OOOOO#O#...#...#....O......#.....#.......#...#...#.#.#...#...........#.....#.....#.#.....#...#.#...#.#.#
###O#O#O#.#.###.###.#.###.#.#.###O#.#O#####O#.#####.#.###O#############.#.#.###.#.#.###.#.###.#######.#####.#####.###.#.#.###.#####.###.#.#.#
#.#OOO#O..#.#.#.#...#.#...#...#..O#.#O....#O#...#.#.#...#O..#.....#.....#.#.#...#.#.....#...#.......#.#.....#...#.#...#.#...#.#...#.#.#.#...#
#.#####O###.#.#.#.###.#.#######.#O###O#####O###.#.#.#####O#.#.#.###.#####.#.#.###.#########.#.#####.#.#.#####.###.#.###.###.#.#.#.#.#.#.###.#
#OOOOO#O#...#...#.#.#...#.....#..O#OOO#....OOOOOOOOOOOOO#O#...........................#...#.#.#.....#.#.#.....#...#.#...#...#.#.#.#.#.#.....#
#O###O#O#.#######.#.#######.#.###O#O###.#########.#.#.#O#O#######.###.#.###.###.#####.#.#.#.#.#.#####.#.#####.#.#####.#######.#.#.#.#.#######
#O..#OOO#...................#...#OOO..#...........#...#OOO......#.....#.............#...#.......#.............#...............#.#...........#
#############################################################################################################################################
+79
View File
@@ -0,0 +1,79 @@
from collections import namedtuple
from math import sqrt
from pathlib import Path
Point = namedtuple('Point', ['y', 'x'])
Node = namedtuple('Node', ['p', 'd'])
# set up inputs
text = Path('input').read_text('utf-8')
board_lines = text.splitlines()
width = len(board_lines[0])
board = list(map(list, board_lines))
start, end = Point(*divmod(text.find('S'), width + 1)), Point(*divmod(text.find('E'), width + 1))
# simple cost heuristic based on distance to end node
def cost_heuristic(p: Point) -> float:
return sqrt((p.x - end.x) ** 2 + (p.y - end.y) ** 2)
# walks path backwards, scans for nodes with incoming paths of equal cost, and traverses all recursively
def equal_cost_backtrace(parent: dict, node_cost: dict, current: Node) -> set[Point]:
last_direction = current.d
trace = {current.p}
while current := parent.get(current):
trace.add(current.p)
for d in map(lambda o: (current.d + o) & 3, [1, -1]):
test = Node(current.p, d)
if last_direction != current.d and (node_cost.get(test, 0) - node_cost[current]) == 1000:
trace.update(equal_cost_backtrace(parent, node_cost, parent.get(test)))
last_direction = current.d
return trace
# simple A star
def a_star() -> tuple[int, int]:
t_start = Node(start, 0)
pending: set[Node] = {t_start}
parent: dict[Node, Node] = {}
node_cost: dict[Node, float] = {t_start: 0.0}
total_cost: dict[Node, float] = {t_start: cost_heuristic(t_start.p)}
while len(pending):
current = min(pending, key=lambda t: total_cost[t])
if current.p == end:
return int(node_cost[current]), len(equal_cost_backtrace(parent, node_cost, current))
pending.remove(current)
# scan in all directions
for i, vector in enumerate([(0, 1), (1, 0), (0, -1), (-1, 0)]):
neighbor = Node(Point(current.p.y + vector[0], current.p.x + vector[1]), i)
if board[neighbor.p.y][neighbor.p.x] == '#':
continue
# assign new cost based on rotation and step
new_cost = node_cost[current] + [0, 1000, 2000, 1000][(i - current.d) & 3] + 1
if new_cost >= node_cost.get(neighbor, 1e13):
continue
parent[neighbor] = current
node_cost[neighbor] = new_cost
total_cost[neighbor] = new_cost + cost_heuristic(neighbor.p)
if neighbor in pending:
continue
pending.add(neighbor)
return 0, 0
lowest_cost, nodes = a_star()
print("Part 1:", lowest_cost)
print("Part 2:", nodes)
Binary file not shown.
Loaded 100 of 150 files, more files were not shown because too many files have changed in this diff. Show more