input<-read_lines("Day9Sample.txt")

### turn the input into a vector
diskmap<-sapply(str_split(input, ""),as.numeric)

Part 1

I did not think this would work by putting it into a new vector, that was supposed to be a temporary measure for testing so that I could see that I was moving ids right. But it did work, and not all that terribly slowly. So… there

Started with the frontid (0), then final id (length div 2). Then worked my way through the diskmap. On odds, add that number of ids to the compactmap. On evens, find out how many blanks there are to fill. Then decrement the number at the tail end to fill all of those blanks. Stop working on the evens if it has reached the frontid

reformattovector<-function(dm){
  ### find out the final id & its value
  finid<-c(length(dm)%/%2)
  ### start from 0
  frontid<-0
  ###
  compactmap<-c()
  ### start counting down
  i<-1
  ### while i les than the length of the map
  while(i<=length(dm)){
    ### if i is odd, start from the front of the map
    if(i%%2==1){
      compactmap<-c(compactmap,rep(frontid,dm[i]))
      ### update the frontid
      frontid<-frontid+1
    }else{
      ### if i is even
      blanks<-dm[i]
      ### so long as there's at least one blank space to fill and it hasn't matched up with the front id yet
      while(blanks>0&&finid>frontid){
        ### check to see if there are any more of the final id. If so, decrement the count of final and fill one of the blanks
        if(tail(dm,1)>0){
          compactmap<-c(compactmap,finid)
          dm[length(dm)]<-dm[length(dm)]-1
          blanks<-blanks-1
          ## if not, remove the final two elements of the map
        }else{
          dm<-dm[-c(length(dm),length(dm)-1)]
          ### update the finalid
          finid<-finid-1}}}
  i<-i+1}
### find the checksum by multiplying the compactmap vector by the 0:length-1
checksum<-sum(compactmap*(0:(length(compactmap)-1)))
checksum}
part1<-reformattovector(diskmap)
part1
[1] 1928

Part 2

This is insane - and very much not the right way to do this (I think a double ended queue? maybe? but I don’t want to figure that out right now), but it is a working way to do this - so… there?

List out the ids and how many there are, list out all of the blank spaces, and work back to front through the ids, filling up the blank spaces from front to back. Once it is clear where all the ids go, find the checksum

recompact<-function(dm){
  #### create 3 different dataframes:
  ### df1 is id, count, starting number
  originalpos<-data.frame(matrix(ncol=3,nrow=0))
  colnames(originalpos)<-c("id","count","startspace")
  ### df2 is for freespace - count & starting number
  freespace<-data.frame(matrix(ncol=2,nrow=0))
  colnames(freespace)<-c("count","startspace")
  ### df3 is target endspace id, count, starting number
  target<-data.frame(matrix(ncol=3,nrow=0))
  colnames(target)<-c("id","count","startspace")
  
  ### start by going through the map and adding info to the the first two dfs
  nextstart<-0
  for(i in 1:length(dm)){
    ### if odd (a file)
    if(i%%2==1){
      originalpos<-rbind(originalpos,c(id=(i-1)/2,count=dm[i],startspace=nextstart))
      ### if even (freespace)
    }else{
      freespace<-rbind(freespace,c(count=dm[i],nextstart))}
    nextstart<-nextstart+dm[i]}
  colnames(originalpos)<-c("id","count","startspace")
  colnames(freespace)<-c("count","startspace")
  ### filter out freespaces that are 0
  freespace <- freespace %>% filter(count>0)
  
  ### then starting from the bottom of the originalpos
   for(i in nrow(originalpos):1){
     op<-originalpos[i,]
     ### filter out any free spaces to the right and any free spaces that are 0
     freespace<-freespace %>% filter(startspace<=op$startspace,count>=1)
     ### find the first freespace that is big enough for the space
     ### that also comes before the current space
     fs<-which(freespace$count>=op$count)
     ### if there is a place for the file to go
     if(length(fs)>0){
       fs<-fs[1]
       ### use that as the new startspace
       op$startspace<-freespace$startspace[fs]
       ### update freespace
       freespace$startspace[fs]<-freespace$startspace[fs]+op$count
       freespace$count[fs]<-freespace$count[fs]-op$count}
     ### put op into the target list
     target<-rbind(target,op)}
  
  ### finally, take the targets and use those to calculate the checksum:
  target<-target %>% rowwise %>% mutate(checksum=csfind(id,startspace,count))
  
  sum(target$checksum)}


### finds the checksum given id, start, count
csfind<-function(id,s,c){
  cs<-0
  for(j in 1:c){
    cs<-cs+id*s
    s<-s+1}
  cs}
part2<-recompact(diskmap)
part2
[1] 2858
LS0tDQp0aXRsZTogIkRheSA5IE5vdGVib29rIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQpsaWJyYXJ5KHJlc2hhcGUyKQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHN0cmluZ3IpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KGNvbGxlY3Rpb25zKQ0Kb3B0aW9ucyhzY2lwZW4gPSA5OTkpDQpgYGANCg0KYGBge3J9DQppbnB1dDwtcmVhZF9saW5lcygiRGF5OVNhbXBsZS50eHQiKQ0KDQojIyMgdHVybiB0aGUgaW5wdXQgaW50byBhIHZlY3Rvcg0KZGlza21hcDwtc2FwcGx5KHN0cl9zcGxpdChpbnB1dCwgIiIpLGFzLm51bWVyaWMpDQpgYGANCg0KIyMgUGFydCAxDQoNCkkgZGlkIG5vdCB0aGluayB0aGlzIHdvdWxkIHdvcmsgYnkgcHV0dGluZyBpdCBpbnRvIGEgbmV3IHZlY3RvciwgdGhhdCB3YXMgc3VwcG9zZWQgdG8gYmUgYSB0ZW1wb3JhcnkgbWVhc3VyZSBmb3IgdGVzdGluZyBzbyB0aGF0IEkgY291bGQgc2VlIHRoYXQgSSB3YXMgbW92aW5nIGlkcyByaWdodC4gIEJ1dCBpdCAqZGlkKiB3b3JrLCBhbmQgbm90IGFsbCB0aGF0IHRlcnJpYmx5IHNsb3dseS4gIFNvLi4uIHRoZXJlDQoNClN0YXJ0ZWQgd2l0aCB0aGUgZnJvbnRpZCAoMCksIHRoZW4gZmluYWwgaWQgKGxlbmd0aCBkaXYgMikuICBUaGVuIHdvcmtlZCBteSB3YXkgdGhyb3VnaCB0aGUgZGlza21hcC4NCk9uIG9kZHMsIGFkZCB0aGF0IG51bWJlciBvZiBpZHMgdG8gdGhlIGNvbXBhY3RtYXAuICBPbiBldmVucywgZmluZCBvdXQgaG93IG1hbnkgYmxhbmtzIHRoZXJlIGFyZSB0byBmaWxsLiBUaGVuIGRlY3JlbWVudCB0aGUgbnVtYmVyIGF0IHRoZSB0YWlsIGVuZCB0byBmaWxsIGFsbCBvZiB0aG9zZSBibGFua3MuICBTdG9wIHdvcmtpbmcgb24gdGhlIGV2ZW5zIGlmIGl0IGhhcyByZWFjaGVkIHRoZSBmcm9udGlkICAgDQoNCmBgYHtyfQ0KcmVmb3JtYXR0b3ZlY3RvcjwtZnVuY3Rpb24oZG0pew0KICAjIyMgZmluZCBvdXQgdGhlIGZpbmFsIGlkICYgaXRzIHZhbHVlDQogIGZpbmlkPC1jKGxlbmd0aChkbSklLyUyKQ0KICAjIyMgc3RhcnQgZnJvbSAwDQogIGZyb250aWQ8LTANCiAgIyMjDQogIGNvbXBhY3RtYXA8LWMoKQ0KICAjIyMgc3RhcnQgY291bnRpbmcgZG93bg0KICBpPC0xDQogICMjIyB3aGlsZSBpIGxlcyB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIG1hcA0KICB3aGlsZShpPD1sZW5ndGgoZG0pKXsNCiAgICAjIyMgaWYgaSBpcyBvZGQsIHN0YXJ0IGZyb20gdGhlIGZyb250IG9mIHRoZSBtYXANCiAgICBpZihpJSUyPT0xKXsNCiAgICAgIGNvbXBhY3RtYXA8LWMoY29tcGFjdG1hcCxyZXAoZnJvbnRpZCxkbVtpXSkpDQogICAgICAjIyMgdXBkYXRlIHRoZSBmcm9udGlkDQogICAgICBmcm9udGlkPC1mcm9udGlkKzENCiAgICB9ZWxzZXsNCiAgICAgICMjIyBpZiBpIGlzIGV2ZW4NCiAgICAgIGJsYW5rczwtZG1baV0NCiAgICAgICMjIyBzbyBsb25nIGFzIHRoZXJlJ3MgYXQgbGVhc3Qgb25lIGJsYW5rIHNwYWNlIHRvIGZpbGwgYW5kIGl0IGhhc24ndCBtYXRjaGVkIHVwIHdpdGggdGhlIGZyb250IGlkIHlldA0KICAgICAgd2hpbGUoYmxhbmtzPjAmJmZpbmlkPmZyb250aWQpew0KICAgICAgICAjIyMgY2hlY2sgdG8gc2VlIGlmIHRoZXJlIGFyZSBhbnkgbW9yZSBvZiB0aGUgZmluYWwgaWQuIElmIHNvLCBkZWNyZW1lbnQgdGhlIGNvdW50IG9mIGZpbmFsIGFuZCBmaWxsIG9uZSBvZiB0aGUgYmxhbmtzDQogICAgICAgIGlmKHRhaWwoZG0sMSk+MCl7DQogICAgICAgICAgY29tcGFjdG1hcDwtYyhjb21wYWN0bWFwLGZpbmlkKQ0KICAgICAgICAgIGRtW2xlbmd0aChkbSldPC1kbVtsZW5ndGgoZG0pXS0xDQogICAgICAgICAgYmxhbmtzPC1ibGFua3MtMQ0KICAgICAgICAgICMjIGlmIG5vdCwgcmVtb3ZlIHRoZSBmaW5hbCB0d28gZWxlbWVudHMgb2YgdGhlIG1hcA0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICBkbTwtZG1bLWMobGVuZ3RoKGRtKSxsZW5ndGgoZG0pLTEpXQ0KICAgICAgICAgICMjIyB1cGRhdGUgdGhlIGZpbmFsaWQNCiAgICAgICAgICBmaW5pZDwtZmluaWQtMX19fQ0KICBpPC1pKzF9DQojIyMgZmluZCB0aGUgY2hlY2tzdW0gYnkgbXVsdGlwbHlpbmcgdGhlIGNvbXBhY3RtYXAgdmVjdG9yIGJ5IHRoZSAwOmxlbmd0aC0xDQpjaGVja3N1bTwtc3VtKGNvbXBhY3RtYXAqKDA6KGxlbmd0aChjb21wYWN0bWFwKS0xKSkpDQpjaGVja3N1bX0NCg0KYGBgDQoNCg0KYGBge3J9DQpwYXJ0MTwtcmVmb3JtYXR0b3ZlY3RvcihkaXNrbWFwKQ0KcGFydDENCmBgYA0KDQojIyBQYXJ0IDINCg0KVGhpcyBpcyBpbnNhbmUgLSBhbmQgdmVyeSBtdWNoIG5vdCB0aGUgcmlnaHQgd2F5IHRvIGRvIHRoaXMgKEkgdGhpbmsgYSBkb3VibGUgZW5kZWQgcXVldWU/IG1heWJlPyBidXQgSSBkb24ndCB3YW50IHRvIGZpZ3VyZSB0aGF0IG91dCByaWdodCBub3cpLCBidXQgaXQgaXMgYSB3b3JraW5nIHdheSB0byBkbyB0aGlzIC0gc28uLi4gdGhlcmU/DQoNCkxpc3Qgb3V0IHRoZSBpZHMgYW5kIGhvdyBtYW55IHRoZXJlIGFyZSwgbGlzdCBvdXQgYWxsIG9mIHRoZSBibGFuayBzcGFjZXMsIGFuZCB3b3JrIGJhY2sgdG8gZnJvbnQgdGhyb3VnaCB0aGUgaWRzLCBmaWxsaW5nIHVwIHRoZSBibGFuayBzcGFjZXMgZnJvbSBmcm9udCB0byBiYWNrLg0KT25jZSBpdCBpcyBjbGVhciB3aGVyZSBhbGwgdGhlIGlkcyBnbywgZmluZCB0aGUgY2hlY2tzdW0NCg0KDQpgYGB7cn0NCnJlY29tcGFjdDwtZnVuY3Rpb24oZG0pew0KICAjIyMjIGNyZWF0ZSAzIGRpZmZlcmVudCBkYXRhZnJhbWVzOg0KICAjIyMgZGYxIGlzIGlkLCBjb3VudCwgc3RhcnRpbmcgbnVtYmVyDQogIG9yaWdpbmFscG9zPC1kYXRhLmZyYW1lKG1hdHJpeChuY29sPTMsbnJvdz0wKSkNCiAgY29sbmFtZXMob3JpZ2luYWxwb3MpPC1jKCJpZCIsImNvdW50Iiwic3RhcnRzcGFjZSIpDQogICMjIyBkZjIgaXMgZm9yIGZyZWVzcGFjZSAtIGNvdW50ICYgc3RhcnRpbmcgbnVtYmVyDQogIGZyZWVzcGFjZTwtZGF0YS5mcmFtZShtYXRyaXgobmNvbD0yLG5yb3c9MCkpDQogIGNvbG5hbWVzKGZyZWVzcGFjZSk8LWMoImNvdW50Iiwic3RhcnRzcGFjZSIpDQogICMjIyBkZjMgaXMgdGFyZ2V0IGVuZHNwYWNlIGlkLCBjb3VudCwgc3RhcnRpbmcgbnVtYmVyDQogIHRhcmdldDwtZGF0YS5mcmFtZShtYXRyaXgobmNvbD0zLG5yb3c9MCkpDQogIGNvbG5hbWVzKHRhcmdldCk8LWMoImlkIiwiY291bnQiLCJzdGFydHNwYWNlIikNCiAgDQogICMjIyBzdGFydCBieSBnb2luZyB0aHJvdWdoIHRoZSBtYXAgYW5kIGFkZGluZyBpbmZvIHRvIHRoZSB0aGUgZmlyc3QgdHdvIGRmcw0KICBuZXh0c3RhcnQ8LTANCiAgZm9yKGkgaW4gMTpsZW5ndGgoZG0pKXsNCiAgICAjIyMgaWYgb2RkIChhIGZpbGUpDQogICAgaWYoaSUlMj09MSl7DQogICAgICBvcmlnaW5hbHBvczwtcmJpbmQob3JpZ2luYWxwb3MsYyhpZD0oaS0xKS8yLGNvdW50PWRtW2ldLHN0YXJ0c3BhY2U9bmV4dHN0YXJ0KSkNCiAgICAgICMjIyBpZiBldmVuIChmcmVlc3BhY2UpDQogICAgfWVsc2V7DQogICAgICBmcmVlc3BhY2U8LXJiaW5kKGZyZWVzcGFjZSxjKGNvdW50PWRtW2ldLG5leHRzdGFydCkpfQ0KICAgIG5leHRzdGFydDwtbmV4dHN0YXJ0K2RtW2ldfQ0KICBjb2xuYW1lcyhvcmlnaW5hbHBvcyk8LWMoImlkIiwiY291bnQiLCJzdGFydHNwYWNlIikNCiAgY29sbmFtZXMoZnJlZXNwYWNlKTwtYygiY291bnQiLCJzdGFydHNwYWNlIikNCiAgIyMjIGZpbHRlciBvdXQgZnJlZXNwYWNlcyB0aGF0IGFyZSAwDQogIGZyZWVzcGFjZSA8LSBmcmVlc3BhY2UgJT4lIGZpbHRlcihjb3VudD4wKQ0KICANCiAgIyMjIHRoZW4gc3RhcnRpbmcgZnJvbSB0aGUgYm90dG9tIG9mIHRoZSBvcmlnaW5hbHBvcw0KICAgZm9yKGkgaW4gbnJvdyhvcmlnaW5hbHBvcyk6MSl7DQogICAgIG9wPC1vcmlnaW5hbHBvc1tpLF0NCiAgICAgIyMjIGZpbHRlciBvdXQgYW55IGZyZWUgc3BhY2VzIHRvIHRoZSByaWdodCBhbmQgYW55IGZyZWUgc3BhY2VzIHRoYXQgYXJlIDANCiAgICAgZnJlZXNwYWNlPC1mcmVlc3BhY2UgJT4lIGZpbHRlcihzdGFydHNwYWNlPD1vcCRzdGFydHNwYWNlLGNvdW50Pj0xKQ0KICAgICAjIyMgZmluZCB0aGUgZmlyc3QgZnJlZXNwYWNlIHRoYXQgaXMgYmlnIGVub3VnaCBmb3IgdGhlIHNwYWNlDQogICAgICMjIyB0aGF0IGFsc28gY29tZXMgYmVmb3JlIHRoZSBjdXJyZW50IHNwYWNlDQogICAgIGZzPC13aGljaChmcmVlc3BhY2UkY291bnQ+PW9wJGNvdW50KQ0KICAgICAjIyMgaWYgdGhlcmUgaXMgYSBwbGFjZSBmb3IgdGhlIGZpbGUgdG8gZ28NCiAgICAgaWYobGVuZ3RoKGZzKT4wKXsNCiAgICAgICBmczwtZnNbMV0NCiAgICAgICAjIyMgdXNlIHRoYXQgYXMgdGhlIG5ldyBzdGFydHNwYWNlDQogICAgICAgb3Akc3RhcnRzcGFjZTwtZnJlZXNwYWNlJHN0YXJ0c3BhY2VbZnNdDQogICAgICAgIyMjIHVwZGF0ZSBmcmVlc3BhY2UNCiAgICAgICBmcmVlc3BhY2Ukc3RhcnRzcGFjZVtmc108LWZyZWVzcGFjZSRzdGFydHNwYWNlW2ZzXStvcCRjb3VudA0KICAgICAgIGZyZWVzcGFjZSRjb3VudFtmc108LWZyZWVzcGFjZSRjb3VudFtmc10tb3AkY291bnR9DQogICAgICMjIyBwdXQgb3AgaW50byB0aGUgdGFyZ2V0IGxpc3QNCiAgICAgdGFyZ2V0PC1yYmluZCh0YXJnZXQsb3ApfQ0KICANCiAgIyMjIGZpbmFsbHksIHRha2UgdGhlIHRhcmdldHMgYW5kIHVzZSB0aG9zZSB0byBjYWxjdWxhdGUgdGhlIGNoZWNrc3VtOg0KICB0YXJnZXQ8LXRhcmdldCAlPiUgcm93d2lzZSAlPiUgbXV0YXRlKGNoZWNrc3VtPWNzZmluZChpZCxzdGFydHNwYWNlLGNvdW50KSkNCiAgDQogIHN1bSh0YXJnZXQkY2hlY2tzdW0pfQ0KDQoNCiMjIyBmaW5kcyB0aGUgY2hlY2tzdW0gZ2l2ZW4gaWQsIHN0YXJ0LCBjb3VudA0KY3NmaW5kPC1mdW5jdGlvbihpZCxzLGMpew0KICBjczwtMA0KICBmb3IoaiBpbiAxOmMpew0KICAgIGNzPC1jcytpZCpzDQogICAgczwtcysxfQ0KICBjc30NCg0KDQoNCmBgYA0KDQpgYGB7cn0NCnBhcnQyPC1yZWNvbXBhY3QoZGlza21hcCkNCnBhcnQyDQpgYGA=