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