input<-read_lines("Day2Sample.txt")
idranges<-as_vector(str_split(input,","))
Part 1
Takes in a range, gives out the number of repeated numbers
finddoubles<-function(r){
curr<-as.numeric(str_split_i(r,"-",i = 1))
counter<-0
upper<-as.numeric(str_split_i(r,"-",2))
while(curr<=upper){
### find out how many digits - if odd, go to next 1010 or 100100, etc.
evendigits<-floor(log10(curr))
if(evendigits%%2==0){
curr<-10^(evendigits+1)+10^(evendigits/2)
next}
### otherwise, split into two halves (which can be done, because there's an even number of digits)
### find the smallest valid value >= current.
### then add 1 to the first half and keep going up until it hits the upper limit.
### there is a lot of redundancy in this loop.
ed2<-(evendigits+1)/2
ed2<-10^ed2
fronthalf<-curr%/%ed2
backhalf<-curr%%ed2
if(fronthalf>backhalf){
curr<-fronthalf*ed2+fronthalf
}else if(backhalf>fronthalf){
curr<-((fronthalf+1)*ed2)+fronthalf+1
}else{
counter<-counter+curr
curr<-((fronthalf+1)*ed2)+fronthalf+1}}
counter}
Takes in all of the ranges and returns the sum of all of the ids
add_all_ids<-function(rns){
allids<-sum(sapply(rns,finddoubles))
allids}
add_all_ids(idranges)
[1] 1227775554
Part 2
I saw it coming. I just had a feeling that this was going to be part
2. And yet, I did nothing to prepare for it in advance. I can’t think of
any way to not check every number.
This tells me if a number is a repeater.
isrepeater<-function(n){
#comparing strings. this is non-optimal, but it does work.
n<-as.character(n)
l<-nchar(n)
for(i in 1:(l/2)){
### if this won't go evenly in, don't bother.
if(l%%i!=0){next}
a<-str_sub(n,1,i)
a<-str_flatten(rep(a,l/i))
if(a==n){return(TRUE)}}
FALSE}
reprange<-function(r){
repeaters<-c()
### ignore 1 digit numbers
lower<-max(as.numeric(str_split_i(r,"-",1)),11)
upper<-as.numeric(str_split_i(r,"-",2))
if(upper>=lower){
for(i in lower:upper){
if(isrepeater(i)){repeaters<-c(repeaters,i)}}}
repeaters}
findallrepeaters<-function(rs){
allreps<-sum(unname(unlist(sapply(rs,reprange))))
allreps}
findallrepeaters(idranges)
[1] 4174379265
LS0tDQp0aXRsZTogIkRheSAyIE5vdGVib29rIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQpsaWJyYXJ5KGlncmFwaCkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkocmdsKQ0KbGlicmFyeShnZ3JhcGgpDQpsaWJyYXJ5KHJlc2hhcGUyKQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHN0cmluZ3IpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KGNvbGxlY3Rpb25zKQ0Kb3B0aW9ucyhzY2lwZW4gPSA5OTkpDQpgYGANCg0KYGBge3J9DQppbnB1dDwtcmVhZF9saW5lcygiRGF5MlNhbXBsZS50eHQiKQ0KDQppZHJhbmdlczwtYXNfdmVjdG9yKHN0cl9zcGxpdChpbnB1dCwiLCIpKQ0KYGBgDQoNClBhcnQgMQ0KDQpUYWtlcyBpbiBhIHJhbmdlLCBnaXZlcyBvdXQgdGhlIG51bWJlciBvZiByZXBlYXRlZCBudW1iZXJzDQpgYGB7cn0NCmZpbmRkb3VibGVzPC1mdW5jdGlvbihyKXsNCiAgY3VycjwtYXMubnVtZXJpYyhzdHJfc3BsaXRfaShyLCItIixpID0gMSkpDQogIGNvdW50ZXI8LTANCiAgdXBwZXI8LWFzLm51bWVyaWMoc3RyX3NwbGl0X2kociwiLSIsMikpDQogIHdoaWxlKGN1cnI8PXVwcGVyKXsNCiAgICAjIyMgZmluZCBvdXQgaG93IG1hbnkgZGlnaXRzIC0gaWYgb2RkLCBnbyB0byBuZXh0IDEwMTAgb3IgMTAwMTAwLCBldGMuDQogICAgZXZlbmRpZ2l0czwtZmxvb3IobG9nMTAoY3VycikpDQogICAgaWYoZXZlbmRpZ2l0cyUlMj09MCl7DQogICAgICBjdXJyPC0xMF4oZXZlbmRpZ2l0cysxKSsxMF4oZXZlbmRpZ2l0cy8yKQ0KICAgICAgbmV4dH0NCiAgICAjIyMgb3RoZXJ3aXNlLCBzcGxpdCBpbnRvIHR3byBoYWx2ZXMgKHdoaWNoIGNhbiBiZSBkb25lLCBiZWNhdXNlIHRoZXJlJ3MgYW4gZXZlbiBudW1iZXIgb2YgZGlnaXRzKQ0KICAgICMjIyBmaW5kIHRoZSBzbWFsbGVzdCB2YWxpZCB2YWx1ZSA+PSBjdXJyZW50Lg0KICAgICMjIyB0aGVuIGFkZCAxIHRvIHRoZSBmaXJzdCBoYWxmIGFuZCBrZWVwIGdvaW5nIHVwIHVudGlsIGl0IGhpdHMgdGhlIHVwcGVyIGxpbWl0Lg0KICAgICMjIyB0aGVyZSBpcyBhIGxvdCBvZiByZWR1bmRhbmN5IGluIHRoaXMgbG9vcC4NCiAgICBlZDI8LShldmVuZGlnaXRzKzEpLzINCiAgICBlZDI8LTEwXmVkMg0KICAgIGZyb250aGFsZjwtY3VyciUvJWVkMg0KICAgIGJhY2toYWxmPC1jdXJyJSVlZDINCiAgICBpZihmcm9udGhhbGY+YmFja2hhbGYpew0KICAgICAgY3VycjwtZnJvbnRoYWxmKmVkMitmcm9udGhhbGYNCiAgICB9ZWxzZSBpZihiYWNraGFsZj5mcm9udGhhbGYpew0KICAgICAgY3VycjwtKChmcm9udGhhbGYrMSkqZWQyKStmcm9udGhhbGYrMQ0KICAgIH1lbHNlew0KICAgICAgY291bnRlcjwtY291bnRlcitjdXJyDQogICAgICBjdXJyPC0oKGZyb250aGFsZisxKSplZDIpK2Zyb250aGFsZisxfX0NCiAgICBjb3VudGVyfQ0KYGBgDQoNCg0KVGFrZXMgaW4gYWxsIG9mIHRoZSByYW5nZXMgYW5kIHJldHVybnMgdGhlIHN1bSBvZiBhbGwgb2YgdGhlIGlkcw0KYGBge3J9DQphZGRfYWxsX2lkczwtZnVuY3Rpb24ocm5zKXsNCiAgYWxsaWRzPC1zdW0oc2FwcGx5KHJucyxmaW5kZG91YmxlcykpDQogIGFsbGlkc30NCg0KYWRkX2FsbF9pZHMoaWRyYW5nZXMpDQpgYGANClBhcnQgMiANCg0KSSBzYXcgaXQgY29taW5nLiAgSSBqdXN0IGhhZCBhIGZlZWxpbmcgdGhhdCB0aGlzIHdhcyBnb2luZyB0byBiZSBwYXJ0IDIuIEFuZCB5ZXQsIEkgZGlkIG5vdGhpbmcgdG8gcHJlcGFyZSBmb3IgaXQgaW4gYWR2YW5jZS4NCkkgY2FuJ3QgdGhpbmsgb2YgYW55IHdheSB0byBub3QgY2hlY2sgZXZlcnkgbnVtYmVyLg0KDQpUaGlzIHRlbGxzIG1lIGlmIGEgbnVtYmVyIGlzIGEgcmVwZWF0ZXIuDQpgYGB7cn0NCmlzcmVwZWF0ZXI8LWZ1bmN0aW9uKG4pew0KICAjY29tcGFyaW5nIHN0cmluZ3MuIHRoaXMgaXMgbm9uLW9wdGltYWwsIGJ1dCBpdCBkb2VzIHdvcmsuDQogIG48LWFzLmNoYXJhY3RlcihuKQ0KICBsPC1uY2hhcihuKQ0KICBmb3IoaSBpbiAxOihsLzIpKXsNCiAgICAjIyMgaWYgdGhpcyB3b24ndCBnbyBldmVubHkgaW4sIGRvbid0IGJvdGhlci4NCiAgICBpZihsJSVpIT0wKXtuZXh0fQ0KICAgIGE8LXN0cl9zdWIobiwxLGkpDQogICAgYTwtc3RyX2ZsYXR0ZW4ocmVwKGEsbC9pKSkNCiAgICBpZihhPT1uKXtyZXR1cm4oVFJVRSl9fQ0KICBGQUxTRX0NCmBgYA0KDQpgYGB7cn0NCnJlcHJhbmdlPC1mdW5jdGlvbihyKXsNCiAgcmVwZWF0ZXJzPC1jKCkNCiAgIyMjIGlnbm9yZSAxIGRpZ2l0IG51bWJlcnMNCiAgbG93ZXI8LW1heChhcy5udW1lcmljKHN0cl9zcGxpdF9pKHIsIi0iLDEpKSwxMSkNCiAgdXBwZXI8LWFzLm51bWVyaWMoc3RyX3NwbGl0X2kociwiLSIsMikpDQogIGlmKHVwcGVyPj1sb3dlcil7DQogICAgZm9yKGkgaW4gbG93ZXI6dXBwZXIpew0KICAgICAgaWYoaXNyZXBlYXRlcihpKSl7cmVwZWF0ZXJzPC1jKHJlcGVhdGVycyxpKX19fQ0KICByZXBlYXRlcnN9DQpgYGANCg0KDQpgYGB7cn0NCmZpbmRhbGxyZXBlYXRlcnM8LWZ1bmN0aW9uKHJzKXsNCiAgYWxscmVwczwtc3VtKHVubmFtZSh1bmxpc3Qoc2FwcGx5KHJzLHJlcHJhbmdlKSkpKQ0KICBhbGxyZXBzfQ0KYGBgDQoNCmBgYHtyfQ0KZmluZGFsbHJlcGVhdGVycyhpZHJhbmdlcykNCmBgYA0K