#input<-read_lines("Day10Sample.txt")
input<-read_lines("../../AoCData/AOC2024/Day10.txt")
### turn this into a matrix
topmap<-matrix(0,nrow=length(input),ncol=nchar(input[1]))
for(i in 1:length(input)){topmap[i,]<-as.numeric(unlist(str_split(input[i],"")))}
Part 1
First, find all of the zeros
zeros<-which(topmap==0,arr.ind=TRUE)
Function that finds all of the trailheads for a zero (x,y)
counttrailheads<-function(tm,zero){
### create the queue & the dictionary
q<-queue()
beenthere<-dict()
s<-c(0,zero[1],zero[2])
q$push(s)
maxrows<-nrow(tm)
maxcols<-ncol(tm)
trailheads<-0
while(q$size()>0){
s<-q$pop()
### if been there, stop
if(beenthere$has(str_c(c(s[2],s[3]),collapse="~"))){
next}else{beenthere$set(str_c(c(s[2],s[3]),collapse="~"),s[1])}
if(s[1]==9){
trailheads<-trailheads+1
next}
### try in each direction
if(s[2]<maxcols){
if(tm[s[3],(s[2]+1)]==s[1]+1){q$push(c(s[1]+1,s[2]+1,s[3]))}}
if(s[2]>1){
if(tm[s[3],(s[2]-1)]==s[1]+1){q$push(c(s[1]+1,s[2]-1,s[3]))}}
if(s[3]<maxrows){
if(tm[(s[3]+1),s[2]]==s[1]+1){q$push(c(s[1]+1,s[2],s[3]+1))}}
if(s[3]>1){
if(tm[(s[3]-1),s[2]]==s[1]+1){q$push(c(s[1]+1,s[2],s[3]-1))}}}
trailheads}
p1<-sapply(1:nrow(zeros),
function(x){
counttrailheads(topmap,c(zeros[x,2],zeros[x,1]))})
part1<-sum(p1)
part1
[1] 550
Part 2
If I understand this correctly, It’s the same, just don’t check to
see if that path has already been traversed? So just remove the lines
that check to see if that point has already been there.
ratingcheck<-function(tm,zero){
### create the queue & the dictionary
q<-queue()
s<-c(0,zero[1],zero[2])
q$push(s)
maxrows<-nrow(tm)
maxcols<-ncol(tm)
trailheads<-0
while(q$size()>0){
s<-q$pop()
if(s[1]==9){
trailheads<-trailheads+1
next}
### try in each direction
if(s[2]<maxcols){
if(tm[s[3],(s[2]+1)]==s[1]+1){q$push(c(s[1]+1,s[2]+1,s[3]))}}
if(s[2]>1){
if(tm[s[3],(s[2]-1)]==s[1]+1){q$push(c(s[1]+1,s[2]-1,s[3]))}}
if(s[3]<maxrows){
if(tm[(s[3]+1),s[2]]==s[1]+1){q$push(c(s[1]+1,s[2],s[3]+1))}}
if(s[3]>1){
if(tm[(s[3]-1),s[2]]==s[1]+1){q$push(c(s[1]+1,s[2],s[3]-1))}}}
trailheads}
p2<-sapply(1:nrow(zeros),
function(x){
ratingcheck(topmap,c(zeros[x,2],zeros[x,1]))})
part2<-sum(p2)
part2
[1] 1255
LS0tDQp0aXRsZTogIkRheSAxMCBOb3RlYm9vayINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShyZXNoYXBlMikNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShzdHJpbmdyKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHJlYWRyKQ0KbGlicmFyeShjb2xsZWN0aW9ucykNCm9wdGlvbnMoc2NpcGVuID0gOTk5KQ0KYGBgDQoNCmBgYHtyfQ0KI2lucHV0PC1yZWFkX2xpbmVzKCJEYXkxMFNhbXBsZS50eHQiKQ0KaW5wdXQ8LXJlYWRfbGluZXMoIi4uLy4uL0FvQ0RhdGEvQU9DMjAyNC9EYXkxMC50eHQiKQ0KDQojIyMgdHVybiB0aGlzIGludG8gYSBtYXRyaXgNCg0KdG9wbWFwPC1tYXRyaXgoMCxucm93PWxlbmd0aChpbnB1dCksbmNvbD1uY2hhcihpbnB1dFsxXSkpDQpmb3IoaSBpbiAxOmxlbmd0aChpbnB1dCkpe3RvcG1hcFtpLF08LWFzLm51bWVyaWModW5saXN0KHN0cl9zcGxpdChpbnB1dFtpXSwiIikpKX0NCmBgYA0KDQoNCiMjIFBhcnQgMQ0KRmlyc3QsIGZpbmQgYWxsIG9mIHRoZSB6ZXJvcw0KDQpgYGB7cn0NCnplcm9zPC13aGljaCh0b3BtYXA9PTAsYXJyLmluZD1UUlVFKQ0KYGBgDQoNCkZ1bmN0aW9uIHRoYXQgZmluZHMgYWxsIG9mIHRoZSB0cmFpbGhlYWRzIGZvciBhIHplcm8gKHgseSkNCg0KYGBge3J9DQpjb3VudHRyYWlsaGVhZHM8LWZ1bmN0aW9uKHRtLHplcm8pew0KICAjIyMgY3JlYXRlIHRoZSBxdWV1ZSAmIHRoZSBkaWN0aW9uYXJ5DQogIHE8LXF1ZXVlKCkNCiAgYmVlbnRoZXJlPC1kaWN0KCkNCiAgczwtYygwLHplcm9bMV0semVyb1syXSkNCiAgcSRwdXNoKHMpDQogIG1heHJvd3M8LW5yb3codG0pDQogIG1heGNvbHM8LW5jb2wodG0pDQogIHRyYWlsaGVhZHM8LTANCiAgd2hpbGUocSRzaXplKCk+MCl7DQogICAgczwtcSRwb3AoKQ0KICAgICMjIyBpZiBiZWVuIHRoZXJlLCBzdG9wDQogICAgaWYoYmVlbnRoZXJlJGhhcyhzdHJfYyhjKHNbMl0sc1szXSksY29sbGFwc2U9In4iKSkpew0KICAgICAgbmV4dH1lbHNle2JlZW50aGVyZSRzZXQoc3RyX2MoYyhzWzJdLHNbM10pLGNvbGxhcHNlPSJ+Iiksc1sxXSl9DQogICAgaWYoc1sxXT09OSl7DQogICAgICB0cmFpbGhlYWRzPC10cmFpbGhlYWRzKzENCiAgICAgIG5leHR9DQogICAgIyMjIHRyeSBpbiBlYWNoIGRpcmVjdGlvbg0KICAgIGlmKHNbMl08bWF4Y29scyl7DQogICAgICBpZih0bVtzWzNdLChzWzJdKzEpXT09c1sxXSsxKXtxJHB1c2goYyhzWzFdKzEsc1syXSsxLHNbM10pKX19DQogICAgaWYoc1syXT4xKXsNCiAgICAgIGlmKHRtW3NbM10sKHNbMl0tMSldPT1zWzFdKzEpe3EkcHVzaChjKHNbMV0rMSxzWzJdLTEsc1szXSkpfX0NCiAgICBpZihzWzNdPG1heHJvd3Mpew0KICAgICAgaWYodG1bKHNbM10rMSksc1syXV09PXNbMV0rMSl7cSRwdXNoKGMoc1sxXSsxLHNbMl0sc1szXSsxKSl9fQ0KICAgIGlmKHNbM10+MSl7DQogICAgICBpZih0bVsoc1szXS0xKSxzWzJdXT09c1sxXSsxKXtxJHB1c2goYyhzWzFdKzEsc1syXSxzWzNdLTEpKX19fQ0KICB0cmFpbGhlYWRzfQ0KYGBgDQoNCg0KYGBge3J9DQpwMTwtc2FwcGx5KDE6bnJvdyh6ZXJvcyksDQogICAgICAgICAgIGZ1bmN0aW9uKHgpew0KICAgICAgICAgICAgIGNvdW50dHJhaWxoZWFkcyh0b3BtYXAsYyh6ZXJvc1t4LDJdLHplcm9zW3gsMV0pKX0pDQpwYXJ0MTwtc3VtKHAxKQ0KcGFydDENCg0KYGBgDQojIyBQYXJ0IDINCklmIEkgdW5kZXJzdGFuZCB0aGlzIGNvcnJlY3RseSwgSXQncyB0aGUgc2FtZSwganVzdCBkb24ndCBjaGVjayB0byBzZWUgaWYgdGhhdCBwYXRoIGhhcyBhbHJlYWR5IGJlZW4gdHJhdmVyc2VkPyAgU28ganVzdCByZW1vdmUgdGhlIGxpbmVzIHRoYXQgY2hlY2sgdG8gc2VlIGlmIHRoYXQgcG9pbnQgaGFzIGFscmVhZHkgYmVlbiB0aGVyZS4NCg0KDQpgYGB7cn0NCnJhdGluZ2NoZWNrPC1mdW5jdGlvbih0bSx6ZXJvKXsNCiAgIyMjIGNyZWF0ZSB0aGUgcXVldWUgJiB0aGUgZGljdGlvbmFyeQ0KICBxPC1xdWV1ZSgpDQogIHM8LWMoMCx6ZXJvWzFdLHplcm9bMl0pDQogIHEkcHVzaChzKQ0KICBtYXhyb3dzPC1ucm93KHRtKQ0KICBtYXhjb2xzPC1uY29sKHRtKQ0KICB0cmFpbGhlYWRzPC0wDQogIHdoaWxlKHEkc2l6ZSgpPjApew0KICAgIHM8LXEkcG9wKCkNCiAgICBpZihzWzFdPT05KXsNCiAgICAgIHRyYWlsaGVhZHM8LXRyYWlsaGVhZHMrMQ0KICAgICAgbmV4dH0NCiAgICAjIyMgdHJ5IGluIGVhY2ggZGlyZWN0aW9uDQogICAgaWYoc1syXTxtYXhjb2xzKXsNCiAgICAgIGlmKHRtW3NbM10sKHNbMl0rMSldPT1zWzFdKzEpe3EkcHVzaChjKHNbMV0rMSxzWzJdKzEsc1szXSkpfX0NCiAgICBpZihzWzJdPjEpew0KICAgICAgaWYodG1bc1szXSwoc1syXS0xKV09PXNbMV0rMSl7cSRwdXNoKGMoc1sxXSsxLHNbMl0tMSxzWzNdKSl9fQ0KICAgIGlmKHNbM108bWF4cm93cyl7DQogICAgICBpZih0bVsoc1szXSsxKSxzWzJdXT09c1sxXSsxKXtxJHB1c2goYyhzWzFdKzEsc1syXSxzWzNdKzEpKX19DQogICAgaWYoc1szXT4xKXsNCiAgICAgIGlmKHRtWyhzWzNdLTEpLHNbMl1dPT1zWzFdKzEpe3EkcHVzaChjKHNbMV0rMSxzWzJdLHNbM10tMSkpfX19DQogIHRyYWlsaGVhZHN9DQpgYGANCg0KDQoNCmBgYHtyfQ0KcDI8LXNhcHBseSgxOm5yb3coemVyb3MpLA0KICAgICAgICAgICBmdW5jdGlvbih4KXsNCiAgICAgICAgICAgICByYXRpbmdjaGVjayh0b3BtYXAsYyh6ZXJvc1t4LDJdLHplcm9zW3gsMV0pKX0pDQpwYXJ0Mjwtc3VtKHAyKQ0KcGFydDINCg0KYGBgIA==