input<-read_lines("Day13Sample.txt")
### find how many prizes
p<-c(0,which(input==""))+1
### pull numbers out of the input
inputnumbers<-lapply(input,function(x){as.numeric(unlist(str_extract_all(x,"\\d+")))})
### set up machines in an easy way to solve them
machines<-list()
for(i in 1:length(p)){
a<-rbind(c(inputnumbers[[p[i]]][1],inputnumbers[[p[i]+1]][1]),
c(inputnumbers[[p[i]]][2],inputnumbers[[p[i]+1]][2]))
b<-inputnumbers[[p[i]+2]]
prmach<-list(a,b)
machines<-c(machines,list(prmach))}
This moves:
Button A: X+94, Y+34
Button B: X+22, Y+67
Prize: X=8400, Y=5400
to
\[\left(\begin{array}{cc}
94 & 22\\
34 & 67
\end{array}\right)
\left(\begin{array}{cc}
8400\\5400
\end{array}\right)\]
so that it can be put into solve().\ Solve() did not work, but the
formatting did.
Part 1
Determinants ftw.
getprizes<-function(m){
d<-sapply(m,function(x){
ab<-x[[1]]
ab<-(ab[1,1]*ab[2,2])-(ab[2,1]*ab[1,2])
ab})
dx<-sapply(m,function(x){
xm<-cbind(x[[2]],x[[1]][,2])
xm<-(xm[1,1]*xm[2,2])-(xm[2,1]*xm[1,2])
xm})
dy<-sapply(m,function(x){
ym<-cbind(x[[1]][,1],x[[2]])
ym<-(ym[1,1]*ym[2,2])-(ym[2,1]*ym[1,2])
ym})
tokens<-0
## find a
a<-dx%/%d
aa<-dx/d
## find b
b<-dy%/%d
bb<-dy/d
## filter out the ones that aren't integers and are over 100
ok<-intersect(intersect(intersect(which(a==aa),which(b==bb)),which(a<=100)),which(b<=100))
### tokens = 3*a+b
tokens<-sum(3*a[ok]+b[ok])
tokens}
getprizes(machines)
[1] 480
Part 2
Same as part 1, but add 10000000000000 to the solution
farawayprizes<-function(m){
d<-sapply(m,function(x){
ab<-x[[1]]
ab<-(ab[1,1]*ab[2,2])-(ab[2,1]*ab[1,2])
ab})
dx<-sapply(m,function(x){
xm<-cbind(x[[2]]+10000000000000,x[[1]][,2])
xm<-(xm[1,1]*xm[2,2])-(xm[2,1]*xm[1,2])
xm})
dy<-sapply(m,function(x){
ym<-cbind(x[[1]][,1],x[[2]]+10000000000000)
ym<-(ym[1,1]*ym[2,2])-(ym[2,1]*ym[1,2])
ym})
tokens<-0
a<-dx%/%d
aa<-dx/d
b<-dy%/%d
bb<-dy/d
ok<-intersect(which(a==aa),which(b==bb))
tokens<-sum(3*a[ok]+b[ok])
tokens}
farawayprizes(machines)
[1] 875318608908
LS0tDQp0aXRsZTogIkRheSAxMyBOb3RlYm9vayINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShyZXNoYXBlMikNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShzdHJpbmdyKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHJlYWRyKQ0KbGlicmFyeShjb2xsZWN0aW9ucykNCm9wdGlvbnMoc2NpcGVuID0gOTk5KQ0KYGBgDQoNCmBgYHtyfQ0KaW5wdXQ8LXJlYWRfbGluZXMoIkRheTEzU2FtcGxlLnR4dCIpDQoNCiMjIyBmaW5kIGhvdyBtYW55IHByaXplcw0KcDwtYygwLHdoaWNoKGlucHV0PT0iIikpKzENCiMjIyBwdWxsIG51bWJlcnMgb3V0IG9mIHRoZSBpbnB1dA0KaW5wdXRudW1iZXJzPC1sYXBwbHkoaW5wdXQsZnVuY3Rpb24oeCl7YXMubnVtZXJpYyh1bmxpc3Qoc3RyX2V4dHJhY3RfYWxsKHgsIlxcZCsiKSkpfSkNCiMjIyBzZXQgdXAgbWFjaGluZXMgaW4gYW4gZWFzeSB3YXkgdG8gc29sdmUgdGhlbQ0KbWFjaGluZXM8LWxpc3QoKQ0KZm9yKGkgaW4gMTpsZW5ndGgocCkpew0KICBhPC1yYmluZChjKGlucHV0bnVtYmVyc1tbcFtpXV1dWzFdLGlucHV0bnVtYmVyc1tbcFtpXSsxXV1bMV0pLA0KICAgICAgICAgICBjKGlucHV0bnVtYmVyc1tbcFtpXV1dWzJdLGlucHV0bnVtYmVyc1tbcFtpXSsxXV1bMl0pKQ0KICBiPC1pbnB1dG51bWJlcnNbW3BbaV0rMl1dDQogIHBybWFjaDwtbGlzdChhLGIpDQogIG1hY2hpbmVzPC1jKG1hY2hpbmVzLGxpc3QocHJtYWNoKSl9DQoNCmBgYA0KDQpUaGlzIG1vdmVzOg0KYGBgDQpCdXR0b24gQTogWCs5NCwgWSszNA0KQnV0dG9uIEI6IFgrMjIsIFkrNjcNClByaXplOiBYPTg0MDAsIFk9NTQwMA0KYGBgDQp0bw0KDQpcW1xsZWZ0KFxiZWdpbnthcnJheX17Y2N9IA0KOTQgJiAyMlxcDQozNCAmIDY3DQpcZW5ke2FycmF5fVxyaWdodCkNClxsZWZ0KFxiZWdpbnthcnJheX17Y2N9IA0KODQwMFxcNTQwMA0KXGVuZHthcnJheX1ccmlnaHQpXF0NCg0KIA0Kc28gdGhhdCBpdCBjYW4gYmUgcHV0IGludG8gc29sdmUoKS5cXA0KU29sdmUoKSBkaWQgbm90IHdvcmssIGJ1dCB0aGUgZm9ybWF0dGluZyBkaWQuDQoNCiMjIFBhcnQgMQ0KDQpEZXRlcm1pbmFudHMgZnR3Lg0KDQpgYGB7cn0NCmdldHByaXplczwtZnVuY3Rpb24obSl7DQogIGQ8LXNhcHBseShtLGZ1bmN0aW9uKHgpew0KICAgYWI8LXhbWzFdXQ0KICAgYWI8LShhYlsxLDFdKmFiWzIsMl0pLShhYlsyLDFdKmFiWzEsMl0pDQogICBhYn0pDQogIGR4PC1zYXBwbHkobSxmdW5jdGlvbih4KXsNCiAgICB4bTwtY2JpbmQoeFtbMl1dLHhbWzFdXVssMl0pDQogICAgeG08LSh4bVsxLDFdKnhtWzIsMl0pLSh4bVsyLDFdKnhtWzEsMl0pDQogICAgeG19KQ0KICBkeTwtc2FwcGx5KG0sZnVuY3Rpb24oeCl7DQogICAgeW08LWNiaW5kKHhbWzFdXVssMV0seFtbMl1dKQ0KICAgIHltPC0oeW1bMSwxXSp5bVsyLDJdKS0oeW1bMiwxXSp5bVsxLDJdKQ0KICAgIHltfSkNCiAgdG9rZW5zPC0wDQogICMjIGZpbmQgYQ0KICBhPC1keCUvJWQNCiAgYWE8LWR4L2QNCiAgIyMgZmluZCBiDQogIGI8LWR5JS8lZA0KICBiYjwtZHkvZA0KICAjIyBmaWx0ZXIgb3V0IHRoZSBvbmVzIHRoYXQgYXJlbid0IGludGVnZXJzIGFuZCBhcmUgb3ZlciAxMDANCiAgb2s8LWludGVyc2VjdChpbnRlcnNlY3QoaW50ZXJzZWN0KHdoaWNoKGE9PWFhKSx3aGljaChiPT1iYikpLHdoaWNoKGE8PTEwMCkpLHdoaWNoKGI8PTEwMCkpDQogICMjIyB0b2tlbnMgPSAzKmErYg0KICB0b2tlbnM8LXN1bSgzKmFbb2tdK2Jbb2tdKQ0KICB0b2tlbnN9DQogIA0KYGBgDQoNCmBgYHtyfQ0KZ2V0cHJpemVzKG1hY2hpbmVzKQ0KYGBgDQojIyBQYXJ0IDINClNhbWUgYXMgcGFydCAxLCBidXQgYWRkIDEwMDAwMDAwMDAwMDAwIHRvIHRoZSBzb2x1dGlvbg0KDQpgYGB7cn0NCmZhcmF3YXlwcml6ZXM8LWZ1bmN0aW9uKG0pew0KICBkPC1zYXBwbHkobSxmdW5jdGlvbih4KXsNCiAgIGFiPC14W1sxXV0NCiAgIGFiPC0oYWJbMSwxXSphYlsyLDJdKS0oYWJbMiwxXSphYlsxLDJdKQ0KICAgYWJ9KQ0KICBkeDwtc2FwcGx5KG0sZnVuY3Rpb24oeCl7DQogICAgeG08LWNiaW5kKHhbWzJdXSsxMDAwMDAwMDAwMDAwMCx4W1sxXV1bLDJdKQ0KICAgIHhtPC0oeG1bMSwxXSp4bVsyLDJdKS0oeG1bMiwxXSp4bVsxLDJdKQ0KICAgIHhtfSkNCiAgZHk8LXNhcHBseShtLGZ1bmN0aW9uKHgpew0KICAgIHltPC1jYmluZCh4W1sxXV1bLDFdLHhbWzJdXSsxMDAwMDAwMDAwMDAwMCkNCiAgICB5bTwtKHltWzEsMV0qeW1bMiwyXSktKHltWzIsMV0qeW1bMSwyXSkNCiAgICB5bX0pDQogIHRva2VuczwtMA0KICBhPC1keCUvJWQNCiAgYWE8LWR4L2QNCiAgYjwtZHklLyVkDQogIGJiPC1keS9kDQogIG9rPC1pbnRlcnNlY3Qod2hpY2goYT09YWEpLHdoaWNoKGI9PWJiKSkNCiAgdG9rZW5zPC1zdW0oMyphW29rXStiW29rXSkNCiAgdG9rZW5zfQ0KICANCmBgYA0KDQpgYGB7cn0NCmZhcmF3YXlwcml6ZXMobWFjaGluZXMpDQpgYGANCg==