Advent of Code 2021-02 with R & JavaScript
Solving Advent of Code 2021-02 with R and JavaScript.
Like yesterday, trying to write JS code that looks like R code.
Disclaimer
Disclaimer Obviously, this post contains a big spoiler about Advent of Code, as it gives solutions for solving 2021-02.
[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.
bubble::set_node_engine()
Instructions
One
- We start at a position [0, 0] (horizontal, depth), then
- forward X increases the horizontal position by X units
- down X increases the depth by X units
- up X decreases the depth by X units
Result is horizontal * depth.
Two
- We start at a position [0, 0, 0] (horizontal, depth,), then
- down X increases your aim by X units
- up X decreases your aim by X units
- forward X does two things :
- It increases your horizontal position by X units
- It increases your depth by your aim multiplied by X
Result is horizontal * depth.
Find the complete instructions at: https://adventofcode.com/2021/day/2.
Reading inputs
# Read
ipt <- read.delim("2021-02-aoc.txt", header = FALSE)$V1
const fs = require('fs')
var ipt = fs.readFileSync("2021-02-aoc.txt", 'utf8').split("\n").filter(x => x.length != 0);
Part one
R solution
# Horizontal and depth
start_pos <- c(horizontal = 0, depth = 0)
for (moves in ipt) {
move <- strsplit(moves, " ")[[1]]
if (move[1] == "up") {
start_pos[2] <- start_pos[2] - as.numeric(move[2])
}
if (move[1] == "down") {
start_pos[2] <- start_pos[2] + as.numeric(move[2])
}
if (move[1] == "forward") {
start_pos[1] <- start_pos[1] + as.numeric(move[2])
}
}
start_pos[1] * start_pos[2]
## horizontal
## 1727835
JS solution
var start_pos = [0, 0]
// Gotcha: R for(x in y) is JS for(x of y)
for (moves of ipt) {
// In JS, object have methods, so the split function
// is containes inside the string object
move = moves.split(' ')
// Small gotcha here, JS i 0 based index
if (move[0] == "up") {
// R as.numeric is parseInt()
start_pos[1] = start_pos[1] - parseInt(move[1])
}
if (move[0] == "down") {
start_pos[1] = start_pos[1] + parseInt(move[1])
}
if (move[0] == "forward") {
start_pos[0] = start_pos[0] + parseInt(move[1])
}
}
start_pos[0] * start_pos[1]
## 1727835
Part two
R solution
# Horizontal, depth, and aim
start_pos <- c(horizontal = 0, depth = 0, aim = 0)
for (moves in ipt) {
move <- strsplit(moves, " ")[[1]]
if (move[1] == "up") {
start_pos[3] <- start_pos[3] - as.numeric(move[2])
}
if (move[1] == "down") {
start_pos[3] <- start_pos[3] + as.numeric(move[2])
}
if (move[1] == "forward") {
start_pos[1] <- start_pos[1] + as.numeric(move[2])
start_pos[2] <- start_pos[2] + (start_pos[3] * as.numeric(move[2]))
}
}
start_pos[1] * start_pos[2]
## horizontal
## 1544000595
JS solution
var start_pos = [0, 0, 0]
for (moves of ipt) {
move = moves.split(' ')
if (move[0] == "up") {
start_pos[2] = start_pos[2] - parseInt(move[1])
}
if (move[0] == "down") {
start_pos[2] = start_pos[2] + parseInt(move[1])
}
if (move[0] == "forward") {
start_pos[0] = start_pos[0] + parseInt(move[1])
start_pos[1] = start_pos[1] + (start_pos[2] * parseInt(move[1]))
}
}
start_pos[0] * start_pos[1]
## 1544000595
What do you think?