0

我正在尝试反转和反转以查看数字是否在数字颠倒时相同

我走到这一步,我很困惑......

revdigits = 
function(n) {
    sapply(lapply(strsplit(as.character(n),""),rev),paste,collapse="")  
}
    for(i in 1:length(n)){
        n[i]=
        if(n[i]==0) 0
        else if(n[i] == 1) 1
        else if(n[i] == 6) 9
        else if(n[i] == 8) 8
        else if(n[i] == 9) 6
        else -1 
    }

invertible=
function(n)

n[1] == revdigits(n[1])

反正有没有把它们放在一起(或把它们联系起来)来生产

invertible(c(99, 123, 1691))

[1] FALSE FALSE TRUE

这个结果??

4

2 回答 2

3

你已经apply在你的代码中使用了,所以我可能误解了这个问题,但我想答案是

> invertible = function(n) sapply(n, function(x) x == revdigits(x))
> invertible(c(99, 123, 1691))
[1]  TRUE FALSE FALSE

revdigits这提醒了我们一个不太正常的事实。很难说出您打算做什么,因为您的代码原样不包括函数中的 for 循环并且存在语法错误:

> revdigits = 
+ function(n) {
+     sapply(lapply(strsplit(as.character(n),""),rev),paste,collapse="")
+ }
> 
> 
>     for(i in 1:length(n)){
+         n[i]=
+         if(n[i]==0) 0
+         else if(n[i] == 1) 1
+         else if(n[i] == 6) 9
+         else if(n[i] == 8) 8
+         else if(n[i] == 9) 6
+         else -1 
+         }
Error: object 'n' not found
> }
Error: unexpected '}' in "}"

revdigitsas is 只是简单地颠倒数字顺序并将数字转换为字符串:

> revdigits(c(123,69))
[1] "321" "96" 

要了解它是如何做到的,让我们看看sapply看起来不是你自己写的,用一个简单的例子从里到外分析:

> n <- 69
> as.character(n)
[1] "69"
> strsplit(as.character(n),"")
[[1]]
[1] "6" "9"    
> lapply(strsplit(as.character(n),""),rev)
[[1]]
[1] "9" "6"
> sapply(lapply(strsplit(as.character(n),""),rev),paste,collapse="")
[1] "96"

所以你的循环看起来应该在最后一步之前应用于数字向量。将你的循环打包成一个函数:

rotate = function(n) { 
    for(i in 1:length(n)){
      n[i]=
        if(n[i]==0) 0
      else if(n[i] == 1) 1
      else if(n[i] == 6) 9
      else if(n[i] == 8) 8
      else if(n[i] == 9) 6
      else -1 
    }
  n
}

测试:

> rotate(0:9)
 [1]  0  1 -1 -1 -1 -1  9 -1  8  6

并申请revdigits

revdigits = function(n) {
    sapply(lapply(lapply(strsplit(as.character(n),""),rev),rotate),paste,collapse="") 
}

我们得到了一些似乎有效的东西:

> revdigits(69)
[1] "69"
> revdigits(99)
[1] "66"

更好的是,它已经适用于向量!

> n <- c(99, 123, 1691)
> revdigits(n)
[1] "66"    "-1-11" "1691" 
> invertible <- function(n) n == revdigits(n)
> invertible(n)
[1] FALSE FALSE  TRUE

根本不需要使用索引。

于 2012-08-23T05:29:33.663 回答
1

我的尝试:

    invertible <- function(n){
      nd <- unlist(strsplit(as.character(n),split=""))
        if (all(nd %in% c("0","1","6","9","8"))){
          n == as.integer(paste(rev(sapply(nd, function(x){
                                            ifelse(!x %in% c("9","6"),x,
                                                    ifelse(x == "9","6","9"))
                                        })), collapse=""))
        } else {
          FALSE
      }
   }

sum(sapply(1:1e6, invertible))
# 198

编辑:您可以将 sapply() 仍然放在里面:

invertible <- function(N){
  sapply(N, function(n){
            nd <- unlist(strsplit(as.character(n),split=""))
            if (all(nd %in% c("0","1","6","9","8"))){
                n == as.integer(paste(rev(sapply(nd, function(x){
                                                    ifelse(!x %in% c("9","6"),x,
                                                            ifelse(x == "9","6","9"))
                                                })), collapse=""))
            } else {
                FALSE
            }                
        })

}
于 2012-08-23T06:00:08.070 回答