使用较少的代码进行脑筋急转弯

时间:2017-11-08 19:16:03

标签: r if-statement

这是我尝试编码的R问题的一个小小的预告片。

让我们说你桌子上有15根蜡烛。根据蜡烛是否已经点亮,您将在三个不同的回合中点亮给定的蜡烛或将它们放出。因此,如果给定的蜡烛已经点亮,那么您的行动就是将其推出。另一方面,如果蜡烛没有点亮,那么你的动作就是点亮它。

最初没有蜡烛点亮。

首先,你会点亮每一秒蜡烛,所以蜡烛数字2到14。

其次,你会点亮/熄灭每三个蜡烛。

最后,你会点亮/熄灭每五个蜡烛。

最后,我想知道哪些蜡烛点亮了。

我用两个变量创建了一个数据框。蜡烛的数量和二进制变量,说明蜡烛是否点亮。

我可以使用三个不同的if语句手动解决这个问题,但我想用更少的代码来完成。关于我如何做的任何建议?

2 个答案:

答案 0 :(得分:4)

这似乎有效。

candles <- vector(mode="logical", length=15)

for(i in c(2,3,5)){
  candles[1:15 %% i == 0] <- !candles[1:15 %% i == 0]
}

which(candles)
## 2  3  4  5  8  9 14

感谢Gregor建议对代码进行一些简化

答案 1 :(得分:3)

虽然@Alex提出了一个解决方案,但另一种方式(我认为)将重复采用集合的对称差异:

sym_diff <- function(x, y) union(setdiff(x, y), setdiff(y, x))

set1 <- seq(2, 14, 2)
set2 <- seq(3, 15, 3)
set3 <- c(5, 10, 15)

sort(sym_diff(sym_diff(set1, set2), set3))

[1]  2  3  4  5  8  9 14

我们还可以使用%>%包中的magrittr(管道)运算符来使代码更清晰,更易于理解:

library(magrittr) # load %>%
# use the %>% for cleaner code
set1 %>%
  sym_diff(set2) %>%
  sym_diff(set3) %>%
  sort()
[1]  2  3  4  5  8  9 14