Advent of Code 2020

11.R 2.3KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. library(stringr)
  2. input <- str_split(readLines("input11.txt"), "", simplify=TRUE)
  3. input <- ifelse(input == ".", 0, ifelse(input == "L", -1, 1))
  4. di <- dim(input)
  5. adj <- as.matrix(expand.grid(-1:1, -1:1))[c(1:4, 6:9), 1:2]
  6. getadj <- function(x, state) {
  7. apply(adj, 1, function(a) {
  8. n <- a + x
  9. ifelse(any(n > di) || any(n < 1), 0, state[n[1], n[2]])
  10. })
  11. }
  12. getnext <- function(state) {
  13. t(sapply(1:nrow(state), function(x) {
  14. sapply(1:ncol(state), function(y) {
  15. cv <- state[x, y]
  16. if (cv == 0) {
  17. return(0)
  18. }
  19. av <- getadj(c(x, y), state)
  20. if (cv == -1 && sum(av == 1) == 0) {
  21. return(1)
  22. }
  23. if (cv == 1 && sum(av == 1) >= 4) {
  24. return(-1)
  25. }
  26. return(cv)
  27. })
  28. }))
  29. }
  30. last <- 0
  31. cur <- input
  32. while (!identical(cur, last)) {
  33. last <- cur
  34. cur <- getnext(cur)
  35. print(sum(cur == 1))
  36. }
  37. getadj2 <- function(x, state) {
  38. apply(adj, 1, function(a) {
  39. f <- 0
  40. while (TRUE) {
  41. f <- f + 1
  42. n <- a*f + x
  43. if (any(n > di) || any(n < 1)) {
  44. return(0)
  45. }
  46. tv <- state[n[1], n[2]]
  47. if (tv != 0) {
  48. return(tv)
  49. }
  50. }
  51. })
  52. }
  53. getnext2 <- function(state) {
  54. t(sapply(1:nrow(state), function(x) {
  55. sapply(1:ncol(state), function(y) {
  56. cv <- state[x, y]
  57. if (cv == 0) {
  58. return(0)
  59. }
  60. av <- getadj2(c(x, y), state)
  61. if (cv == -1 && sum(av == 1) == 0) {
  62. return(1)
  63. }
  64. if (cv == 1 && sum(av == 1) >= 5) {
  65. return(-1)
  66. }
  67. return(cv)
  68. })
  69. }))
  70. }
  71. last <- 0
  72. cur <- input
  73. while (!identical(cur, last)) {
  74. last <- cur
  75. cur <- getnext2(cur)
  76. print(sum(cur == 1))
  77. }