Advent of Code 2019-03 with R & JavaScript

2 minute(s) read

Solving Advent of Code 2019-03 with R and JavaScript.

[Disclaimer] Obviously, this post contains a big spoiler about Advent of Code, as it gives solutions for solving day 3.

[Disclaimer bis] I’m no JavaScript expert so this might not be the perfect solution. TBH, that’s also the case for the R solution.

About the JavaScript code

The JavaScript code has been written in the same RMarkdown as the R code. It runs thanks to the {bubble} package: https://github.com/ColinFay/bubble

Instructions

Find the instructions at: https://adventofcode.com/2019/day/3

R solution

Part one

library(magrittr)
ipt <- scan( "input3.txt", what = character(), sep = "\n")
first <- strsplit(ipt[1], split = ",")[[1]]
sec <- strsplit(ipt[2], split = ",")[[1]]

directions <- function(ipt, x, y){
  dir <- substr(ipt, 1, 1)
  how_m <- as.numeric(substr(ipt, 2, nchar(ipt)))
  if (dir == "R"){
    x <- x + how_m
  } else if (dir == "L"){
    x <- x - how_m
  } else if (dir == "U"){
    y <- y + how_m
  } else if (dir == "D"){
    y <- y - how_m
  }
  return(list(x = x, y = y))
}

get_dir <- function(vec){
  out <- data.frame(
    x = 0,
    y = 0
  )
  for (i in seq_along(vec)){
    y_m_1 <- out$y[nrow(out)]
    x_m_1 <- out$x[nrow(out)]
    res <- directions(vec[i], x = x_m_1, y = y_m_1)
    out %<>% rbind(
      data.frame(
        x = x_m_1:res$x,
        y = y_m_1:res$y
      )[-1, ]
    )
  }
  out$step <- 1:nrow(out)
  out
}

out_a <- get_dir(first)
out_b <- get_dir(sec)

res <- merge(out_a, out_b, by = c("x", "y"))
res$path <- abs(res$x) + abs(res$y)
sort(unique(res$path))[2]
## [1] 386

Part two

res$tot_step <- res$step.x + res$step.y
sort(unique(res$tot_step))[2]
## [1] 6486

JS solution

Sorry today I didn’t have time to work on the JS solution… Finding the R solution was already quite a challenge :)

Here is the beginning of a code to solve the problem. Might get back to it later!

Part one & Two

var res = fs.readFileSync("input3.txt", 'utf8').split("\n").filter(x => x.length != 0);
var first = res[0].split(",").filter(x => x.length != 0);
var sec = res[1].split(",").filter(x => x.length != 0);
function directions(ipt, x, y){
  var dir = ipt.substring(0,1)
  var how_m = parseInt(ipt.substring(1, ipt.length))
  if (dir == "R"){
    var x = x + how_m
  } else if (dir == "L"){
    var x = x - how_m
  } else if (dir == "U"){
    var y = y + how_m
  } else if (dir == "D"){
    var y =  y - how_m
  }
  var ret = {x : x, y : y};
  return ret
}

function get_out(vec){
  var out = {
    x: [0],
    y: [0]
  }
  for (var i= 0; i < vec.length; i++){
    var y_m_1 = out["y"][ out[["y"]].length - 1 ]
    var x_m_1 =  out["x"][ out[["x"]].length - 1 ]
    var res = directions(vec[i], x = x_m_1, y = y_m_1)
    out.x.push(res.x);
    out.y.push(res.y);
  }
  return out
}

var dir_f = get_out(first);
var dir_s = get_out(sec);

What do you think?