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 "}"

revdigitsそのままでは、数字の順序を逆にして、数字を文字列に変換します。

> 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 に答える