R과 함께 코드 2020-03의 출현

9306 단어 adventofcoderstats
R로 코드 2020-03의 출현 해결

[면책 조항] 분명히 이 게시물에는 Advent of Code에 대한 큰 스포일러가 포함되어 있습니다.

지침



1 단계


  • 입력은 지도(x, y)이며, 여기서 .는 정사각형, #는 나무입니다.
  • 우리는 이 방법으로 이동할 수 있습니다: 3 오른쪽(x + 3), 1 아래(y - 1).
  • y는 무한정 반복됩니다.
  • 왼쪽 상단 모서리에서 시작합니다(좌표 x = nrow(map), y = 1).
  • x == 1에 도달할 때까지 이동합니다. 즉, nrow(map) 단계를 수행합니다.
  • 길을 따라 얼마나 많은 나무#를 만났습니까?

  • 2 단계



    이것을 반복하되 단계 스키마를 수정하십시오.

    전체 지침은 https://adventofcode.com/2020/day/3 에서 찾으십시오.

    R 솔루션



    1부




    library(purrr)
    
    n_trees <- function(
      by_x = 1, 
      by_y = 3
    ){
      ipt <- read.delim( "2020-03-aoc.txt", header = FALSE, stringsAsFactors = FALSE)
      # Building the path
      # x need to go from 1 to nrow(ipt), 1 by 1
      x <- seq(1, nrow(ipt), by = by_x)
      # y needs to start at 1, and go by 3 steps until we have length(x) steps
      y <- seq(1, by = by_y, length.out = length(x))
      list(
        x = x, 
        y = y
      ) %>%
        pmap_dbl(~ {
          # Which x step are we in?
          row <- ipt[..1,] 
          # If the row isn't wide enough, expand it until it is
          # There is probably a better way to do that but I'm not 
          # sure I want to spend 5 minutes trying stuff that will
          # save me half a micro second
          while(nchar(row) < ..2){
            row <- paste0(row, row)
          }
          # Split the damn thing
          row <- strsplit(row, "")[[1]]
          # look for the y, is it a tree?
          if (row[..2] == ".") return(0)
          if (row[..2] == "#") return(1)
        }
        ) %>% sum()
    }
    n_trees()
    
    ## [1] 278
    


    두 번째 부분




    data.frame(
      x = c(1, 1, 1, 1, 2),
      y = c(1, 3, 5, 7, 1)
    ) %>%
      pmap_dbl(~ n_trees(..1, ..2)) %>%
      reduce(`*`)
    
    ## [1] 9709761600
    

    좋은 웹페이지 즐겨찾기