Day 2: 1202 Program Alarm

Reference

Part One

library(tidyverse)

input <- read_lines(file = "inputs/2019/02.txt") |> 
    str_split_1(pattern = ",") |> 
    as.integer()

input[1 + 1] <- 12
input[2 + 1] <- 2

# starting position
pointer <- 0 + 1

repeat{
    if (input[pointer] == 99) break
    
    # get values (1st value = noun, 2nd value = verb)
    noun <- input[input[pointer + 1] + 1]
    verb <- input[input[pointer + 2] + 1]
    
    # target location
    target_pointer <- input[pointer + 3] + 1
    
    # replace value
    if (input[pointer] == 1) 
        input[target_pointer] <- noun + verb
    
    else if (input[pointer] == 2)
        input[target_pointer] <- noun * verb
    
    # update pointer
    pointer <- pointer + 4
}

cat(input[1])
## 3562624

Part Two

# create a function
output <- function(input){
    # starting position
    pointer <- 0 + 1
    
    repeat{
        if (input[pointer] == 99) break
        
        # get values (1st value = noun, 2nd value = verb)
        noun <- input[input[pointer + 1] + 1]
        verb <- input[input[pointer + 2] + 1]
        
        # target location
        target_pointer <- input[pointer + 3] + 1
        
        # replace value
        if (input[pointer] == 1) 
            input[target_pointer] <- noun + verb
        
        else if (input[pointer] == 2)
            input[target_pointer] <- noun * verb
        
        # update pointer
        pointer <- pointer + 4
    }
    
    return(input[1])
}

# search for noun and verb
for (noun in 0:99) {
    for (verb in 0:99) {
        input <- read_lines(file = "inputs/2019/02.txt") |> 
            str_split_1(pattern = ",") |> 
            as.integer()
        
        input[1 + 1] <- noun
        input[2 + 1] <- verb
        
        if (output(input) == 19690720) cat(100 * noun + verb)
        
    }
}
## 8298