如何在R中计算二进制字符串排列?

时间:2018-01-14 00:02:54

标签: r string binary permutation

我有一个像这样的二进制字符串:

0010000

我希望拥有所有这些排列:

1010000
0110000
0011000
0010100
0010010
0010001

有人知道R中的哪个功能可以给我这些结果吗?

3 个答案:

答案 0 :(得分:1)

我们假设问题是连续替换输入中的每个0,输入字符串为0和1。

使用"1"连续替换每个字符,无论其值如何,然后删除与输入相等的结果的任何组件。没有包使用。

input <- "0010000"

setdiff(sapply(1:nchar(input), function(i) `substr<-`(input, i, i, "1")), input)
## [1] "1010000" "0110000" "0011000" "0010100" "0010010" "0010001"

更新:已经完全修改了答案。

答案 1 :(得分:1)

library(stringr)   
bin <- '0010000'
ones <- str_locate_all(bin, '1')[[1]][,1]
zeros <- (1:str_length(bin))[-ones]
sapply(zeros, function(x){
str_sub(bin, x, x) <- '1'
bin
})
[1] "1010000" "0110000" "0011000" "0010100" "0010010" "0010001"

答案 2 :(得分:1)

R具有按位运算功能,因此我们可以使用bitwOr

获得所需的数字
bitwOr(16, 2^(6:0))
#> [1] 80 48 16 24 20 18 17

...或者如果我们想要排除原文,

setdiff(bitwOr(16, 2^(6:0)), 16)
#> [1] 80 48 24 20 18 17

但是,它只适用于十进制,而不是二进制。不过那没关系;我们可以构建一些转换函数:

bin_to_int <- function(bin){
    vapply(strsplit(bin, ''), 
           function(x){sum(as.integer(x) * 2 ^ seq(length(x) - 1, 0))}, 
           numeric(1))
}

int_to_bin <- function(int, bits = 32){
    vapply(int, 
           function(x){paste(as.integer(rev(head(intToBits(x), bits))), collapse = '')},
           character(1))
}

现在:

input <- bin_to_int('0010000')

output <- setdiff(bitwOr(input, 2^(6:0)),
                  input)

output
#> [1] 80 48 24 20 18 17

int_to_bin(output, bits = 7)
#> [1] "1010000" "0110000" "0011000" "0010100" "0010010" "0010001"