mem <- c(15, 17, -1, 17, -1, -1, 16, 1, 
         -1, 16, 3, -1, 15, 15, 0, 0, 
         -1, 72, 101, 108, 108, 111, 44, 
         32, 119, 111, 114, 108, 100, 
         33, 10, 0)

getFromMemory <- function(addr) { mem[[addr + 1]] } 
setMemory <- function(addr, value) { mem[[addr + 1]] <<- value }
subMemory <- function(x, y) { setMemory(x, getFromMemory(x) - getFromMemory(y)) }

instructionPointer <- 0
while (instructionPointer >= 0) {
  a <- getFromMemory(instructionPointer)
  b <- getFromMemory(instructionPointer + 1)
  c <- getFromMemory(instructionPointer + 2)
  if (b == -1) {
    cat(rawToChar(as.raw(getFromMemory(a))))
  } else {
    subMemory(b, a)
    if (getFromMemory(b) < 1) {
      instructionPointer <- getFromMemory(instructionPointer + 2)
      next
    }
  }
  instructionPointer <- instructionPointer + 3
}