创建一个基本的R骰子滚动函数来求和骰子值
我正在尝试编写一个函数,根据骰子上显示的数字,将最多4个(公平的6面)掷骰子组合起来,尽可能多地创建一个特定的值(名为“target.mountain”) 然后返回这些值以及在所述组合中未使用的任何值。如果不用于形成“target.mountain”的其他数字的总和可以在范围(5-10)内,那么就这样做 比如说,我掷4,3,2,5,我的目标值是9 我愿意 4+5->9,当2+3=5时,我的函数将返回9,5 另一个例子可能是 滚动=(2,3,6,4)-->(6+3),(4+2)-->9,6 一旦找到这些值,然后列出,使其看起来像 [1] 9、5(示例1) [1] 9、6(示例2) 我该怎么做呢创建一个基本的R骰子滚动函数来求和骰子值,r,dice,combn,R,Dice,Combn,我正在尝试编写一个函数,根据骰子上显示的数字,将最多4个(公平的6面)掷骰子组合起来,尽可能多地创建一个特定的值(名为“target.mountain”) 然后返回这些值以及在所述组合中未使用的任何值。如果不用于形成“target.mountain”的其他数字的总和可以在范围(5-10)内,那么就这样做 比如说,我掷4,3,2,5,我的目标值是9 我愿意 4+5->9,当2+3=5时,我的函数将返回9,5 另一个例子可能是 滚动=(2,3,6,4)-->(6+3),(4+2)-->9,6 一旦找
如果你曾经玩过“山羊”棋盘游戏,那么这可能会让我明白我需要骰子是如何工作的,因为我就是想不出来 问题的可能解决方案
target.mountain=9
掷骰子让我们把问题弄难一点,比如说5个骰子
library(tidyverse)
rolls <- sample(1:6,replace = TRUE, size = 5)
target.mountain <- 7
#Make all possible combinations of the dice:
map_dfr(seq_along(rolls),~ combn(seq_along(rolls),.x,simplify = FALSE) %>%
map(~tibble(dice = list(.), sum = sum(rolls[.]), rolls = list(rolls[.]),length = length(.)))) %>%
#filter to only those combinations which equal the target
filter(sum == target.mountain) %>%
#Now make all possible combinations of the sets that equal the target
{map2(.x = list(.), .y = nrow(.) %>% map(.x = seq(.), .f = combn,x=.,simplify = FALSE) %>% unlist(recursive = FALSE),
~.x[unlist(.y),])} %>%
#Subset to non-overlapping sets
subset(map_lgl(.,~length(reduce(.x$dice,union))==length(unlist(.x$dice)))) -> part1
map(part1, as.data.frame)
#[[1]]
# dice sum rolls length
#1 1, 3 7 3, 4 2
#
#[[2]]
# dice sum rolls length
#1 4, 5 7 6, 1 2
#
#[[3]]
# dice sum rolls length
#1 2, 3, 5 7 2, 4, 1 3
#
#[[4]]
# dice sum rolls length
#1 1, 3 7 3, 4 2
#2 4, 5 7 6, 1 2
为什么不返回同样有效的4+3+2==9,5
,但是我想用尽可能少的数字组合来创建目标值,因此理想情况下我想组合2而不是组合3这太棒了!老实说,这件事我已经坚持了好几天了。无法解释这会有多大帮助,因为我不知道该去哪里。现在,我必须返回的值只有在范围(5-10)内时才有用。既然您已经帮助我获得了所需的值,那么有没有一种方法可以组合“剩余”数(不是==target.mountain的数)以便它们可以使用呢?你能澄清一下这是否有意义吗?看看@Ian Campbell的答案,这是一个更大的versatileNo问题,不管怎样,非常感谢你的帮助!如果我的回答对你有帮助,我很高兴。这也很好,非常感谢你的帮助。但是,如何从地图中提取值,使其以列表格式显示?只是list()?奇怪的是,这里有一个函数dplyr::pull
,你可以使用part2%>%pull(rolls)
,这将产生一个列表。你是个英雄,真的救了我一命。非常感谢你!对不起,第二个问题,我想你不能再帮我了吧?现在我知道了哪些骰子是用来组合得到target.mountain的。我如何返回()列表中未与target.mountain值一起使用的其他骰子?我已经玩了一个小时左右了。一直遇到这个错误,不知道如何修复它。错误:.x
为空,且未提供任何.init
part1 %>%
#subset to the largest number of sets
subset(map_dbl(.,nrow) == max(map_dbl(.,nrow))) %>%
#subset to the fewest number of total dice
subset(map_dbl(.,~sum(.x$length)) == min(map_dbl(.,~sum(.x$length)))) %>%
#if there are still ties, pick the first
`[[`(1) -> part2
as.data.frame(part2)
# dice sum rolls length
#1 1, 3 7 3, 4 2
#2 4, 5 7 6, 1 2