Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建一个基本的R骰子滚动函数来求和骰子值_R_Dice_Combn - Fatal编程技术网

创建一个基本的R骰子滚动函数来求和骰子值

创建一个基本的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 一旦找

我正在尝试编写一个函数,根据骰子上显示的数字,将最多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)

我该怎么做呢


如果你曾经玩过“山羊”棋盘游戏,那么这可能会让我明白我需要骰子是如何工作的,因为我就是想不出来

问题的可能解决方案

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