input<-read_lines("Day18Sample.txt")
### Just read these into a dictionary - save the position in line
corrupt<-dict()
for(i in 1:length(input)){
corrupt$set(input[i],i)}
Part 1
Search. Use time as a way to figure out if something is in your
way
computerstorm<-function(cs,sx,sy,ex,ey,maxx,maxy,t){
beenthere<-dict()
pq<-priority_queue()
## push x,y,steps
pq$push(c(sx,sy,0),0)
while(pq$size()>0){
curr<-pq$pop()
### check to see if have been here before - if not - note
if(beenthere$has(str_flatten(c(curr[1],curr[2]),","))){next}
beenthere$set(str_flatten(c(curr[1],curr[2]),","),0)
### check to see if we're at the end
if(all(curr[1:2]==c(ex,ey))){
return(curr[3])}
### otherwise move
##up
if(curr[2]>0){
### check to see if that space is corrupt - if not, move there
checkup<-cs$get(str_flatten(c(curr[1],curr[2]-1),","),default=Inf)
if(t<checkup){pq$push(c(curr[1],curr[2]-1,curr[3]+1),-sum(1,curr[3],abs(c(ex,ey)-c(curr[1],curr[2]-1))))}}
##down
if(curr[2]<maxy){
### check to see if that space is corrupt - if not, move there
checkdown<-cs$get(str_flatten(c(curr[1],curr[2]+1),","),default=Inf)
if(t<checkdown){pq$push(c(curr[1],curr[2]+1,curr[3]+1),-sum(1,curr[3],abs(c(ex,ey)-c(curr[1],curr[2]+1))))}}
##left
if(curr[1]>0){
### check to see if that space is corrupt - if not, move there
checkleft<-cs$get(str_flatten(c(curr[1]-1,curr[2]),","),default=Inf)
if(t<checkleft){pq$push(c(curr[1]-1,curr[2],curr[3]+1),-sum(1,curr[3],abs(c(ex,ey)-c(curr[1]-1,curr[2]))))}}
##right
if(curr[1]<maxx){
### check to see if that space is corrupt - if not, move there
checkleft<-cs$get(str_flatten(c(curr[1]+1,curr[2]),","),default=Inf)
if(t<checkleft){pq$push(c(curr[1]+1,curr[2],curr[3]+1),-sum(1,curr[3],abs(c(ex,ey)-c(curr[1]+1,curr[2]))))}}
}
### for part 2, return 0 if there's no way through
return(0)}
computerstorm(corrupt,0,0,6,6,6,6,12)
[1] 22
Part 2
Find the limits to t
findt<-function(cs,sx,sy,ex,ey,maxx,maxy){
### what are the limits to t
lowlimit<-1
highlimit<-cs$size()
#### while there's a difference between low & high limit
while(lowlimit+1<highlimit){
### try a random time...because I can.
trytime<-sample((lowlimit+1):(highlimit-1),1)
x<-computerstorm(cs,sx,sy,ex,ey,maxx,maxy,trytime)
if(x==0){highlimit<-trytime}else{lowlimit<-trytime}}
highlimit}
p2<-findt(corrupt,0,0,6,6,6,6)
part2<-input[p2]
part2
[1] "6,1"
6,1
LS0tDQp0aXRsZTogIkRheSAxOCBOb3RlYm9vayINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShyZXNoYXBlMikNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShzdHJpbmdyKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHJlYWRyKQ0KbGlicmFyeShjb2xsZWN0aW9ucykNCm9wdGlvbnMoc2NpcGVuID0gOTk5KQ0KYGBgDQoNCmBgYHtyfQ0KaW5wdXQ8LXJlYWRfbGluZXMoIkRheTE4U2FtcGxlLnR4dCIpDQojIyMgSnVzdCByZWFkIHRoZXNlIGludG8gYSBkaWN0aW9uYXJ5IC0gc2F2ZSB0aGUgcG9zaXRpb24gaW4gbGluZQ0KY29ycnVwdDwtZGljdCgpDQpmb3IoaSBpbiAxOmxlbmd0aChpbnB1dCkpew0KICBjb3JydXB0JHNldChpbnB1dFtpXSxpKX0NCmBgYA0KDQoNCiMjIFBhcnQgMQ0KU2VhcmNoLiBVc2UgdGltZSBhcyBhIHdheSB0byBmaWd1cmUgb3V0IGlmIHNvbWV0aGluZyBpcyBpbiB5b3VyIHdheQ0KDQpgYGB7cn0NCmNvbXB1dGVyc3Rvcm08LWZ1bmN0aW9uKGNzLHN4LHN5LGV4LGV5LG1heHgsbWF4eSx0KXsNCiAgYmVlbnRoZXJlPC1kaWN0KCkNCiAgcHE8LXByaW9yaXR5X3F1ZXVlKCkNCiAgIyMgcHVzaCB4LHksc3RlcHMNCiAgcHEkcHVzaChjKHN4LHN5LDApLDApDQogIHdoaWxlKHBxJHNpemUoKT4wKXsNCiAgICBjdXJyPC1wcSRwb3AoKQ0KICAgICMjIyBjaGVjayB0byBzZWUgaWYgaGF2ZSBiZWVuIGhlcmUgYmVmb3JlIC0gaWYgbm90IC0gbm90ZQ0KICAgIGlmKGJlZW50aGVyZSRoYXMoc3RyX2ZsYXR0ZW4oYyhjdXJyWzFdLGN1cnJbMl0pLCIsIikpKXtuZXh0fQ0KICAgIGJlZW50aGVyZSRzZXQoc3RyX2ZsYXR0ZW4oYyhjdXJyWzFdLGN1cnJbMl0pLCIsIiksMCkNCiAgICAjIyMgY2hlY2sgdG8gc2VlIGlmIHdlJ3JlIGF0IHRoZSBlbmQNCiAgICBpZihhbGwoY3VyclsxOjJdPT1jKGV4LGV5KSkpew0KICAgICAgcmV0dXJuKGN1cnJbM10pfQ0KICAgICMjIyBvdGhlcndpc2UgbW92ZQ0KICAgICMjdXANCiAgICBpZihjdXJyWzJdPjApew0KICAgICAgIyMjIGNoZWNrIHRvIHNlZSBpZiB0aGF0IHNwYWNlIGlzIGNvcnJ1cHQgLSBpZiBub3QsIG1vdmUgdGhlcmUNCiAgICAgIGNoZWNrdXA8LWNzJGdldChzdHJfZmxhdHRlbihjKGN1cnJbMV0sY3VyclsyXS0xKSwiLCIpLGRlZmF1bHQ9SW5mKQ0KICAgICAgaWYodDxjaGVja3VwKXtwcSRwdXNoKGMoY3VyclsxXSxjdXJyWzJdLTEsY3VyclszXSsxKSwtc3VtKDEsY3VyclszXSxhYnMoYyhleCxleSktYyhjdXJyWzFdLGN1cnJbMl0tMSkpKSl9fQ0KICAgICMjZG93bg0KICAgIGlmKGN1cnJbMl08bWF4eSl7DQogICAgICAjIyMgY2hlY2sgdG8gc2VlIGlmIHRoYXQgc3BhY2UgaXMgY29ycnVwdCAtIGlmIG5vdCwgbW92ZSB0aGVyZQ0KICAgICAgY2hlY2tkb3duPC1jcyRnZXQoc3RyX2ZsYXR0ZW4oYyhjdXJyWzFdLGN1cnJbMl0rMSksIiwiKSxkZWZhdWx0PUluZikNCiAgICAgIGlmKHQ8Y2hlY2tkb3duKXtwcSRwdXNoKGMoY3VyclsxXSxjdXJyWzJdKzEsY3VyclszXSsxKSwtc3VtKDEsY3VyclszXSxhYnMoYyhleCxleSktYyhjdXJyWzFdLGN1cnJbMl0rMSkpKSl9fQ0KICAgICMjbGVmdA0KICAgIGlmKGN1cnJbMV0+MCl7DQogICAgICAjIyMgY2hlY2sgdG8gc2VlIGlmIHRoYXQgc3BhY2UgaXMgY29ycnVwdCAtIGlmIG5vdCwgbW92ZSB0aGVyZQ0KICAgICAgY2hlY2tsZWZ0PC1jcyRnZXQoc3RyX2ZsYXR0ZW4oYyhjdXJyWzFdLTEsY3VyclsyXSksIiwiKSxkZWZhdWx0PUluZikNCiAgICAgIGlmKHQ8Y2hlY2tsZWZ0KXtwcSRwdXNoKGMoY3VyclsxXS0xLGN1cnJbMl0sY3VyclszXSsxKSwtc3VtKDEsY3VyclszXSxhYnMoYyhleCxleSktYyhjdXJyWzFdLTEsY3VyclsyXSkpKSl9fQ0KICAgICMjcmlnaHQNCiAgICBpZihjdXJyWzFdPG1heHgpew0KICAgICAgIyMjIGNoZWNrIHRvIHNlZSBpZiB0aGF0IHNwYWNlIGlzIGNvcnJ1cHQgLSBpZiBub3QsIG1vdmUgdGhlcmUNCiAgICAgIGNoZWNrbGVmdDwtY3MkZ2V0KHN0cl9mbGF0dGVuKGMoY3VyclsxXSsxLGN1cnJbMl0pLCIsIiksZGVmYXVsdD1JbmYpDQogICAgICBpZih0PGNoZWNrbGVmdCl7cHEkcHVzaChjKGN1cnJbMV0rMSxjdXJyWzJdLGN1cnJbM10rMSksLXN1bSgxLGN1cnJbM10sYWJzKGMoZXgsZXkpLWMoY3VyclsxXSsxLGN1cnJbMl0pKSkpfX0NCiAgfQ0KICAjIyMgZm9yIHBhcnQgMiwgcmV0dXJuIDAgaWYgdGhlcmUncyBubyB3YXkgdGhyb3VnaA0KcmV0dXJuKDApfQ0KDQpgYGANCg0KYGBge3J9DQpjb21wdXRlcnN0b3JtKGNvcnJ1cHQsMCwwLDYsNiw2LDYsMTIpDQpgYGANCg0KIyMgUGFydCAyDQoNCkZpbmQgdGhlIGxpbWl0cyB0byB0DQpgYGB7cn0NCmZpbmR0PC1mdW5jdGlvbihjcyxzeCxzeSxleCxleSxtYXh4LG1heHkpew0KICAjIyMgd2hhdCBhcmUgdGhlIGxpbWl0cyB0byB0DQogIGxvd2xpbWl0PC0xDQogIGhpZ2hsaW1pdDwtY3Mkc2l6ZSgpDQogICMjIyMgd2hpbGUgdGhlcmUncyBhIGRpZmZlcmVuY2UgYmV0d2VlbiBsb3cgJiBoaWdoIGxpbWl0DQogIHdoaWxlKGxvd2xpbWl0KzE8aGlnaGxpbWl0KXsNCiAgICAjIyMgdHJ5IGEgcmFuZG9tIHRpbWUuLi5iZWNhdXNlIEkgY2FuLg0KICAgIHRyeXRpbWU8LXNhbXBsZSgobG93bGltaXQrMSk6KGhpZ2hsaW1pdC0xKSwxKQ0KICAgIHg8LWNvbXB1dGVyc3Rvcm0oY3Msc3gsc3ksZXgsZXksbWF4eCxtYXh5LHRyeXRpbWUpDQogICAgaWYoeD09MCl7aGlnaGxpbWl0PC10cnl0aW1lfWVsc2V7bG93bGltaXQ8LXRyeXRpbWV9fQ0KICBoaWdobGltaXR9DQpgYGANCg0KDQpgYGB7cn0NCnAyPC1maW5kdChjb3JydXB0LDAsMCw2LDYsNiw2KQ0KcGFydDI8LWlucHV0W3AyXQ0KcGFydDINCmBgYA==